{"assessments":[],"deployments":[{"attestationHash":"f39e82e41ece2f04fa845162c7905ca07143cfa36ac989253bd79027394f5af9","chainId":1,"contracts":[{"address":"0xd0c0d97aebe9194606bcc46ce56524eee4615543","blockNumber":26178192,"name":"MarginaliaAnnex","role":"other","txHash":"0xd7a3ab9c6eec356c6655a6c70f36cc4810116672799403e30ca4510431442103"}],"id":"2ecfd0a2-799a-4d19-97d5-36c22d7f7482","manifestHash":"9149cc0e29946f8f1525641ccca3c17c8f9dc14fc1b0abd8a551f7e2d1e9c4ab","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":"ceb82ab3-93fd-4157-8deb-3768fd95ff9a","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"e33df0e0d819a4709c434df20d9e076b97300d643e3d552faa1e6ca2dd1ed4f0","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":"cfc87a3f342520cb64e822b2b226bba900db63a12cdcf3fd2d64f83803943e4c","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":"8e53b04d36538567c2c353731da350b0936f9de48a3fe8c3cf56f47c11d2d959","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":"1c23c71b11cd9d002cef9147ac457446ade373dce3cc4b2167651ee14db8d567","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":"af1a65903cc6ae8cbabe25a1a1819df875823506cae90da43325ead77c9e9545","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":"d553d8d215df7a514f8ab289f96548691412c0d2eaa3beaf30329c69077b4833","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":"21e9a08a8932fb51ec0f8c4995c1a1630aaab74fb50613814300e1da593dc7e1","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":"3a68daf16509996ae132808ee1cf74885a1153ee73b1e1a50a59eabb3d4835fa","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"fbcf15f9978f0faf1f61a7219a5b0de5728575ac31ab3d146317a2e992480623","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 MarginaliaAnnex (src/MarginaliaAnnex.sol) on Ethereum mainnet: ONE contract, constructor (address hook, address intake, bytes32 action, address signer) = (0xf0457dd0cf526686190e4f057ba19db14d34a0cc the live MarginaliaHook of launch 1283, 0x1397434cd35e8a9C8aC312A61D3A285EB31dea56 the IdentityMD Intake, bytes32('oracle.request@oracle-1') the oracle action, 0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982 the IdentityMD oracle signer) — the same constants the live hook holds as INTAKE, ACTION and ORACLE_SIGNER. What it is: Marginalia calls (falsifiable price calls with a bond) on the Uniswap v4 pools the hook's immutable router cannot accept. The router admits a v4 pool only when its hook is none or ours; every IMD custom_token launch pool carries the factory's PoolInitializationGuard hook 0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000 (address bits 0x2000, beforeInitialize only), so a call on any launched token's pool was refused. VENUE RULE (no owner): a live v4 pool with X on one side and IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 / WETH / native on the other whose hook is (1) none or the Marginalia hook, or (2) has NO swap permission bits (BEFORE_SWAP, AFTER_SWAP, BEFORE_SWAP_RETURNS_DELTA, AFTER_SWAP_RETURNS_DELTA, read from the address as v4 defines them: such a hook cannot touch a swap, which admits the IMD guard by arithmetic; EXCEPT a dynamic-fee pool, key.fee == 0x800000, whose hook sets the LP fee with no permission bit and could freeze the price with a 100% exact-input fee: dynamic-fee pools pass only with the Marginalia hook or an admitted hook), or (3) was admitted by the IDENTITYMD ORACLE PANEL: anyone calls requestAdmission(address[] hooks), 1 to MAX_ADMISSION_LIST 4 hooks each with code, paying the Intake's current price for oracle.request@oracle-1 (refused above MAX_PRICE 1 IMD); the contract builds the question itself (admissionBody: the subset of hooks that keep their pools OPEN — any caller may swap, no allowlist, selective refusal or selective pause, and the pool price moves only through swaps and liquidity changes any caller may make; a fixed fee or tax charged to every trader alike does not exclude a hook, an owner-settable fee, a global pause or an upgrade path does; answerType address[], evidence panel, head = list length, panelSize 5, quorum 4, guards.allow = the list, consumer = this contract) and buys one answer with callback onOracleResult, which accepts only the Intake, verifies the EIP-712 attestation against the signer (OracleAttestationConsumer, domain IdentityMD Oracle v2), requires chainId == block.chainid, agreed >= quorum >= 4 and panelSize >= 5, consumes the request id once, and sets admittedHook only for hooks that were BOTH asked about AND named; admission is permanent. ECONOMICS: post(params, v4Key, bond, minMargOut, deadline) pulls STAMP 0.1 + MARG_BUY 0.25 + bond (BOND_MIN 0.25 <= bond <= BOND_MAX 10) in IMD from the author; one quiet swap of 0.35 IMD on the hook's own MARG/IMD pool through the hook's PoolManager (unlockCallback accepts only the PoolManager): the 0.25 share of the MARG goes to the author (minMargOut bounds it), the 0.10 share is sent to 0x000000000000000000000000000000000000dEaD (Burned event); the bond is held as IMD. Same rules as the hook: targetBps >= 10% from par on the call's side (0 = thesis is refused here), horizon 1-90 days, text 1-280 bytes, class Agent when the author has code else Declared, its own checkpointVenue price windows through the immutable stateless MarginaliaPricer at 0xEaff9B262341A0cB05579227e662BFE768A71cfb (first checkpoint at least one hour and at most six hours old), observe(id) in [horizonEnd, +6h] (3 to 16 readings, 20 blocks apart, spanning an hour, a later reading may replace the last only when more adverse), hold rule on BUY (author's X balance at every observation >= post balance, a failed balanceOf counts as not held), settle(id) after the window: each v4 observation priced alone through the pricer, the most adverse decides, RIGHT returns the bond via claimDeposit, WRONG / VOID_SOLD forfeit it to the hook's pools through hook.fundPot with KEEPER_BPS 10% to the settler, VOID_NODATA returns it and scores as wrong, retract(id, text) before the horizon forfeits the whole bond and scores at minus half; score is difficulty-weighted reputation only (pricer.difficulty with mcap = postPrice x X.totalSupply), nothing pays for being right. A counter-call (parentId) may target an open call on this contract or on the hook (read-only through hook.noteOf; an id unknown to both is refused), same X, opposite side, not the author's own. Its own noteCount, ids keccak(annex, n), records(wallet) {score, posted, right, wrong, broken, retracted}; reads noteOf, venueOf, observationsOf. No seals and no theses (hook features), no v3/v2 venues (the router has them), no owner, no pause, no upgrade, nonReentrant on post/settle/retract/claim/admission/callback. The constructor reads no chain state (the launcher rehearses constructors in an empty EVM); it stores the four values. Runtime 23.9 KB: keep it under EIP-170. Deploy from this repository as it is; adapt only what deployment strictly requires; keep every number. Tests: forge test --match-path test/Annex.t.sol (17 tests against the local hook, a guard-shaped hook etched at a 0x2000-bit address, a local Intake mock and an EOA signer, incl. the 200k callback stipend at the full 4-hook list, replay/tamper refusals, the 25:10 author/burn split, a held BUY call on the MARG pool settling RIGHT, and the dynamic-fee refusal). An independent adversarial review before this launch found and fixed a double-counted post balance on the MARG venue and the dynamic-fee loophole; the callback measures ~171k gas at the full list, so the callback's write-set must not grow.","parentJobId":null,"planHash":"a1358f9b4def674f0b43a6aec5ab92e69ba659b1075f7c51e2cabf328e4d8d27","previousHash":"b2873a8770fc2e9285d6cf70ac5183b3f12ed9fda98955a471a343187a87a6ab","projectId":"ceb82ab3-93fd-4157-8deb-3768fd95ff9a","publication":{"commit":"a0154db168b6630b74ba8e1dfefb373a598b65db","deliveredAt":"2026-10-12T18:23:44.090Z","repoUrl":"https://github.com/identity-md-launches/launch-1384-src-marginaliaannex-sol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"a6f66f49d6dc61659c5bef45dcd3078b57f91266672689b0ba96cb82922ea91e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"723b11f958c65250","findings":[{"citation":"resolved","description":"Merged from audit_math (high) and audit_permissions (low): one root cause. observe(id) is open to anyone, reads the venue's slot0 through the pricer's extsload-based StateLibrary read, and nothing requires the PoolManager to be locked, so it can be called from inside a stranger's own unlock between two swaps. A reading more adverse than the last always lands (lines 320-331: it either pushes a new slot or replaces the last one when `_moreAdverse`), and no later honest reading ever displaces it (replacement is only ever by something MORE adverse). _settlementPrice (line 433) then keeps the single most adverse priced observation. The pricer's documented guarantee (MarginaliaPricer.sol:32-38, 'a pump must be held for the whole span', 'a two-block pump-observe-unwind moves neither rule') therefore holds only against the author; against the author one atomic dump -> observe -> rebuy inside a single PoolManager unlock is enough. No block passes, no arbitrageur can trade in between, the price is restored in the same transaction and the attacker's only cost is the LP fee of the round trip, which on the thin launched-token pools the Annex exists for is small against the KEEPER_BPS cut of a bond up to 10 IMD. Outcome: the author's bond (0.25-10 IMD) goes 90% to the hook's pools and 10% to the attacker who settles, and the author's record takes -difficulty, for a call the market confirmed at every real block. The live hook carries the same lines (MarginaliaHook.sol:536-563, 658-676) and the brief copies its rule ('the most adverse decides'), so this is an inherited rule the Annex now extends to every guarded pool; it is a defect because the pricer's stated guarantee and the brief's 'same scoring' promise are broken in the only direction that moves money. Fix shapes that keep the rule: refuse an observation while the PoolManager is unlocked (read the Lock transient slot with exttload: ~60 bytes of the 283 left under EIP-170) so a dumped reading has to survive at least one block, and/or make the deciding price the second-most-adverse (or median) of the stored readings rather than the single extreme.","line":433,"path":"src/MarginaliaAnnex.sol","reproduction":"Local harness (self-contained in the proof): X/IMD v4 pool behind a 0x2000-bit guard hook at 1:1, 10M liquidity, fee 3000; alice holds 1000 X; venue checkpointed an hour earlier. (1) alice: annex.post(BUY, targetBps 12000, horizon 1 day, bond 2 IMD) -> postPrice 1.000000e18. (2) bob buys X with 1.5M IMD: spot 1.321465e18 (+32%) and stays. (3) Three honest observe(id) at horizonEnd, +30min/+25 blocks, +61min: xRead 1.321465e18 each. (4) 25 blocks later, still inside the window, an attacker contract in ONE manager.unlock: swap 4,000,000 X in, annex.observe(id) (recorded as a 4th slot at xRead ~0.62e18), swap the IMD received back into X, settle the net 20,211 X (the round-trip fee); spot after the transaction 1.318974e18 (within 0.2%). (5) A later honest observe does not displace the reading. (6) After horizonEnd + 6h the attacker calls settle(id). Expected: status Right (1), deposit 2 IMD still claimable, nothing to the attacker. Actual: status Wrong (2), 0.2 IMD transferred to the attacker, 1.8 IMD to hook.fundPot, claimDeposit would revert NothingToClaim. test/scratch/AnnexFlashAdverse.t.sol fails with 'right at every real block: 2 != 1'.","severity":"high","snippet":"                if (i == 0 || (buy ? p < price : p > price)) price = p;","title":"One atomic dump-observe-restore inside the settlement window forfeits a RIGHT v4 call and pays the manipulator 10%"},{"citation":"resolved","description":"Merged from audit_economics (medium) and write_foundry_tests (low). observe() prices the venue through pricer().observe -> _spotInQuote, which reverts EmptyPool when manager.getLiquidity(poolId) == 0 (MarginaliaPricer.sol:236), so while the pool has no in-range liquidity no observation can be recorded by anyone. settle() then takes the `count < OBS_MIN` branch (line 344), books VoidNoData, never reaches the hold check or _forfeit, and claimDeposit returns the bond. Zeroing in-range liquidity for the six-hour window needs no price control: the LP removes its position at horizonEnd and re-adds it afterwards (or, on a thin pool, the tick is pushed past every position). The Annex's venues are by construction single-LP launched-token pools, and the brief invites projects to post on their own token, so the author or an ally holding all the liquidity is the common case; it is also exactly the state of a rugged token, the case where a BUY call is most wrong and the contract cannot punish it. The author still takes the -difficulty score, but the economic forfeit (90% to the pools, 10% to the settler) is avoided at zero cost. The hook has the same rule, but on its only venue liquidity is many-handed. Fix shape that keeps every number: let observe record an 'unobservable' reading when the pricer reverts EmptyPool on a venue that had liquidity at post, and treat such a reading as adverse at settle (or as VoidSold), so fewer-than-three readings caused by an emptied pool forfeit rather than refund; keep the refund for genuine no-observer VoidNoData.","line":344,"path":"src/MarginaliaAnnex.sol","reproduction":"Harness as in finding 1 (test/scratch/AnnexMediums.t.sol::testEmptiedVenueTurnsAWrongCallIntoVoidNoData, passes on this tree, i.e. confirms the behaviour). alice: annex.post(BUY, 12000, 1 day, bond 10 IMD); price never moves. At horizonEnd the LP calls modifyLiquidity(-10,000,000e18) on [-6000, 6000] -> getLiquidity == 0; annex.observe(id) reverts MarginaliaPricer.EmptyPool at horizonEnd and again 3 hours later. At horizonEnd + 6h + 1 the LP re-adds the position; bob: annex.settle(id). Expected: Wrong, pools +9 IMD, bob +1 IMD, claimDeposit reverts. Actual: status VoidNoData (4), pools unchanged, alice: claimDeposit(id) returns 10 IMD.","severity":"medium","snippet":"        if (count < OBS_MIN || obs[count - 1].timestamp - obs[0].timestamp < OBS_MIN_SPAN) {","title":"Whoever controls a venue's in-range liquidity turns a WRONG (or sold) call into VoidNoData and recovers the whole bond"},{"citation":"resolved","description":"Merged from audit_math (medium), audit_flow (low) and audit_economics 'pump-checkpoint-unwind' (low): one root cause, the baseline is max(window.xMax, current spot) for BUY / min(xMin, spot) for SELL (MarginaliaPricer.postPrice line 147) where every input is a single-transaction spot reading, and post(params, v4Key, bond, minMargOut, deadline) lets the author bound the MARG leg and the time but not the baseline. Path A (sandwich): a pump landed before the post in the same block (public mempool or bundle) is recorded as n.postPrice after the funds are pulled; the dump lands right after; the call is judged against a price the market never held outside that block and settles WRONG with the bond forfeited (10% to the sandwicher if they settle). Path B (window): checkpointVenue is permissionless and folds the current spot into xMax/xMin without resetting startedAt, so swap -> checkpointVenue -> unwind in one transaction raises every BUY baseline on the venue for the rest of the six-hour window, which cannot be reset while live; repeated each window it keeps a venue unpostable for the round-trip fee. The hook's router shares the shape but offers seal() to fix the baseline earlier; the Annex deliberately has no seals, so an Annex author has no way to protect the baseline. Impact: loss of the bond (up to 10 IMD) for a griefing cost of two LP fees on a thin pool (Path A), or denial of posting on a venue (Path B). Fix shape: a baseline bound parameter checked right after line 274 (maxBaseline for BUY, minBaseline for SELL, as minMargOut bounds the MARG leg), and/or exclude same-block readings from the baseline (the window already demands block.number > w.blockNumber for the post itself).","line":274,"path":"src/MarginaliaAnnex.sol","reproduction":"Harness as in finding 1 (test/scratch/AnnexMediums.t.sol::testSameBlockPumpBeforeThePostSetsAnUnreachableBaseline, fails on this tree with 'right against any real baseline: 2 != 1'). honest annex.postPrice(v, true) == 1.000000e18. One block: bob buys X with 1.5M IMD; alice: annex.post(BUY, 12000, 1 day, bond 2 IMD) -> noteOf(id).postPrice == 1.321465e18; bob sells all his X back -> spot 1.000781e18. Then the market rises for real (+25% over the honest baseline) and three honest observations across an hour read it. settle(id): expected Right (1); actual Wrong (2), 1.8 IMD to the pools, 0.2 IMD to the settler. Path B measured by audit_economics: swap 3M IMD in -> checkpointVenue -> swap back leaves postPrice(v, true) == 1.6877e18 on a window that stays live for up to six hours.","severity":"medium","snippet":"        n.postPrice = postPrice(v, p.side == T.Side.Buy);","title":"The post baseline is the posting block's own spot with no author-side bound: a same-block pump (sandwich) or a pump-checkpoint-unwind makes a BUY call unwinnable"},{"citation":"resolved","description":"audit_economics (low), reproduced by inspection: settle pays KEEPER_BPS of a forfeited bond to msg.sender (line 371 and 374 via _forfeit line 411) with no exclusion of n.author and no priority window for third parties once the settlement window closes. An author whose call is wrong calls settle first and takes 10% of their own bond back; the pools receive 90% of what the brief calls the forfeited bond. retract (100% to the pools) is thereby strictly dominated on money. Bounded at 1 IMD per note; the live hook has the same shape, so this is a design note rather than a deviation, but it should be stated or closed (e.g. reward = 0 when msg.sender == n.author).","line":371,"path":"src/MarginaliaAnnex.sol","reproduction":"alice: annex.post(BUY, 12000, 1 day, bond 10 IMD); three spaced observations with the price unchanged; at horizonEnd + 6h + 1 alice calls annex.settle(id). Expected per the brief: the wrong bond forfeited to the pools with the keeper cut to an independent settler. Actual: status Wrong, alice's IMD rises by 1 IMD, the pools receive 9 IMD.","severity":"low","snippet":"            _forfeit(n, msg.sender);","title":"The author may settle their own forfeit and keep the 10% keeper cut, so a WRONG or VOID_SOLD bond costs 90%"},{"citation":"resolved","description":"Merged from audit_economics (low) and audit_permissions (info): the same oracle-dependency gap. requestAdmission uses `request`, not v2's `requestWithFailure`, and the brief pins Intake v1 (0x1397...), so a refused body (status 1) or a 3/2 panel split (status 2) spends the asker's IMD (up to MAX_PRICE 1 IMD), never reaches the Annex, emits nothing, and leaves admissionLists[requestId] populated forever with no way to clear it. OracleAttestationConsumer.oracleSigner is set once and the Annex never calls _setOracleSigner; intake and action are immutable. If IdentityMD rotates the signing key or retires v1, every later answer fails BadSignature inside the one-shot 200k callback (or requestAdmission reverts) while requestAdmission keeps charging the price, and admittedHook can never grow again. The brief mandates no owner and these exact constants (the live hook and judge hold the same), so this is a trust and liveness assumption to document in README/AGENTS.md rather than a deviation; the oracle-consumer reference supplied with the task says to use v2 and a clearable deadline for anything new, so the requester should decide knowingly.","line":560,"path":"src/MarginaliaAnnex.sol","reproduction":"carol: annex.requestAdmission([TAXER]) pays 0.5 IMD; the panel splits 3/2 (agreed 3 < quorum 4) or the signer has been rotated. The Intake completes with status 2 and calls nothing (or the callback reverts BadSignature and is not retried). State afterwards: admissionLists[requestId].length == 1, consumed[...] == false, admittedHook[TAXER] == false, no event, carol's 0.5 IMD spent. Expected: a failure callback or clearable deadline that records the request ended; actual: nothing on chain distinguishes a pending request from a dead one.","severity":"low","snippet":"        requestId = intake.request(","title":"Admission depends on Intake v1 `request` with no failure callback, no request deadline and a signer/intake/action fixed forever"},{"citation":"resolved","description":"audit_math (low), reproduced by inspection: _broken compares the author's current balanceOf with the post-time snapshot and treats any decrease as a sale. Negative-rebasing, reflection or holding-fee tokens shrink balances without any transfer by the holder, so a 1-wei decrease at any observation marks the call broken: settle books VoidSold, forfeits the whole bond (10% to the settler) and scores -difficulty although nothing was sold. The Annex admits any v4 pool quoted in IMD/WETH/ETH behind a no-swap-bit hook, and launched tokens are where such designs appear. The site documents the rule ('if it is ever lower at an observation, the call is VoidSold'), so this is a documented limitation to state for Annex authors (rebasing tokens are not for BUY calls) or to soften with a small tolerance.","line":456,"path":"src/MarginaliaAnnex.sol","reproduction":"Deploy an ERC-20 whose balanceOf(who) returns stored * factor / 1e18 with a settable factor; seed a guarded X/IMD v4 pool; give alice 1000 X; checkpoint; alice posts a BUY call (postBalance 1000e18). Before the first observation set factor = 0.999e18 (alice transfers nothing). Three observations across an hour, settle: status VoidSold, records(alice).broken == 1, bond forfeited. Expected: Right or Wrong on price alone.","severity":"low","snippet":"        return balance == type(uint256).max || balance < n.postBalance;","title":"Hold rule reads balanceOf literally: a token whose balance shrinks without a transfer settles a held BUY call VoidSold and forfeits the bond"},{"citation":"resolved","description":"write_foundry_tests (low), reproduced by inspection: MarginaliaHook.noteOf reverts UnknownNote through _note; MarginaliaAnnex.noteOf reads notes[id] directly and returns a zeroed NoteView whose status decodes as Open (0). A reader written against the hook's contract (the site, a keeper, a counter-call check) sees a phantom open note for any id. The Annex's own _checkCounter is unaffected (it checks t.author != 0 first), so no funds move; interface parity only.","line":481,"path":"src/MarginaliaAnnex.sol","reproduction":"annex.noteOf(keccak256('nowhere')) returns NoteView{author: 0x0, status: Open (0), deposit: 0}. Expected (hook parity): revert. Actual: an empty struct whose status reads Open.","severity":"info","snippet":"    function noteOf(bytes32 id) external view returns (T.NoteView memory v) {","title":"noteOf on an unknown id returns an empty view with status Open instead of reverting like the hook"}],"hash":"1a911655942bf629965de6b5539723d9691969f5eac1dc308cec19587b1b2bf6","nodeId":"de72d744-1e13-49e2-b904-416388d4de85","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result.\n\n**Verdict on the specialist audit.** Thirteen specialist findings reduced to seven after reproduction and merging. Nothing was dropped as irreproducible except the callback-gas headroom note, which reports no defect. One finding was raised, one lowered.\n\n**Findings kept, by severity:**\n\n1. **High.** One atomic dump, observe, rebuy inside a single PoolManager unlock forfeits a right call and pays the attacker 10% of the bond. Merged from audit_math and audit_permissions. My self-contained proof at `test/scratch/AnnexFlashAdverse.t.sol` fails on this tree: status Wrong, 0.2 IMD to the attacker, price restored within 0.2% in the same transaction. The rule is inherited from the live hook, but the pricer's stated guarantee is broken in the only direction that moves money.\n2. **Medium.** Whoever holds a venue's in-range liquidity removes it for the six-hour window, every observe reverts EmptyPool, and a wrong call settles VoidNoData with the whole bond returned. Merged from audit_economics and the test writer. Confirmed in a scratch test with a 10 IMD bond.\n3. **Medium.** The post baseline is the posting block's spot with no author-side bound. A same-block pump before the post, or a pump-checkpoint-unwind on the window, makes a BUY call unwinnable. Merged from three specialists. Confirmed in a scratch test: baseline recorded 1.32 against an honest 1.00.\n4. **Low.** The author can settle their own forfeit and keep the keeper cut.\n5. **Low.** Admission relies on Intake v1 with no failure callback, no deadline, and a signer fixed forever. Merged two reports into one documentation-level finding.\n6. **Low.** The hold rule treats any balance decrease as a sale, so rebasing tokens forfeit held BUY calls.\n7. **Info.** `noteOf` returns an empty Open view for unknown ids instead of reverting like the hook.\n\n**My own checks found no additional defect.** The runtime is 24,293 bytes with no forbidden opcodes, the creation code with arguments is well under the 49,152 limit, the manifest uses only schema keys with the four constants the brief names, the constructor reads no chain state, and the unlock callback is reachable only through the Annex's own unlock. All 44 existing Annex tests pass.\n\n**Coverage.** All 48 entry points have rows: 18 hold, 10 carry a finding, 20 are honestly unreached. The unreached rows are the live Judge, Pages and most of the Hook and Router, which are outside this launch's manifest.","treeHash":null,"usage":{"cachedInputTokens":2090341,"inputTokens":388,"model":"claude-fable-5-1","outputTokens":45207,"runtime":"claude","turns":35,"wallClockMs":1832540}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"523ef565dd740e25","findings":[{"citation":"resolved","description":"admissionBody() builds the Intake body by concatenating the question literal, which ends in `Hooks: [`, with `list` = `\"0x..\",\"0x..\"` (line 478 wraps every address in unescaped double quotes), then `]\",\"chainId\":`. The result places raw `\"` characters inside the JSON string value of `question`, so the `question` string terminates at the first address and the rest is garbage: a strict JSON parser rejects the document (Python json: 'Expecting , delimiter: line 1 column 580'). The oracle-consumer reference states the Intake body is strict JSON and that a refused body (status 1: bad JSON) spends the price and never reaches the callback. requestAdmission therefore (a) pulls the Intake price (0.5 IMD today, up to MAX_PRICE 1 IMD) from msg.sender and hands it to the Intake for a request that can never be answered, on every call, and (b) makes the oracle-admission path (venue rule 3) unreachable, so no hook with swap permission bits, e.g. a flat-tax hook, can ever become a venue. There is no owner and no setter, so this cannot be corrected after deployment. The sibling MarginaliaJudge.questionBody (src/MarginaliaJudge.sol:135-144) avoids this by keeping ids only in guards.allow and writing a quote-free question. test/Annex.t.sol only substring-checks the body and never parses it, which is why the 17 tests pass. Fix: do not embed quoted strings in the question (write the list without quotes, e.g. `Hooks: 0x..., 0x...`, or JSON-escape each quote as \\\"); keep guards.allow as it is. Re-measure the callback gas afterwards only if the body changes size materially (it does not affect the callback).","line":484,"path":"src/MarginaliaAnnex.sol","reproduction":"Deploy MarginaliaAnnex(hook, intake, bytes32('oracle.request@oracle-1'), signer). Call admissionBody([0x784FF9a3ac5d88A30bfff6F7f2a270161FBE6000, 0x70000000000000000000000000000000000000cc]) and parse the returned string as JSON. Expected: a valid PaidOracleInput document. Actual: `{\"v\":1,\"question\":\"... Hooks: [\"0x784ff9a3...6000\",\"0x7000...00cc\"]\",\"chainId\":...}` which is not JSON (the question string closes at `[\"`). On chain: carol calls requestAdmission([TAXER]) -> 0.5 IMD leaves carol, intake.request is called with this body -> the plane refuses the body with status 1 -> onOracleResult is never invoked, admittedHook[TAXER] stays false, admissionLists[requestId] stays set forever, 0.5 IMD is gone. Proof test: forge test --match-path test/scratch/AnnexBodyJson.t.sol (testAdmissionBodyIsValidJson and testAdmissionBodyIsValidJsonForOneHook fail on the current code; the validator's sanity test passes).","severity":"high","snippet":"                    '{\"v\":1,\"question\":\"Each address is a Uniswap v4 hook on this chain with verified source. Answer with the subset that keeps its pools OPEN: any caller may swap (no allowlist, selective refusal or selective pause) and the pool price moves only through swaps and liquidity changes any caller may make (no owner-set price, no privileged swap path). A fixed fee or tax charged to every trader alike does not exclude a hook; a hook whose owner can change the fee at will, pause swaps for everyone, or that is upgradeable, is NOT open. Read the source; never infer from names. Hooks: ['","title":"requestAdmission sends malformed JSON: the hook list is inlined in the question string with raw quotes, so every admission request is refused and the asker's IMD is spent"},{"citation":"resolved","description":"_balanceOf returns type(uint256).max when X.balanceOf(author) reverts, returns fewer than 32 bytes or exceeds the 100k gas cap. post() stores that sentinel as n.postBalance without checking it. _broken() then returns true for every later reading (balance == max, or any real balance < max), so a BUY call on such a token can only settle VoidSold (bond forfeited, 10% to the settler, rest to the hook's pools) or VoidNoData. The hook's _postNote reads IERC20(p.x).balanceOf(author) directly (src/MarginaliaHook.sol:458) and reverts the post, so the hook never takes a bond it is certain to forfeit; the annex silently does. Fix: in post(), revert InvalidNote when side == Buy and the read returned the sentinel.","line":260,"path":"src/MarginaliaAnnex.sol","reproduction":"X = an ERC-20 whose balanceOf(author) reverts (a token with a blacklist that includes the author, or whose balanceOf needs >100k gas) in a hookless or guard-hooked X/IMD v4 pool with liquidity, checkpointed 1h earlier. author calls annex.post({x: X, side: Buy, targetBps: 12000, horizonDays: 1, ...}, key, 1e18, 1, deadline). Expected (hook parity): revert. Actual: post succeeds, noteOf(id).postBalance == type(uint256).max; after the horizon three observations and settle(id) give status VoidSold and the 1 IMD bond is forfeited even if the price doubled and the author's real balance never moved.","severity":"low","snippet":"        n.postBalance = _balanceOf(p.x, author);","title":"post() accepts a BUY call whose balanceOf read fails and stores the uint256.max sentinel as postBalance, guaranteeing VoidSold forfeiture (the hook reverts instead)"},{"citation":"resolved","description":"The brief deploys ONE contract, MarginaliaAnnex, through the contracts-only recipe. The reference says a launch.json present in the tree is checked as a manifest, that its kind must be \"evm_contracts\" with exactly the keys kind, contracts and notes, and that hook/token/pool keys are not in that schema. The file as it stands has kind \"univ4_hook\" and hook, token and pool blocks (a 3,811-character notes string, under the 4,000 limit). It also carries no entry for MarginaliaAnnex. Left as is, the manifest check refuses it. The constructor takes four static arguments (address, address, bytes32, address), all supported types, so the correct manifest is {\"kind\":\"evm_contracts\",\"contracts\":[{\"contract\":\"MarginaliaAnnex\",\"constructorArgs\":[\"0xf0457dd0cf526686190e4f057ba19db14d34a0cc\",\"0x1397434cd35e8a9C8aC312A61D3A285EB31dea56\",\"0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000\",\"0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982\"]}],\"notes\":\"...\"} (the action bytes32 is the UTF-8 bytes of oracle.request@oracle-1 right-padded, never a keccak). This is for the manifest step; it is recorded here so the adapter does not deploy 'as is' with the stale file.","line":2,"path":"launch.json","reproduction":"Read launch.json: line 2 is \"kind\": \"univ4_hook\" and there is no contracts array naming MarginaliaAnnex. Submitting the tree with this file for an evm_contracts launch fails the manifest schema check (extra keys hook/token/pool, wrong kind). Expected: a manifest that names MarginaliaAnnex with four constructor arguments in declaration order.","severity":"low","snippet":"  \"kind\": \"univ4_hook\",","title":"launch.json in the tree is the previous univ4_hook launch's manifest; for the Annex (evm_contracts) it is an invalid manifest and must be replaced, not reused"},{"citation":"resolved","description":"AGENTS.md tells integrators that annex.hookAllowed(hook) 'answers all four' venue conditions. It is a function of the hook address alone; the dynamic-fee exception (key.fee == 0x800000 passes only with the Marginalia hook or an admitted hook) lives only in validateVenue (line 181). A guard-hooked dynamic-fee pool therefore reports hookAllowed == true and validateVenue == BadVenue. No funds are at risk (validateVenue is what post and checkpointVenue use); the gap is a documentation/API mismatch that costs an agent a reverted transaction. Either document hookAllowed as the address-only test, or add a hookAllowedFor(hook, fee) view.","line":167,"path":"src/MarginaliaAnnex.sol","reproduction":"Etch GuardHook code at 0x7000...2000 (beforeInitialize only). key = PoolKey(X, IMD, 0x800000, 60, GUARD). annex.hookAllowed(GUARD) returns true; annex.validateVenue(params with venue.ref = key.toId(), key) reverts BadVenue (test/Annex.t.sol testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits shows the second half).","severity":"info","snippet":"        return hooks == address(0) || hooks == address(hook) || !hookCanTouchSwaps(hooks) || admittedHook[hooks];","title":"hookAllowed() does not encode the dynamic-fee rule, so the public predicate the integration guide points agents to says 'allowed' for a pool validateVenue refuses"},{"citation":"resolved","description":"By the brief's own rule (no owner, no setter) the four constructor values cannot move. The oracle-consumer reference lists Intake version 1 (0x1397434c...) as 'still served, for contracts already pointing at it' and recommends version 2 (0xa43e6f75...) for anything new, with requestWithFailure so a refused body or a split panel calls onOracleFailure and the consumer knows the price is spent. The annex uses request() only: an unanswered ask leaves admissionLists[requestId] set forever (harmless; no funds are held) and gives the asker no on-chain signal. This is a trust assumption to record for the adapter, not a defect in the code: if the launch keeps v1 as the brief states, say so in the manifest notes; if it moves to v2 the constructor argument is the only change (the interface is the same for request/priceOf). Also note the reference's statement that the signature proves the oracle answered a question for this contract, not that this contract asked it; the annex covers that by keying on its own intake request id (admissionLists), so a stranger's request naming the annex as callback target reverts BadList, and a cross-chain delivery reverts OnlyIntake.","line":81,"path":"src/MarginaliaAnnex.sol","reproduction":"Not a failing input. State to check before launch: cast call 0x1397434cd35e8a9C8aC312A61D3A285EB31dea56 'priceOf(bytes32,address)' 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 on mainnet must return a non-zero value <= 1e18, or requestAdmission reverts BadList forever.","severity":"info","snippet":"    IIntake public immutable intake;","title":"Intake, action and signer are immutable with no owner; the brief pins Intake version 1 and the plain request() path, so a retired v1 or a refused ask leaves requestAdmission dead or silently unanswere"},{"citation":"resolved","description":"READ IN FULL: src/MarginaliaAnnex.sol, src/OracleAttestation.sol, src/HookFlags.sol, src/MarginaliaTypes.sol, src/MarginaliaPricer.sol, src/MarginaliaImpls.sol, src/interfaces/IIntake.sol, src/Marginalia.sol, test/Annex.t.sol, test/helpers/Fixture.sol, launch.json. READ IN PART: src/MarginaliaHook.sol (swap callbacks, _postNote, _checkCounter, observe, settle, retract, claimDeposit, _forfeit, _difficulty, fundPot, unlock plumbing, noteOf) for parity with the annex; src/MarginaliaRouter.sol (validateVenue only); src/MarginaliaJudge.sol (questionBody only). NOT READ: src/MarginaliaPages.sol, src/MarginaliaTreasury.sol, the rest of the router and judge. VERIFIED LOCALLY: forge test --match-path test/Annex.t.sol passes 17/17; MarginaliaAnnex runtime is 24,001 bytes (EIP-170 limit 24,576; 575 bytes of headroom, so any fix must stay small or use the already-via-IR optimizer); the constructor makes no external call (EIP712 and ReentrancyGuard constructors only); no DELEGATECALL, CALLCODE, SELFDESTRUCT, proxy, initializer, owner, pause or mint path exists in the annex; the attestation base is byte-for-byte the reference's except isValidSignatureNow vs isValidSignatureNowCalldata (same semantics) and test/JudgeOracle.t.sol pins the protocol digest vector for the shared base. Checked and found sound: unlockCallback only reachable through the annex's own unlock (exact-input check, delta settlement, 25:10 split, burn to 0xdEaD); IMD custody (annex balance == sum of open deposits; outflows only to the author on claim, the settler's 10% and hook.fundPot on forfeit); observation slot rules, hold rule, settlement extremes and scoring mirror the hook line for line; counter-call checks against both contracts; callback access (OnlyIntake), replay (_consume + list delete), panel floor, chain pin, asked-AND-named admission; swap-permission bits match v4's Hooks.sol constants; the guard address 0x784f...6000 has only bit 13 set. COULD NOT BE REACHED (no RPC in this environment): the live MarginaliaHook 0xf0457dd0cf526686190e4f057ba19db14d34a0cc (assumed to expose poolManager/getPoolKey/imd/fundPot/noteOf exactly as src/MarginaliaHook.sol does), the Intake 0x1397434cd35e8a9C8aC312A61D3A285EB31dea56 (its priceOf, its handling of callback.target and its JSON strictness, which is taken from the oracle-consumer reference), the pricer 0xEaff9B262341A0cB05579227e662BFE768A71cfb, the PoolManager, the hub pool id and the guard hook; test/fork/MainnetLaunch.t.sol was not run. The body keys head, guards.allow, guards.mustHaveCode and consumer could not be checked against the live door schema; they match what the live judge already sends.","line":47,"path":"src/MarginaliaAnnex.sol","reproduction":"Coverage statement, no failing input.","severity":"info","snippet":"contract MarginaliaAnnex is IUnlockCallback, ReentrancyGuard, OracleAttestationConsumer {","title":"Review coverage: what was read, what was verified locally, and what could not be reached"}],"hash":"1c23c71b11cd9d002cef9147ac457446ade373dce3cc4b2167651ee14db8d567","nodeId":"82863945-8213-454b-a9d5-a755679ce393","outcome":"completed","summary":"The review is complete. No tracked file changed; the only new files are `.imd-findings.json` and the proof under `test/scratch/`.\n\n**Outcome: one high-severity defect, two lows, three informational notes.** All 17 existing Annex tests pass, but they never parse the oracle body, which is where the defect hides.\n\n**High. `requestAdmission` always sends malformed JSON.** `admissionBody` inlines the hook list inside the JSON `question` string as `Hooks: [\"0x..\",\"0x..\"]` with raw double quotes. The question string closes at the first address, so a strict parser rejects the document. I dumped the real body and confirmed it with Python: it fails at character 580. The oracle-consumer reference says a refused body spends the price and never reaches the callback. So every admission request burns the asker's IMD, and no hook with swap permission bits can ever be admitted. There is no owner to repair it. The live judge avoids this by keeping ids only in `guards.allow` with a quote-free question. The proof test at `test/scratch/AnnexBodyJson.t.sol` runs a minimal strict JSON validator over the body. It fails on the current code and will pass once the quotes are escaped or dropped.\n\n**Low.** `post` stores the `uint256.max` sentinel as `postBalance` when the author's `balanceOf` read fails, which guarantees a VoidSold forfeit on a BUY call. The hook reverts the post in that case.\n\n**Low.** The `launch.json` in the tree is the hook launch's `univ4_hook` manifest. For this contracts-only launch it is schema-invalid and names no `MarginaliaAnnex` entry. The correct four constructor arguments are spelled out in the finding.\n\n**Info.** `hookAllowed` ignores the dynamic-fee rule that only `validateVenue` enforces, though the integration guide points agents to it. The immutable Intake pin is version 1 while the reference recommends version 2. The coverage note lists what was read and verified.\n\n**Verified locally:** runtime size is 24,001 bytes with 575 bytes of EIP-170 headroom, the constructor makes no external calls, no forbidden opcodes or admin paths exist, swap-flag bits match v4, and the observation, settlement, forfeit, counter-call and callback logic mirror the hook correctly.\n\n**Could not be reached:** the live hook, Intake, pricer, PoolManager and guard hook on mainnet, since this environment has no RPC. Their behavior is assumed from the repo source and the pinned references.","treeHash":null,"usage":{"cachedInputTokens":2863346,"inputTokens":484,"model":"claude-fable-5-1","outputTokens":58772,"runtime":"claude","turns":40,"wallClockMs":1373821}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ce319efac2b76da0","findings":[{"citation":"resolved","description":"Trust-gap seam (access x economics x asymmetry). observe(id) is open to anyone and may be called from inside a PoolManager unlock (it is not nonReentrant and only reads slot0 via extsload); a reading that is more adverse than the last always lands (line 326) and is never displaced by a later, honest reading; settle takes the most adverse priced observation (line 433) and pays msg.sender KEEPER_BPS of the forfeit (line 371, 411). The asymmetry: the author's favourable manipulation is neutralised by one honest reading (as the pricer's NatSpec says), but a hostile manipulation is NOT neutralised by any number of honest readings, so a single atomic dump->observe->rebuy decides the call. On the Annex the venues are, by construction, thin launched-token pools, where the cost of an 8-10% momentary move is small, and the attacker needs no capital at risk beyond two LP fees. The pricer's claim 'A two-block pump-observe-unwind moves neither rule' (MarginaliaPricer.sol:38) is true only for the author's side. This is the hook's rule copied by the brief ('the most adverse decides'), so it is reported as an inherited design trade-off the requester should document for Annex authors, not as a deviation from the brief. Possible mitigations that keep the rule's intent: require a reading to be at least OBS_GAP_BLOCKS after the previous one even when replacing (so a dump must be held across blocks against arbitrage), or settle v4 venues on the median of the readings rather than the extreme.","line":433,"path":"src/MarginaliaAnnex.sol","reproduction":"Fixture pool X/IMD (10M liquidity, +-6000 ticks, 0.3% fee) behind the guard hook. alice: annex.post(BUY, targetBps 12000, 1 day, bond 10 IMD). bob buys X with 1.5M IMD: price +30% (alice is right). At horizonEnd: two honest observe() calls 30 minutes apart. bob then, in ONE transaction via an unlock callback: swap 3,000,000 X -> IMD (spot falls below +20%), annex.observe(id) (recorded: pushes a new slot, or replaces the last as more adverse), swap the IMD back to X (price restored). A later honest observe() after recovery does not displace it. After the window bob calls settle(id): status = Wrong, bob receives 1 IMD (10% of alice's bond), 9 IMD go to hook.fundPot. Measured in test/scratch/FlashAdverse.t.sol (passes on the tree as is): attacker's round-trip cost 15,682 X on this deep fixture pool for a 1 IMD reward; on a launched-token pool with ~1/1000 of that depth the same move costs ~16 X. Expected per the pricer's documented guarantee: a momentary adverse reading that is immediately unwound should not decide a call that the held price confirms. Actual: it does, and the manipulator is paid.","severity":"low","snippet":"                if (i == 0 || (buy ? p < price : p > price)) price = p;","title":"Permissionless observe + most-adverse rule + keeper cut: any third party can turn a right v4 call into a forfeit in one transaction and is paid 10% for it"},{"citation":"resolved","description":"Trust assumption to document, not a deviation from the brief (which mandates no owner and these exact constants). OracleAttestationConsumer.oracleSigner is set once in the constructor and nothing in the Annex calls _setOracleSigner again; intake and action are immutable. The oracle-consumer reference supplied with this task says every one of these 'is constructor input and owner-settable, never a constant' and that Intake v1 (0x1397...) is 'still served' while v2 is recommended for anything new. If IdentityMD rotates the oracle signing key, every later admission answer fails _verifyAttestation (BadSignature) inside the 200k callback, which the plane attempts once and never retries; if v1 stops taking requests, requestAdmission reverts. In both cases admittedHook can never grow again and hooked pools with swap permissions are venues on the Annex only for hooks admitted before the change. There is no refund path for the asker (the Intake does not refund), so until askers notice, each requestAdmission spends up to MAX_PRICE in IMD for an answer the contract can no longer accept. The deployed hook/judge carry the same constants, so the requester has already accepted this; it belongs in the Annex's README as a documented liveness assumption.","line":146,"path":"src/MarginaliaAnnex.sol","reproduction":"State: oracle signer rotated to key K2 (or Intake v1 retired). carol calls requestAdmission([H]) paying 0.5 IMD (succeeds). The plane delivers onOracleResult(requestId, a, sig_K2): _verifyAttestation reverts BadSignature; the Intake records the delivery as failed and does not retry; admissionLists[requestId] stays populated; admittedHook[H] remains false; carol's 0.5 IMD is spent. Expected for a long-lived no-owner contract: a documented statement of this dependency (or a brief-level decision to point at Intake v2 / a signer registry). Actual: undocumented in README/AGENTS.md; the Annex section of AGENTS.md says admission is available to anyone who pays.","severity":"info","snippet":"    constructor(IMarginaliaHookAnnex hook_, IIntake intake_, bytes32 action_, address signer_)","title":"Oracle signer, Intake and action are fixed forever with no rotation path: a signer rotation or Intake v1 retirement permanently kills admission while requestAdmission keeps charging the price"}],"hash":"21e9a08a8932fb51ec0f8c4995c1a1630aaab74fb50613814300e1da593dc7e1","nodeId":"077cb14e-edb2-4f54-90e8-7d331d11a8a9","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root. No source files were changed; the only additions are the findings file and a scratch test under `test/scratch/`, which is not kept.\n\n**Outcome for the assigned area (Access Control, Trust Gap, Asymmetry on MarginaliaAnnex):** no permission bypass, no confused-deputy path over the held bonds, and no mirror-update gap between the Annex and the hook. Two items are reported, neither blocking.\n\n- **Low, trust-gap seam in observe and settle.** Anyone may observe from inside a PoolManager unlock, an adverse reading is never displaced, and the settler earns 10% of a forfeit. One transaction of dump, observe, rebuy turned a BUY call that the market confirmed at +30% into WRONG, and the settler collected 1 IMD of a 10 IMD bond. On the deep fixture pool the attacker burned about 15.7k X in fees for that reward, so it pays only on thin pools or for someone selling anyway. This is the hook's own rule as the brief specifies it, so it is reported as an inherited design trade-off with the pricer's \"pump-observe-unwind moves neither rule\" claim being one-sided.\n- **Info, trust assumption.** Signer, Intake v1 and action are fixed with no rotation path. A signer rotation or Intake retirement kills admission permanently while requests keep charging the price. The brief mandates these constants, so this is documentation, not a defect.\n\n**Leads closed with evidence:** the live oracle signer is an EOA on mainnet, so no ERC-1271 gas lands on the 200k callback. The body keys the Annex sends match the live Judge and the probe job. Gas-starving the bounded balanceOf read in observe is arithmetically infeasible. Runtime size is 24,293 bytes, 283 under EIP-170. All 20 Annex tests pass.\n\n**Coverage:** every Annex entry point is `holds` or `finding`. Hook functions the Annex depends on are `holds`. Judge, Pages, Router and Treasury entry points outside the area are marked `unreached`. No launch.json exists yet, so the manifest could not be reviewed.","treeHash":null,"usage":{"cachedInputTokens":2314525,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":66895,"runtime":"claude","turns":32,"wallClockMs":1990156}},{"artifacts":[],"attempt":1,"bundleHash":"6d343dd9d1d6e8719a4385f7a4d577d75b26eaeaea33d6146e547ae63748a607","device":"98b4506bef931d13","findings":[],"hash":"3a68daf16509996ae132808ee1cf74885a1153ee73b1e1a50a59eabb3d4835fa","nodeId":"215639ec-256a-4e11-987c-c26776a22c35","outcome":"completed","summary":"Done. The manifest at `launch.json` is rewritten and is the only changed file, so this round carries a real diff rather than the empty one that was rejected.\n\n**What the manifest declares**\n\n- One contract, MarginaliaAnnex, with four static constructor arguments in declaration order: the live MarginaliaHook of launch 1283, the IdentityMD Intake, the oracle action as a right-padded bytes32, and the IdentityMD oracle signer.\n- The bytes32 for the action was recomputed with cast and matches the earlier value.\n- No $owner, token, pool, funding or initialization entries. The contract has no owner, pause or upgrade, and the constructor reads no chain state.\n- Notes were refreshed to describe the tree as it stands, including the six-argument post signature with baselineBound, and stay within the limit.\n\n**Checks run on this tree**\n\n| Check | Result |\n| --- | --- |\n| Manifest shape (keys, string args, identifier length) | ok, notes 3,995 chars |\n| forge build | passes |\n| forge test, full suite | 292 passed, 0 failed, 1 skipped (mainnet fork) |\n| forge test on test/Annex.t.sol | 29 passed |\n| MarginaliaAnnex runtime | 24,493 bytes, under EIP-170 |\n\ngit status shows only `launch.json` modified.","treeHash":"45da8ee05cbd23c4971ef4f7378ee944ae9d626f","usage":{"cachedInputTokens":257953,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":4643,"runtime":"claude","turns":6,"wallClockMs":1201699}},{"artifacts":[],"attempt":2,"bundleHash":"8cd2c81a767a3d2f1a30113ad1d9016758ba5a8ae2a451e008571f258e943088","device":"aac006f7fc669006","findings":[],"hash":"65505b24cf290ac7f1ebab19fe14cf11e7b3ce0de97e3a90afcf72ffe60dc6d3","nodeId":"215639ec-256a-4e11-987c-c26776a22c35","outcome":"completed","summary":"I updated `launch.json`, and it now describes the current accepted source. The last attempt was rejected because it left the file unchanged, and that was the fault: the manifest had been written before a later accepted revision changed `src/MarginaliaAnnex.sol`.\n\n**What changed:** only the `notes` text, now 2,552 characters (the limit is 4,000). It now covers:\n- `post` takes six arguments: `post(params, v4Key, bond, minMargOut, baselineBound, deadline)`. `baselineBound` caps a BUY call's post price or sets a floor for a SELL call's; a post past it reverts `Slippage` and nothing is taken.\n- `observe` and `checkpointVenue` revert `Unlocked` while the PoolManager is unlocked, so no price can be read from inside a swap transaction.\n- If a venue's liquidity has been pulled, a reading records no price and settles against the author, so emptying a pool can't turn a forfeit into a refund.\n- Admission only covers hooks that were both asked about and named by the panel.\n\n**What stayed the same:** `kind` is `evm_contracts` and there is one contract, `MarginaliaAnnex`. Its four constructor arguments match the compiled constructor `(address hook_, address intake_, bytes32 action_, address signer_)` in order:\n- the hook: `0xf0457dd0cf526686190e4f057ba19db14d34a0cc`\n- the Intake: `0x1397434cd35e8a9C8aC312A61D3A285EB31dea56`\n- the action: `bytes32(\"oracle.request@oracle-1\")`, written as `0x6f7261636c652e72657175657374406f7261636c652d31` padded with zeros to 32 bytes\n- the signer: `0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982`\n\nThere is no owner argument and `$owner` is not used. The only keys are `kind`, `contracts` and `notes`.\n\n**Checks:**\n- `forge build` passed, with lint notes only.\n- `forge test` passed: 289 tests, 0 failed, 1 skipped (the mainnet fork test). The Annex suite's 26 tests all passed.\n- `MarginaliaAnnex` compiles to 24,501 bytes of runtime, 75 bytes under the EIP-170 limit of 24,576.\n- `git status` shows only `launch.json` modified.\n\nMy first combined build-and-test run was stopped at its time limit before it printed anything, because the full via-IR compile takes over 10 minutes here. I re-ran the build and tests separately, and the results above come from those runs.","treeHash":"17cb0193bbe93b33d6e82014613a0acddf5589bb","usage":{"cachedInputTokens":669390,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":5354,"runtime":"claude","turns":13,"wallClockMs":1815852}},{"artifacts":[],"attempt":1,"bundleHash":"55f2f49fb838dbd00104bf514a8c995a141efb7a6c6f63e47430ddfe5450e0a6","device":"d00f790fc692b1a4","findings":[{"description":"MarginaliaHook.noteOf reverts UnknownNote for an id it does not hold; MarginaliaAnnex.noteOf returns a zeroed NoteView (author 0, status Open, deposit 0). A reader that treats 'status == Open' as 'an open call exists' (the site, a keeper, a counter-call check written against the hook's contract) sees a phantom open note for any id. The Annex's own _checkCounter is not affected (it reads storage directly and the hook path rejects unknown ids), so no funds move; this is an interface-parity defect only. The adversarial suite pins the current behaviour (testLifecycleRefusalsOnUnknownClosedAndForeignNotes asserts author == 0) rather than asserting it is correct.","line":481,"path":"src/MarginaliaAnnex.sol","reproduction":"annex.noteOf(keccak256('nowhere')) returns NoteView{author: 0x0, status: Open (0), deposit: 0}. Expected (hook parity): revert. Actual: empty struct with status Open.","severity":"low","title":"noteOf on an unknown id returns an empty view instead of reverting, unlike the hook"},{"description":"observe() reads the pool through the pricer, which reverts EmptyPool when the pool has no in-range liquidity, so no observation can be recorded while the liquidity is withdrawn. If the author (or an ally) holds all of a launched token's pool liquidity, they can remove it for the six-hour settlement window; settle() then finds fewer than three readings and returns the bond as VoidNoData (scored as wrong, but nothing is forfeited to the pools and no keeper cut is paid). This is the same rule the hook applies on v4 venues (the Annex mirrors it deliberately), and the Annex's venues are precisely the single-LP launch pools where one wallet is more likely to hold all liquidity. Not testable around without changing the settlement rule; reported for the design record. Mitigation options: treat a pool that had liquidity at post and none at every observation attempt as a forfeit, or require the author to also pass a liquidity floor at settlement.","line":344,"path":"src/MarginaliaAnnex.sol","reproduction":"Post a BUY call on X/IMD (author or ally is the only LP). Price never reaches the target. At horizonEnd, remove all liquidity; every observe(id) reverts EmptyPool. After horizonEnd + 6h, settle(id): status VoidNoData, deposit returned via claimDeposit. Expected under the hook's economics for a call the market falsified: Wrong, bond forfeited. Actual: bond returned.","severity":"low","title":"An author who controls a venue's whole liquidity can turn a WRONG call into VOID_NODATA and recover the bond"},{"description":"onOracleResult with four cold admittedHook writes, one consumed id and the four-entry list cleared succeeds with a 170,000 gas limit and fails at 160,000 (bisected with gas-bounded calls from the Intake's address). The brief's ~171k figure holds. test/AnnexAdversarial.t.sol pins the bound at 180,000 so any added storage write in the callback fails the suite before the stipend is at risk.","line":573,"path":"src/MarginaliaAnnex.sol","reproduction":"requestAdmission([4 hooks with code]); deliver the signed attestation naming all four with call{gas: 160_000}: reverts (out of gas); with call{gas: 170_000}: succeeds and admits all four.","severity":"info","title":"Callback gas at the full admission list measured between 160k and 170k: ~30k headroom under the 200k stipend"}],"hash":"68a16eb0c7298dc54bdfb426f1679d1721c20ed2f4836ca6d5eccbc999ddf2e0","nodeId":"c4514b85-d347-4eca-b101-b785dad41d91","outcome":"completed","summary":"The findings file is in place and excluded by the repository's own `.git/info/exclude`, which is how the harness expects it. The work is complete.\n\n**Outcome.** The full suite passes: 307 tests, 0 failures, 1 skipped (the fork test, by design). The delivered `test/Annex.t.sol` is untouched and still passes its 20 tests. I added two files under `test/` and wrote three low/info findings to `.imd-findings.json`. No critical or high defect was found, so no proof files were needed.\n\n**New file: `test/AnnexAdversarial.t.sol`** (23 tests, all failure paths the delivered suite did not walk)\n- Deployment shape: the constructor stores four values against addresses with no code, refuses each zero value, and the runtime of a fresh deploy sits under EIP-170.\n- Exact boundaries: BUY 11000 posts and 10999 does not, SELL 9000 and 9001, horizon 90 and 91, bond 0.25 and 10 IMD and one wei outside, text of 280 and 281 bytes, deadline now versus one second ago.\n- Money paths: slippage and unfunded authors take nothing, the 25:10 split is exact integer arithmetic with no MARG or claims retained, `unlockCallback` refuses a direct caller and a stranger who holds the PoolManager lock.\n- Price windows: too young, exactly one hour, extended without resetting, expired after six hours, restarted and refused in its own block.\n- Settlement: SELL right (the author sold through the horizon) and SELL wrong, the most adverse reading decides, three readings inside an hour are no data, a more adverse reading replaces the last and a breach is never replaced, the 16-reading cap and the reserved last slot, every refusal on unknown, closed and hook-owned ids.\n- Hold rule: gifts count as held, a balance read that starts failing after the post settles VoidSold.\n- Scoring: exact difficulty from the pricer, retract is half, a 10 IMD bond scores the same as a 1 IMD bond.\n- Counters: retracted, settled, thesis and hook-retracted parents are all refused, and a counter leaves the parent untouched.\n- Admission: each attestation field at its refusal edge (expired, future, wrong key, wrong domain, panel 4, quorum 3, agreed below quorum, wrong answer types), an empty answer is stored not reverted, one oracle UUID serves one request, list and price rules, the asker never spends the bonds, the cold full-list callback fits a 180k gas limit, and the protocol's signing vector reproduces the digest and canonical selector.\n\n**New file: `test/AnnexInvariant.t.sol`** (handler plus six invariants, 96 runs by inline config)\n- The handler posts on both venues, trades, moves X, observes singly and in full series, settles as a keeper, retracts, claims, and runs admissions through the mock Intake with signed answers, keeping its own ledger.\n- Invariants: IMD held equals the deposits recorded equals the ledger, bonds in equal held plus claimed plus keeper plus pools, no MARG retained, statuses never reopen and deposits match status, records count outcomes once, admission is permanent.\n\n**Findings reported** (`.imd-findings.json`, none severe)\n- Low: `noteOf` returns an empty view with status Open for unknown ids where the hook reverts.\n- Low: an author who controls all of a venue's liquidity can pull it during the window and recover a falsified call's bond as VoidNoData. The hook shares this rule.\n- Info: the full-list callback needs between 160k and 170k gas, bisected with gas-bounded calls.\n\nOne thing worth knowing for anyone extending the handler: with `via_ir` the compiler caches `block.number` within a function, so a second `vm.roll` computed from it is a no-op. The handler uses `vm.getBlockNumber()` and `vm.getBlockTimestamp()` throughout for that reason.","treeHash":"66eab4fe54bfc6e0b3883f7eb4025785c5b795df","usage":{"cachedInputTokens":5864232,"inputTokens":1026,"model":"claude-fable-5-1","outputTokens":99691,"runtime":"claude","turns":68,"wallClockMs":2517813}},{"artifacts":[],"attempt":1,"bundleHash":"8de6b99c114b435e72ee3dde896c32a22c82095531936f3cbe8b27440ad89978","device":"fe5e46fb044c6af1","findings":[],"hash":"7211914283bd866442ca09c294ee0990682015ddef0fd16b3b1e77b54e1eaade","nodeId":"e6102ba0-936c-4275-bba8-f70b2f059f73","outcome":"completed","summary":"Work is complete. The diff touches six files and every check passed.\n\n**What was done**\n\n- **Malformed admission JSON (high, reproduced).** The question string in `admissionBody` embedded the quoted hook list, so the body was not JSON and every admission request would have spent the asker's IMD for nothing. The question now names hooks bare, and `guards.allow` keeps the quoted list. The new `testAdmissionBodyIsStrictJson` parses the body with forge's strict JSON cheatcodes for one, two and four hooks. The callback was not touched, and it measured 167,201 gas at the full four-hook list.\n- **Unreadable balance on a BUY call (low, reproduced).** A failed `balanceOf` read stored the sentinel as the post balance, which could only settle VoidSold. The post now reverts in that case, matching the hook. The regression uses a token whose read reverts for the author.\n- **Stale manifest (low, reproduced).** The old hook-launch `launch.json` is removed, since the manifest step writes the new one. README states the four constructor values for that step.\n- **Fee-blind public predicate (info, reproduced).** New view `hookAllowedFor(hook, fee)` carries the dynamic-fee rule, and `validateVenue` now calls it so the two cannot drift. AGENTS.md documents it. Two tests cover the guard, hookless, Marginalia and taxing hooks at static and dynamic fees, including an admitted hook passing the gate.\n- **Immutable Intake and signer (info).** Left as the brief fixes them. Live reads over a public RPC confirmed the Intake price is 0.5 IMD, the hook exposes the interface the Annex reads, and the guard, pricer and Intake have code. Recorded as trust assumptions in ADAPTATION.md.\n\n**Verification**\n\n| Check | Result |\n|---|---|\n| Annex suite | 20 passed |\n| Full suite, scratch and fork excluded | 283 passed, 0 failed |\n| Plain run without RPC | 283 passed, 1 skipped (fork setUp) |\n| Protected deployment floor from scratch | 1 passed |\n| Annex runtime size | 24,293 bytes (limit 24,576) |\n\nThe fork suite was not run because no mainnet RPC is configured in the environment. The constructor still reads no chain state, takes four static arguments, and nothing in the build configuration or dependencies changed.","treeHash":"199c5b98bffa5f99ef918fda83db8c2eab1b54f4","usage":{"cachedInputTokens":3816075,"inputTokens":902,"model":"claude-fable-5-1","outputTokens":32738,"runtime":"claude","turns":42,"wallClockMs":1236929}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0e78515c4d95885a","findings":[{"citation":"resolved","description":"Execution trace / first principles. `post(params, v4Key, bond, minMargOut, deadline)` lets the author bound the MARG they receive (`minMargOut`) and the time (`deadline`) but not the baseline the call is judged against. The baseline is read at line 274 AFTER the funds are pulled, from the venue's spot price: for a BUY call `pricer.postPrice` returns max(window.xMax, current spot) and for SELL min(window.xMin, current spot) (MarginaliaPricer.sol:147). Whoever orders the block can therefore sandwich the post: pump X on the venue pool in the same block (front-run), let the victim's post read the pumped spot as its baseline, unwind (back-run). The victim's target is now `targetBps` above a price the market never held, the call settles WRONG through the normal observe/settle flow, the bond (0.25 to 10 IMD) is forfeited to the hook's pools and the attacker, settling, takes KEEPER_BPS 10% of it. The hook's router shares the same shape (its `note` has no baseline bound either), but the hook offers `seal` as the mitigation (the baseline is fixed at seal time); the Annex deliberately omits seals (SPEC 4.11 'Not in it'), so on the Annex nothing lets an author protect the baseline. The README (lines 204-208) documents the observation-side analogue (a hostile adverse reading) as a known v4 limitation; the post-side variant is distinct because it is closable with a parameter: a `maxBaseline` (BUY) / `minBaseline` (SELL) argument checked against `n.postPrice`, costing a few dozen bytes of the 283 remaining under EIP-170. Economics: the attacker pays two swaps' LP fees and slippage on the venue pool, which on any pool with real liquidity exceeds the 10% bounty (in the reproduction, 0.3% x 2 on 3M IMD versus 0.2 IMD), so this is a griefing vector that costs the attacker more than it earns; the victim nevertheless loses the whole bond on a call that was never falsified. Severity low for that reason.","line":274,"path":"src/MarginaliaAnnex.sol","reproduction":"Fixture pool X/IMD behind the guard hook (bits 0x2000), liquidity 10,000,000 at 1 X = 1 IMD, range +-6000 ticks, Annex window checkpointed 1 hour earlier. (1) `annex.postPrice(v, true)` = 1.000e18 (honest baseline). (2) bob front-runs: swaps 3,000,000 IMD into the pool (X out). `annex.postPrice(v, true)` is now 1.6877e18. (3) alice (same block) calls `annex.post(BUY, targetBps 12_000, horizon 1 day, bond 2 IMD, minMargOut 1, deadline now+1)`; `noteOf(id).postPrice` == 1.6877e18, target = 2.025e18. (4) bob back-runs: swaps the X back; spot returns to 1.0014e18 and stays there for the horizon. (5) three observations across the hour after horizonEnd read ~1.0014e18 each; `settle(id)` by bob -> status WRONG (expected RIGHT/no loss had the baseline been the price the market held: 1.0014 x 1.2 = 1.2017, never reached either, but the point is alice's call was judged against a price she never saw and could not bound). bob's IMD rises by exactly 0.2 IMD (10% of 2 IMD); alice's 2 IMD bond is gone. Reproduced in test/scratch/AnnexProbe.t.sol::testPostBaselineSandwich (logs: honest baseline 1000000000000000000, baseline seen by the post 1687660809999999999, price after unwind 1001382850460503346). Fix shape: add `uint256 maxBaseline` to `post` and `if (n.postPrice > maxBaseline) revert Slippage();` for BUY (and the mirror `minBaseline` for SELL), or a single `baselineLimit` interpreted by side.","severity":"low","snippet":"        n.postPrice = postPrice(v, p.side == T.Side.Buy);","title":"post() commits the author to an unbounded baseline: a same-block pump before the post dooms the call (griefing sandwich, no price bound parameter)"}],"hash":"8e53b04d36538567c2c353731da350b0936f9de48a3fe8c3cf56f47c11d2d959","nodeId":"f0d0fae2-3609-4dd0-8035-61d64f8ebac9","outcome":"completed","summary":"The review is complete. Findings are in `.imd-findings.json` (one finding, 51 coverage rows, snippet verified against the tree).\n\n**Outcome**\n\nThe MarginaliaAnnex control flow holds up well. I traced every Annex entry point from input through guards, external calls and state writes (Execution Trace, Periphery and First Principles passes), and found one substantiated defect, which I rated low.\n\n- **Finding 1 (low), `post()` at `src/MarginaliaAnnex.sol:274`.** The author can bound the MARG they receive and the deadline, but not the baseline the call is judged against. The baseline is read from the venue's spot after funds are pulled, so a same-block pump before the post and an unwind after it leave the author with an unwinnable call. Reproduced in `test/scratch/AnnexProbe.t.sol`: honest baseline 1.00, baseline seen by the post 1.69, price after unwind 1.00, call settles WRONG, settler takes 0.2 IMD of the 2 IMD bond. The attacker's swap fees exceed the bounty, so this is griefing rather than profit, and the README already documents the observation-side analogue. The Annex has no seal to mitigate it; a `maxBaseline`/`minBaseline` argument would close it in a few dozen bytes.\n\n**Leads checked and closed**\n\n- Callback stipend: 171,362 gas with an EOA signer and 178,500 gas with an ERC-1271 contract signer at the full four-hook list, both under 200k. I could not confirm whether the mainnet signer has code because the public RPC was unreachable, so I measured both paths.\n- EIP-712 digest and callback selector match the protocol vector for the Annex deployed at the vector address.\n- The body key `guards.mustHaveCode` is valid: the repo's paid probe used it and was attested.\n- Hook permission constants match v4's library bit for bit. The guard hook carries only bit 13.\n- Runtime is 24,293 bytes, 283 bytes under EIP-170.\n- Static-analysis leads in the Annex (strict equalities, uninitialized locals, reentrancy-after-call) are all benign on inspection: statuses are written before external calls, every externally-triggered callback is sender-gated, and no approval residual survives.\n\n**Coverage.** Every Annex entry point is `holds` except `post` (finding 1). Hook entry points the Annex depends on (`fundPot`, `beforeSwap`/`afterSwap` on the quiet-buy path, `beforeInitialize`, `unlockCallback` ACT_FUND) are `holds` for the traced path. Router, Judge, Pages and Treasury entry points are marked `unreached` as outside my area. The whole local suite passes: 287 tests including the scratch probes.","treeHash":null,"usage":{"cachedInputTokens":3515573,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":69057,"runtime":"claude","turns":37,"wallClockMs":1742912}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8472a2af9a9cf974","findings":[{"citation":"resolved","description":"Settling my round-1 high (8c23b075): fixed. observe now reads a venue with no in-range liquidity at its standing slot0 price through _spot (line 518-525), the priceless-reading branch is gone from settle and _moreAdverse, and a right BUY call on a single-range pool that sold out above its target settles Right with the bond returned (my re-run of the exact round-1 scenario, test/scratch/AnnexSoldOutRecheck.t.sol, passes: status Right, carol's IMD unchanged, alice claims 10 IMD; the author's testSoldOutRangeStillSettlesRight covers the same). The closure of baf2967b stays: a pulled pool keeps its last price and a wrong call on it is still Wrong (testEmptiedVenueForfeitsInsteadOfRefunding). What the fix leaves, and what AGENTS.md and ADAPTATION.md now state ('Do not post on a venue whose whole liquidity one party can pull'): once a pool has NO position at all, a 1-wei exact-input swap moves slot0 to any sqrt limit for nothing, _spot clamps it to [1e20, 7e37] and records the extreme as a real price (1 wei or ~7.8e35 IMD per 1e18 X), and the most adverse reading of the window decides. So the party who can pull the venue's whole liquidity (the single LP of a launched-token pool, if its position is not locked), or anyone at all after such a pull, can push the price X-worthless, observe, and later settle every BUY call on the venue as Wrong for KEEPER_BPS of each bond, and symmetrically push it X-dear against every SELL call; the cost is gas. Before this revision the same state refunded the bond (VoidNoData); the author chose forfeit-on-standing-price to close the LP's self-rescue and documented the flip. I record it so the trade-off is on the record; it is a design choice the brief's 'most adverse decides' rule implies, the warning is in the integration guide, and no code change is asked for.","line":520,"path":"src/MarginaliaAnnex.sol","reproduction":"test/Annex.t.sol testAPulledPoolPushedToAnExtremeIsReadAtTheExtreme (lines 933-964, passes on this tree): alice BUY +20% 1 IMD and bob SELL -20% 1 IMD on the X/IMD guarded pool; at horizonEnd the single LP removes its whole [-6000, 6000] position; FreeSwapper.push to MAX then MIN sqrt price moves slot0 for zero amounts (the helper requires amount0 == amount1 == 0); readings record xRead > 1e30 and xRead == 1; a keeper's adverse push plus observe is kept as the most adverse reading; settle by carol: both calls Wrong, both bonds forfeited with 10% to the settler. Expected under the documented rule: exactly this (Wrong). Noted because the same actions on an unpulled pool cost real capital, and on a pulled one cost nothing.","severity":"info","snippet":"        if (sqrtP < SQRT_FLOOR) sqrtP = SQRT_FLOOR;\n        else if (sqrtP > SQRT_CEIL) sqrtP = SQRT_CEIL;\n        xRead = pricer().fromSqrt(sqrtP, v.xIsToken0);","title":"On a venue whose every position has been pulled, the clamped standing price is free to move both ways, so one keeper can forfeit every open call on it for the 10% cut (documented residual of the 8c23b"}],"hash":"af1a65903cc6ae8cbabe25a1a1819df875823506cae90da43325ead77c9e9545","nodeId":"de72d744-1e13-49e2-b904-416388d4de85","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the scratch test is removed, and the tree is otherwise unchanged.\n\n**Round-1 findings settled**\n\n- **High, sold-out range settled WRONG (8c23b075): fixed.** The Annex now reads a venue with no in-range liquidity at its standing slot0 price, clamped to the pricer's expressible range, and the priceless-reading branches are gone from settle and the replacement rule. I re-ran my exact round-1 scenario as a fresh scratch test. A held BUY call whose single-range pool sold out above the target now settles Right, the settler's balance is unchanged, and the author claims the full 10 IMD bond back. The earlier closure also survives: a pulled pool keeps its last price, so a wrong call on it is still forfeited.\n- **Info, MARG venue baseline bound (30d57a4c): resolved as documented.** The integration guide now says the MARG venue is the one where the exactly quoted price is refused, and a test pins it. No code change was asked for.\n\n**Pre-fix specialist findings** were all from an older tree. The baseline sandwich is closed by the baseline bound, the flash dump-observe is closed by the locked-manager check, and the pulled-liquidity refund is closed by the standing-price read. The rest, such as author self-settlement, the fixed signer, the literal hold rule and the missing failure callback, are design points the integration guide states. None reopens.\n\n**One new note, info only, not blocking.** Once a venue has no position at all, the standing price moves for nothing in both directions, and the clamped extreme is recorded as a real price. Whoever can pull a venue's whole liquidity, or anyone after such a pull, can then forfeit every open call on it for the 10% settler cut. This is the acknowledged residual of the fix, stated in the guide and shown by the author's own test. I recorded it so the trade-off is on the record.\n\n**Deployability holds.** The runtime is 24,493 bytes against the 24,576 limit, the constructor reads no chain state, and the manifest's four arguments match the brief, including the action bytes.\n\nCoverage answers all 48 entry points. The nine Annex functions, the MARG token and the hook's fundPot and unlockCallback are traced as holding. The remaining live-contract functions of the hook, judge, router, pages and treasury are marked unreached because they are not deployed by this launch.","treeHash":null,"usage":{"cachedInputTokens":2253897,"inputTokens":580,"model":"claude-fable-5-1","outputTokens":29779,"runtime":"claude","turns":20,"wallClockMs":1124852}},{"artifacts":[],"attempt":1,"bundleHash":"cd7e3f34cd713306a51782327e868dc7d9dc6cad4b9ae98352af1eb94aba407f","device":"61b4050710026370","findings":[],"hash":"b42cf4d82c4b014d457b86f67c5b24d5b06595f40954888f7605b3c4a8b5a513","nodeId":"e6102ba0-936c-4275-bba8-f70b2f059f73","outcome":"completed","summary":"The responses file is in place (git's local exclude list hides it from status, which is the harness's own setup). Build and tests are green. Work is complete.\n\n## Recap\n\nAll three reopened findings reproduced against the accepted code and are fixed in `src/MarginaliaAnnex.sol`. Runtime is now 24,501 bytes, 75 under EIP-170.\n\n**Fixed (reproduced first, each with a kept regression test in `test/Annex.t.sol`):**\n- **Flash dump-observe-rebuy** (high). The attacker contract settled a RIGHT call Wrong and took 0.2 IMD. Now `observe` and `checkpointVenue` revert `Unlocked` whenever the PoolManager's transient lock slot is set, so no price is read from inside anyone's unlock. The \"most adverse decides\" rule is untouched. The residual, a three-transaction builder bundle, is stated plainly in ADAPTATION.md since the live hook shares it and the brief fixes the rule.\n- **Emptied venue refunds a wrong call** (medium). Pulling liquidity gave VoidNoData and returned 10 IMD. Now an observation on a venue with zero in-range liquidity records a priceless reading, ranked above any price, and settle treats it as adverse: Wrong, or VoidSold on a sold BUY. Genuine no-observer windows still refund.\n- **Sandwiched baseline** (medium). A same-block pump set the baseline 32% high and the call settled Wrong. `post` now takes a sixth argument, `baselineBound`, checked right after the baseline read, reverting `Slippage` with nothing taken. Zero keeps the old behaviour. The checkpoint path is closed by the same unlock rule. AGENTS.md and README.md document the new signature.\n- **noteOf on unknown id** (info). Now reverts `NotOpen`, matching the hook.\n\n**Disputed with documentation, no code change:** author settling their own forfeit (a second wallet bypasses any exclusion), Intake v1 trust assumptions (the brief pins them), and rebasing-token hold-rule behaviour (now a stated limitation in AGENTS.md).\n\n**Verification:**\n\n| Check | Result |\n|---|---|\n| `forge test --match-path test/Annex.t.sol` | 26 passed |\n| Full suite excluding scratch and fork | 289 passed |\n| Protected `Contracts.protected.t.sol` on the new bytecode | 1 passed |\n\nNot run: the mainnet fork suite, since no RPC URL is set. `.imd-responses.json` answers all seven findings.","treeHash":"a6d68df059a70bcf1c5c4367a621eb4155c4e05f","usage":{"cachedInputTokens":2782944,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":45317,"runtime":"claude","turns":37,"wallClockMs":947203}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f768e94767a9dde3","findings":[{"citation":"resolved","description":"Reported by write_foundry_tests (82f57d14); reproduced. The fix for baf2967b makes observe record a priceless reading (xRead == 0) whenever manager.getLiquidity(poolId) == 0 (line 333-335), _moreAdverse ranks it above any price (line 473: 'nothing is more adverse than no price'), and settle books any priceless reading as Wrong (line 378 `} else if (emptied) {`), paying KEEPER_BPS to the settler and the rest to hook.fundPot. But v4's getLiquidity is the liquidity active at the current tick, not the pool's total: it is also zero when the price has moved past the last initialised tick of a concentrated position while every LP position is still in place. That is exactly what a correct BUY call on a single-range launched-token pool looks like once the pool sells out above the target, and symmetrically a correct SELL call once it sells out below. The pool still has a standing slot0 price (readable with getSlot0; the pricer's fromSqrt prices it), and the author still holds, yet the call is scored Wrong, the bond (0.25 to 10 IMD) goes 10% to the settler and 90% to the pools, and claimDeposit reverts. Before this revision the same state refunded as VoidNoData (the pricer reverted EmptyPool), so this is a regression the revision introduced. It is also a new third-party attack: pushing the price in the call's OWN direction past the range edge for one standing block (buy out the range in tx 1, observe in tx 2, sell back in tx 3; cost = the round-trip fee) plants a priceless reading that no later honest reading can displace, then settle for 10%. The Annex checks nothing about position ranges, so only a venue with a full-range position is immune. Fix shape that keeps the LP-pull closure: when getLiquidity is zero, read getSlot0 and price the standing sqrtPrice (a pulled pool keeps its last traded price, so a call that was wrong on it stays wrong), and reserve the priceless/adverse reading for an uninitialised pool (sqrtPrice == 0); or treat a priceless reading as adverse only when the standing price has not crossed the call's target in its own direction.","line":333,"path":"src/MarginaliaAnnex.sol","reproduction":"test/scratch/AnnexSoldOutRange.t.sol (fails on this tree: 'a right call pays the settler nothing: 1000000000000000000 != 0'). Local PoolManager, the hook deployed at a mined address with the four implementations etched, an X/IMD pool behind a guard-shaped hook at 0x7000...2000, price 1:1, ONE position in ticks [-6000, 6000] of 10,000,000 liquidity; alice holds 1,000 X; the Annex venue checkpointed an hour earlier. (1) alice: annex.post(BUY, targetBps 12000, horizon 1 day, bond 10 IMD, minMargOut 0, baselineBound 0) -> noteOf(id).postPrice == 1e18. (2) next block, bob swaps 4,000,000 IMD into the pool for X with the limit at MAX/MIN sqrt price: the price crosses tick 6000, manager.getLiquidity(poolId) == 0, slot0 prices X above 1.2 IMD (fromSqrt(sqrtP) > 1.2e18), every LP position is still in place, alice still holds 1,000 X. (3) Three annex.observe(id) at horizonEnd, +30 min/+25 blocks, +61 min/+50 blocks: all three record xRead == 0. (4) At horizonEnd + 6h + 1, carol: annex.settle(id). Expected: status Right (1), carol's IMD unchanged, alice: claimDeposit(id) returns 10 IMD. Actual: status Wrong (2), carol receives 1 IMD, 9 IMD go to hook.fundPot, records(alice).wrong == 1, claimDeposit reverts NothingToClaim.","severity":"high","snippet":"        if (manager.getLiquidity(PoolId.wrap(n.venue.ref)) != 0) {","title":"A right call whose venue's price ran past its concentrated range is settled WRONG and forfeited: zero in-range liquidity is read as a pulled pool"},{"citation":"resolved","description":"Reported by write_foundry_tests (0572b6c9); reproduced. post buys MARG with 0.35 IMD on the launch pool (line 259) and only afterwards reads the baseline (line 280, `n.postPrice = postPrice(v, p.side == T.Side.Buy);`), which folds in the posting block's spot. When X is MARG the author's own purchase moves that spot, so a BUY call whose baselineBound equals the value annex.postPrice(venue, true) returned a moment earlier is refused with Slippage, while on every other venue an equal bound posts (the author's own test testBaselineBoundIsInclusiveAtTheBaselineAndOffAtZero). AGENTS.md says to allow a few percent, but does not say the MARG venue is the one that needs it. Documentation nuance; no code change asked for. Measured: quoted 1.000000e18, recorded postPrice 1.000000069e18 (+6.9e-8 on the 10M-liquidity fixture pool; larger on a thinner one).","line":259,"path":"src/MarginaliaAnnex.sol","reproduction":"Same harness; the MARG/IMD launch pool venue checkpointed an hour earlier. b = annex.postPrice(annex.validateVenue(margBuyNote, key), true) == 1e18. alice: annex.post(margBuyNote BUY +20%, key, bond 1 IMD, minMargOut 0, baselineBound b, deadline now+1). Expected (naive reading of AGENTS.md): posts. Actual: reverts Slippage. With baselineBound = b * 101 / 100 the same call posts and records postPrice 1000000069125001194.","severity":"info","snippet":"        _buyMarg(STAMP + MARG_BUY, MARG_BUY, minMargOut, author);","title":"On the MARG venue a BUY call bounded at the exactly quoted postPrice reverts Slippage: the post's own 0.35 IMD purchase lands before the baseline is read"}],"hash":"c8a2a128426a9a272002908e4b6f8d7084a92973abd658bb38802adb8d74c659","nodeId":"de72d744-1e13-49e2-b904-416388d4de85","outcome":"completed","summary":"The review is done and written to `.imd-findings.json`. The scratch proof is under `test/scratch/`, which is not kept, so the tree shows no other change.\n\n**Settlement of my earlier findings**\n\n- **cc1b37a1 (high, atomic dump-observe-rebuy): fixed.** `observe` and `checkpointVenue` now read the manager through `_lockedManager`, which reverts `Unlocked` when the PoolManager's transient lock slot is set. The slot matches the vendored v4-core `Lock.sol`, and the author's two regression tests pass. The stated residual holds: a builder bundle of three separate transactions in one block is not an unlock, as on the live hook.\n- **baf2967b (medium, LP pull turns a wrong call into a refund): fixed for the reported state**, but the fix over-reaches. See the new finding below.\n- **552c2633 (medium, unbounded post baseline): fixed.** `post` takes `baselineBound`; a sandwiched post reverts `Slippage` and the whole transaction unwinds, so nothing is taken. The checkpoint path is closed by the same `Unlocked` rule.\n- **7842833a (info, noteOf on an unknown id): fixed.** It now reverts `NotOpen`.\n- **7c77dba1, 0869bd11, dfe3edd0 (low, disputed):** each still reproduces as described and is now documented. The brief fixes the keeper rule, the Intake version and the constants, so I dropped them as defects.\n\n**Findings this round**\n\n1. **High, `src/MarginaliaAnnex.sol` line 333.** The revision reads zero in-range liquidity as a pulled pool. v4's `getLiquidity` is also zero when the price has moved past the only position's range with every LP still in place. That is what a correct BUY call looks like on a single-range launched pool once it sells out above target. My standalone proof posts a +20% BUY call, buys the pool past tick 6000, takes three readings, and settles: expected Right with the bond back, actual Wrong, 1 IMD to the settler, 9 IMD to the pools. Before the revision the same state refunded as VoidNoData, so this is a regression, and a third party can trigger it by pushing the price in the call's own direction for one standing block. The proof fails on this tree for that reason and is attached.\n2. **Info, line 259.** On the MARG venue the post's own 0.35 IMD purchase lands before the baseline is read, so a BUY call bounded at the exactly quoted `postPrice` reverts `Slippage`. Measured: quoted 1.0e18, recorded 1.000000069e18. Documentation nuance only.\n\nThe specialists' other findings were pre-fix reports of the same root causes as cc1b37a1 and 552c2633 and are merged into those settlements.\n\n**Coverage:** all 48 entry points have a row. The nine Annex entry points, the three MARG token functions and `MarginaliaHook.fundPot` are traced. The remaining live hook, judge, router, treasury and the not-yet-launched Pages entry points are marked unreached, since they are outside this launch and I did not re-trace them this round.","treeHash":null,"usage":{"cachedInputTokens":1688368,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":23898,"runtime":"claude","turns":25,"wallClockMs":723039}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b37e4ab65246705","findings":[{"citation":"resolved","description":"Economic Security / Flow Gap (periphery x execution x first principles). The forfeiture rule is the only economic security of a call: WRONG and VOID_SOLD send the bond to the hook's pools with 10% to the settler. But an observation can only be recorded while the venue has active liquidity: `pricer().observe` -> `_spotInQuote` reverts `EmptyPool` when `manager.getLiquidity(poolId) == 0` (src/MarginaliaPricer.sol:236), so `observe` reverts for everyone. `settle` then takes the `count < OBS_MIN` branch, books `VoidNoData`, skips `_forfeit`, and `claimDeposit` returns the whole bond to the author. The hold rule is checked only after the count check, so a BUY author who also sold X escapes VOID_SOLD the same way. Zeroing active liquidity for the six-hour window needs no price control and costs no fees: the LP removes its position at `horizonEnd` and re-adds it after `horizonEnd + 6h`. Pushing the tick past every position's range on a thin pool does the same. This is precisely the normal state of the Annex's target venues: an IMD-launched token behind the guard hook typically has one liquidity provider, the project, and the brief invites projects (class Agent) to post calls on their own token. A dead token (rug, liquidity pulled) is also the case where a BUY call is most wrong, and it is the case the contract cannot punish. Victims: the writers' pools (90% of the bond) and the settler (10%). Gain: the whole bond, up to 10 IMD per call, at zero cost; the score hit is identical to WRONG, so the author loses nothing by choosing this path. The hook shares the rule for its v4 venues, but on the MARG pool liquidity is many-handed; the Annex makes the single-LP venue the common case. Fix options that keep every number: in `settle`, when fewer than OBS_MIN readings exist but the venue was alive at post and `observe` was impossible (record an `unobservable` reading in `observe` when the pricer reverts with EmptyPool, or count a zero-liquidity reading as adverse for both sides), book the bond as forfeited rather than returned; or require the author to call a `confirmAlive` style check (a documented design choice for the author; do not change the return on genuine no-observer VoidNoData).","line":344,"path":"src/MarginaliaAnnex.sol","reproduction":"State: X/IMD v4 pool behind the guard hook (0x...2000) at price 1, one LP position (the author's wallet `lp`) of 10,000,000 liquidity in [-6000, 6000]; alice holds 1,000 X and 1,000 IMD; the Annex window is one hour old. Calls: (1) alice: annex.post(BUY, targetBps 12_000, horizonDays 1, bond 10e18) -> annex holds 10 IMD. (2) Price never moves. At horizonEnd: lp.modify(xKey, -6000, 6000, -10_000_000e18) -> manager.getLiquidity(id) == 0. (3) Every annex.observe(id) during [horizonEnd, horizonEnd + 6h] reverts MarginaliaPricer.EmptyPool. (4) At horizonEnd + 6h + 1: lp.modify(... +10_000_000e18) restores the pool; keeper: annex.settle(id). Expected: status Wrong, pools +9 IMD, keeper +1 IMD, claimDeposit reverts NothingToClaim. Actual: status VoidNoData, pools +0, keeper +0, alice: annex.claimDeposit(id) returns 10 IMD. Proof test test/scratch/AnnexEconomics.t.sol fails on this tree with 'an emptied venue must not hand a wrong call's bond back'.","severity":"medium","snippet":"        if (count < OBS_MIN || obs[count - 1].timestamp - obs[0].timestamp < OBS_MIN_SPAN) {\n            outcome = T.Status.VoidNoData;","title":"Whoever controls a venue's active liquidity converts a WRONG call into VoidNoData and recovers the bond"},{"citation":"resolved","description":"Economic Security (cheapest griefing vector). `checkpointVenue` is permissionless and, on v4 venues, folds the current spot into the window's extremes (`xMax` for BUY, `xMin` for SELL) without replacing `startedAt`. A griefer can swap, checkpoint and unwind in one transaction: the pumped reading becomes `xMax` and every BUY call priced on that window (`postPrice` = max(xMax, spot)) must now beat the pumped price times its target. The window cannot be reset while live (up to six hours); after it expires the same griefer re-checkpoints with a pumped reading again, so posting on a venue can be kept impossible for the price of the round-trip fee each six hours. On the Annex the venues are thin launched-token pools, so the fee is small. This is the adverse-extreme baseline the design asks for (self-serving manipulation is impossible), so impact is denial of posting on a venue, not loss of funds.","line":217,"path":"src/MarginaliaAnnex.sol","reproduction":"State: X/IMD pool at price 1 with 10,000,000 liquidity in [-6000, 6000], fee 3000, Annex window one hour old; honest annex.postPrice(v, true) == 1e18. Griefer in one tx: swapper.swap(IMD in, 3,000,000e18) -> annex.checkpointVenue(p, xKey) -> swapper.swap(X back). Measured (test/scratch/AnnexWindowGrief.t.sol, testStrangerPumpCheckpointUnwindRaisesTheBuyBaseline): griefed postPrice == 1.6877e18 (1.69x), round-trip cost 15,912 IMD on this deep pool; on a 10,000-liquidity launched pool the same ratio costs about 16 IMD. alice's subsequent BUY +20% call stores postPrice 1.6877e18, so it needs the real price to reach 2.03x. Expected: a checkpoint reading from a swap in the same transaction should not become the baseline for an hour-plus window; actual: it does, for the rest of the window.","severity":"low","snippet":"        T.PriceWindow memory w = pricer().checkpoint(hook.poolManager(), v, hook.imd(), priceWindows[id]);\n        priceWindows[id] = w;","title":"A stranger's pump-checkpoint-unwind sets an unreachable BUY baseline on a venue for up to six hours"},{"citation":"resolved","description":"Economic Security (legitimate feature turned against the protocol). `settle` pays KEEPER_BPS of a forfeited bond to `msg.sender` with no exclusion of the note's author. An author whose call is WRONG or VOID_SOLD simply calls `settle` first (there is no delay or priority for third parties once the window closes) and receives 10% of their own bond back, so the pools receive 90% rather than the full forfeit the brief states. The same path makes `retract` strictly dominated on money (it forfeits 100% with no keeper cut); only the half score motivates it. Bounded at 1 IMD per note and non-compounding; the hook has the same shape.","line":371,"path":"src/MarginaliaAnnex.sol","reproduction":"alice: annex.post(BUY, 12_000, 1 day, bond 10e18); three spaced observations with the price unchanged; at horizonEnd + 6h + 1 alice calls annex.settle(id). Measured (test/scratch/AnnexWindowGrief.t.sol, testAuthorSelfSettlesForTenPercent): status Wrong, alice's IMD balance rises by 1e18, the pools receive 9e18. Expected per the brief: the wrong bond is forfeited to the pools with the keeper cut going to an independent settler.","severity":"low","snippet":"            _forfeit(n, msg.sender);","title":"The author can settle their own forfeit and keep the 10% keeper cut, so a WRONG bond costs 90%"},{"citation":"resolved","description":"Economic Security (dependency failure). The Intake spends the price and never calls the consumer when the body is refused (status 1) or the 5-of-4 panel does not agree (status 2); the oracle-consumer reference asks consumers on a version 2 Intake to use `requestWithFailure` and to give every pending request a deadline after which it can be cleared. The Annex uses `request`, so a failed admission leaves `admissionLists[requestId]` populated forever, emits nothing, and the asker (up to MAX_PRICE 1 IMD) learns the outcome only off chain. There is no refund the contract could pay, so the loss is the price itself, bounded and expected by the oracle's terms; the gap is the missing signal and the permanent stale entry. Not a loss path beyond the fee; reported for completeness of the admission flow.","line":560,"path":"src/MarginaliaAnnex.sol","reproduction":"carol: annex.requestAdmission([TAXER]) pays 0.5 IMD; the panel splits 3/2 (agreed 3 < quorum 4), the Intake completes with status 2 and calls nothing. State afterwards: admissionLists[requestId].length == 1, consumed[requestId] == false, admittedHook[TAXER] == false, no event. Expected: an onOracleFailure-style callback or a clearable deadline records that the request ended; actual: nothing on chain distinguishes a pending request from a dead one.","severity":"low","snippet":"        requestId = intake.request(","title":"requestAdmission has no failure path: a disagreeing panel spends the asker's IMD silently and leaves the request pending forever"}],"hash":"cfc87a3f342520cb64e822b2b226bba900db63a12cdcf3fd2d64f83803943e4c","nodeId":"70145d41-81b0-4f97-943f-7bf5adc9ee59","outcome":"completed","summary":"The review is complete and the findings file is written. Working tree shows no tracked changes beyond the untracked findings file and the scratch tests (`.imd-findings.json` and `test/scratch/` are ignored or untracked, as intended).\n\n## Summary\n\nI audited the MarginaliaAnnex economics against the Economic Security, Invariant and Flow Gap guides. The shipped Annex suite passes as is. I reported four findings, one medium with a failing proof test, three low, and a coverage row for all 51 listed entry points plus three invariants.\n\n**Finding 1 (medium, with proof).** Whoever controls a venue's active liquidity can turn a WRONG call into VoidNoData and recover the bond. The pricer reverts `EmptyPool` when active liquidity is zero, so every `observe` fails for the whole six-hour window. `settle` then takes the under-three-readings branch, books VoidNoData, skips the forfeit, and `claimDeposit` returns the full bond. The hold rule is checked after the count check, so a BUY author who sold also escapes VoidSold this way. This costs nothing: the LP removes the position at the horizon and re-adds it after the window. On the Annex's target venues, a launched token behind the guard hook with the project as sole LP, this is the normal state. The proof test at `test/scratch/AnnexEconomics.t.sol` fails on this tree with a 10 IMD bond returned instead of 9 IMD to the pools and 1 IMD to the settler.\n\n**Finding 2 (low).** A stranger can pump, `checkpointVenue`, and unwind in one transaction. The pumped reading becomes the BUY baseline for the rest of the live window. Measured on the fixture: baseline 1.69x the real price, repeatable every six hours. Denial of posting, not loss. The live router shares this.\n\n**Finding 3 (low).** The author can settle their own forfeit and keep the 10% keeper cut, so a WRONG bond costs 90%, and `retract` is strictly dominated on money.\n\n**Finding 4 (low).** `requestAdmission` uses `request` without a failure path. A disagreeing panel spends the asker's IMD silently and the request stays pending forever.\n\n**Checked and holding.** Post pulls exactly stamp plus buy plus bond, the 25:10 split with `minMargOut` on the author share, post balance read after the take, baseline nonzero, counter rules, callback access, oracle verification and admit-only-asked-and-named, forfeit split, and the IMD balance invariant. The atomic dump-observe-unwind on v4 venues is documented as accepted design in SPEC.md and README.md, so I did not report it.","treeHash":null,"usage":{"cachedInputTokens":3683329,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":56528,"runtime":"claude","turns":45,"wallClockMs":1232595}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"918f8261a6fd589c","findings":[{"citation":"resolved","description":"Boundary x invariant (Numerical Gap seam 3). The Annex settles a v4 call on the observation least favourable to it: _settlementPrice prices each stored observation alone and keeps the minimum for a BUY (maximum for a SELL). An observation is the pool's slot0 at the moment observe(id) runs, observe may be called from inside any caller's own PoolManager unlock (a nonReentrant guard would not change that: the unlock is the attacker's, not the Annex's) and nothing requires the reading to come from a block in which the PoolManager is locked, and the replacement rule at lines 320-328 lets any caller overwrite the last reading at any time with one that is more adverse. So the invariant the pricer documents ('Settlement never trusts a single block', 'a pump must be held for the whole span', src/MarginaliaPricer.sol:32-38) holds only in the direction that helps the author. In the adverse direction a single PoolManager unlock is enough: swap X down, call annex.observe(id) while slot0 is at the dumped price, swap back with the quote received, settle the net fee. No block passes, no arbitrageur can trade in between, the price is restored to within 2% in the same transaction, and the only cost is the LP fee of the round trip. After the window the attacker calls settle: the call is WRONG, the author's bond (0.25 to 10 IMD) goes to the hook's pools with KEEPER_BPS 10% to the attacker, and the author's record takes -difficulty. The author has no defence: they cannot prevent observations and cannot contest one. On the launched-token pools the Annex exists for (one-sided, thin factory liquidity) the round-trip fee is small against a 1 IMD settler cut, and the attack is in any case a cheap way to forfeit any competitor's bond and destroy their record. The same lines exist on the live hook (src/MarginaliaHook.sol:536-676); the Annex extends them to every guarded pool. Minimal fix that keeps the ABI: refuse an observation while the PoolManager is unlocked (read the Lock transient slot through exttload) so a reading must survive at least one block against arbitrage, and/or require a reading to be confirmed by the next observation before it may be the deciding extreme; a stronger fix makes the deciding price the median (or second-most-adverse) of the stored readings rather than the single most adverse one.","line":431,"path":"src/MarginaliaAnnex.sol","reproduction":"Local harness (the Annex test fixture: X/IMD guarded pool at 1:1, 10M liquidity, fee 3000; alice holds 1000 X). 1) alice: annex.post(BUY, targetBps 12000, 1 day, bond 2 IMD) -> postPrice 1.000000 IMD/X. 2) bob buys X with 1.5M IMD: spot 1.321465 IMD/X, +32% over the baseline, and stays there. 3) Three honest observe(id) calls at horizonEnd, +30 min (+25 blocks), +61 min: every xRead 1.321465. 4) 25 blocks later, still in the window, an attacker contract in ONE manager.unlock: swap 4,000,000 X in (zeroForOne = xIs0), annex.observe(id) [xRead 0.621267, pushed as a 4th reading; with fewer than 20 blocks it would replace the last one because it is more adverse], swap the IMD received back into X, settle the net 20,211 X (the round-trip LP fee). Spot after the transaction: 1.0008x the market. 5) warp past horizonEnd + 6h, attacker calls settle(id). Actual: status Wrong (2), settlePrice 0.621267, 0.2 IMD paid to the attacker, 1.8 IMD to hook.fundPot, alice's record wrong += 1 and score negative, claimDeposit reverts NothingToClaim. Expected: Right (1), bond returned, nothing to the manipulator. The test in `proof` (test/scratch/AnnexAdverseObservation.t.sol) fails with `right at every real block: 2 != 1`.","severity":"high","snippet":"            try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n                if (p == 0) return 0;\n                if (i == 0 || (buy ? p < price : p > price)) price = p;","title":"One atomic dump-observe-restore inside the settlement window forfeits a RIGHT v4 call: the most adverse single-block reading decides and nothing requires it to survive a block"},{"citation":"resolved","description":"Boundary x invariant on the other end of the call. For a v4 venue the baseline is max(window xMax, current spot) for a BUY (min for a SELL) through MarginaliaPricer.postPrice, read in the posting transaction. The post pulls the stamp, the MARG purchase and the bond before the baseline is read, and the only user-side bound in post(params, v4Key, bond, minMargOut, deadline) is minMargOut, which bounds the MARG leg of the swap and nothing else. A pump landed in the same block before the post (an ordinary sandwich on a public mempool transaction, or a bundle) is therefore recorded as the baseline, the dump lands right after, and the call is judged against a price the market never traded at outside that block: in the reproduction a +20% BUY call is recorded at 1.3215 while the real price is 1.0000, X then rises 25% to 1.2545 and stays there, and the call settles WRONG with the bond forfeited (10% to the sandwicher if they settle). The author cannot refuse the baseline before the funds are pulled: validateVenue and postPrice are views they could call first, but what they see is not what the post gets. For a SELL call the same sandwich (dump before, pump after) lowers the baseline. Fix that keeps intent: let the author bound the baseline, for instance a maxPostPrice (BUY) / minPostPrice (SELL) argument checked right after line 274, as minMargOut bounds the MARG; alternatively exclude the posting block's own spot from the baseline so only readings that survived a block count (the window already requires block.number > w.blockNumber).","line":274,"path":"src/MarginaliaAnnex.sol","reproduction":"Same harness. real spot 1.000000 IMD/X. In one block: bob buys X with 1.5M IMD (spot 1.321465); alice: annex.post(BUY, 12000, 1 day, bond 2 IMD) -> noteOf(id).postPrice = 1.321465 (not 1.0); bob sells all X back (spot 1.000781). Then the market rises for real: spot 1.254468 (+25.4% over the real post-time price, above the +20% claim) and three honest observations across an hour read it. settle(id): actual status Wrong (2), 1.8 IMD to the pools, 0.2 IMD to the settler; expected Right (1) since X rose more than 20% over every price the market traded at in a locked block. The test in `proof` (test/scratch/AnnexPostBaseline.t.sol) fails with `right against any real baseline: 2 != 1`; with a baseline-bound parameter the post call in it must be adapted and would revert instead.","severity":"medium","snippet":"        n.postPrice = postPrice(v, p.side == T.Side.Buy);\n        if (n.postPrice == 0) revert InvalidNote();","title":"post records whatever spot the posting block shows as the baseline and offers no bound on it: a same-block pump before the post (sandwich) makes a BUY call unwinnable"},{"citation":"resolved","description":"Boundary guide, external call / non-standard token. _broken compares the author's current balanceOf with the balance snapshotted at post and treats any decrease as a sale. For tokens whose balanceOf moves without a transfer by the holder (negative-rebasing tokens, reflection tokens that burn from holders, tokens that charge a holding fee) a 1 wei decrease at any observation marks the call broken, settle books VoidSold, forfeits the whole bond to the pools with 10% to the settler, and scores the author -difficulty, although nothing was sold. The Annex accepts any v4 pool quoted in IMD / WETH / ETH whose hook passes the bit rule, so such tokens are reachable venues (the router's venue set is the same, but the Annex's launched-token pools are where new token designs appear). The site documentation says the hold rule is 'your X balance is snapshotted at post; if it is ever lower at an observation, the call is VoidSold', so this is a documented limitation rather than a logic slip; it is reported so the author can decide whether to tolerate a small downward tolerance (for instance ignore decreases below a few bps) or document that rebasing tokens must not be used for BUY calls.","line":456,"path":"src/MarginaliaAnnex.sol","reproduction":"Deploy an ERC-20 whose balanceOf(who) returns super.balanceOf(who) * factor / 1e18 with factor settable (a negative rebase), seed a guarded X/IMD v4 pool with it, give alice 1000 X, checkpoint, post a BUY call (postBalance = 1000e18). Before the first observation set factor = 0.999e18 (alice transfers nothing). observe x3 across an hour, settle: status VoidSold, records(alice).broken = 1, bond forfeited; expected (nothing sold) Right or Wrong on price.","severity":"low","snippet":"        return balance == type(uint256).max || balance < n.postBalance;","title":"Hold rule reads the author's balance literally, so a token whose balanceOf shrinks without a transfer (negative rebase, reflection, fee-on-hold) settles a held BUY call VoidSold and forfeits the bond"}],"hash":"d553d8d215df7a514f8ab289f96548691412c0d2eaa3beaf30329c69077b4833","nodeId":"aa6d9e2d-ba9e-4857-8ed0-e5afe2970e77","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and no tracked file was changed.\n\n**What I found**, written to `.imd-findings.json` with coverage rows for all 50 listed entry points plus three invariant rows:\n\n1. **High: one atomic adverse reading forfeits a RIGHT v4 call.** Settlement takes the single most adverse observation, and an observation is the pool's spot at the moment `observe` runs. An attacker can dump, observe, and restore inside one PoolManager unlock, so no block passes and the only cost is the round-trip LP fee. The proof test shows a BUY call that traded 32% above its baseline all window settling Wrong, the 2 IMD bond forfeited and 0.2 IMD paid to the manipulator. The hook's own lines carry the same rule. A proof file is attached and fails on the current code.\n\n2. **Medium: `post` has no bound on the baseline it records.** The baseline is read from the posting block's spot after the funds are pulled, and only the MARG leg has a user bound. A same-block pump before the post records 1.32 as the baseline while the real price is 1.00. X then rises 25% and the +20% call still settles Wrong. Proof attached, fails on the current code.\n\n3. **Low: the hold rule reads balances literally.** A token whose balance shrinks without a transfer, such as a negative rebase, turns a held BUY call into VoidSold and forfeits the bond. Reported as a documented limitation to decide on, with a concrete reproduction.\n\n**Coverage.** All nine Annex entry points were traced in depth: bond, target, horizon, text and admission bounds, window ages, the 25:35 MARG split rounding, keeper split, difficulty floor, and overflow headroom on the settle comparison all hold. The hook's `fundPot`, `beforeSwap` and `afterSwap` hold on the Annex's quiet-buy path. Judge, Pages, Router and Treasury entry points are marked unreached as outside this area.\n\n**Checks run.** The Annex suite passes 20 of 20. Both scratch proofs fail for the stated reason. Static-analysis leads in my area were examined and none substantiated as findings on their own.","treeHash":null,"usage":{"cachedInputTokens":2869934,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":54206,"runtime":"claude","turns":30,"wallClockMs":987392}},{"artifacts":[],"attempt":1,"bundleHash":"1968e0747531fab4ba1dd874eae175822c673d2066872e47641631008017812e","device":"918f8261a6fd589c","findings":[{"description":"The revision for baf2967b makes `observe` record `xRead == 0` whenever `manager.getLiquidity(poolId) == 0` (line 333) and makes `settle` treat any such reading as adverse: `emptied` forces WRONG (line 378), 10% of the bond to the settler and the rest to the hook's pools, and `_moreAdverse` (line 473) lets nothing but a hold breach replace it. The commit message and AGENTS.md describe this as 'a venue whose in-range liquidity has been pulled', but v4's `getLiquidity` is the liquidity active at the CURRENT tick: it is also zero when the price has moved past the last initialised tick of a concentrated position, with every LP position still in place. That is what a correct BUY call on a thin launch pool looks like (the pool sold out above the target), and symmetrically what a correct SELL call looks like when the pool sells out below it. The Annex checks nothing about position ranges; only a pool with a full-range position is immune. Consequences: (1) a right author on any single-range venue is scored WRONG and loses the whole bond (up to 10 IMD) to the settler and the pools, where the pre-revision code refunded it as VoidNoData (the pricer's `EmptyPool` revert) and the correct outcome is RIGHT; (2) a third party can now hurt a call by moving the price IN THE CALL'S OWN DIRECTION past the range edge for one standing block, which the pre-revision rule could never do (an adverse reading had to move the price against the call), then settle and take 10%; because 'nothing is more adverse than no price', later honest readings cannot repair it. A fix must not read 'no liquidity' as 'no price' when the pool still has a standing slot0 price (for example read `getSlot0` when liquidity is zero but the pool is initialised, or treat a priceless reading as adverse only when the price has not crossed the call's target in its own direction); the LP-pull case the review wanted closed (baf2967b) stays closed under the first option, since a pulled pool's standing price is the last traded one and a call that was wrong on it stays wrong.","line":333,"path":"src/MarginaliaAnnex.sol","reproduction":"Local fixture (test/scratch proof): X/IMD pool behind the guard hook at 1:1 with one position in ticks -6000..6000 (10,000,000 liquidity). alice posts BUY +20%, 1 day, bond 10 IMD, baselineBound 0 (postPrice 1e18). bob buys X with 4,000,000 IMD: the price crosses tick 6000 and stops at the swap's limit, `getLiquidity` returns 0, alice still holds her 1,000 X. Three observations 25 blocks apart spanning 61 minutes all record xRead == 0. After the window `settle(id)` by a third wallet: EXPECTED status Right (or at the very least no forfeit: the standing price was above target at every reading and the author held); ACTUAL status Wrong (2), the settler receives 1 IMD, 9 IMD go to the hook's pools, `claimDeposit` reverts NothingToClaim, records(alice).wrong == 1. On the unrevised code the same inputs gave VoidNoData with the bond returned.","severity":"high","title":"A right call forfeits its bond when the venue's price runs past its concentrated range: `observe` treats zero in-range liquidity as a pulled pool and settle scores the priceless reading WRONG"},{"description":"`post` buys MARG with 0.35 IMD on the launch pool (line 259) and only then reads the baseline (line 280), which includes the posting block's spot. On a call whose X is MARG the author's own purchase raises the spot, so a BUY call that passes `annex.postPrice(venue, true)` quoted a moment earlier as `baselineBound` is refused with `Slippage` (the AnnexInvariant handler found this: bound 9.73e17 quoted, baseline recorded above it). On every other venue the quote is exact and a bound equal to it posts (test `testBaselineBoundIsInclusiveAtTheBaselineAndOffAtZero`). AGENTS.md already tells agents to allow a few percent, so this is a documentation nuance, not a defect: it should say that the MARG venue needs the slack and the others do not. No change to the code is asked for.","line":280,"path":"src/MarginaliaAnnex.sol","reproduction":"Fixture: quote `b = annex.postPrice(validateVenue(margNote, key), true)` then `post(margNote BUY +20%, key, 1 IMD, 0, b, now)` in the same block. EXPECTED (naive reading of AGENTS.md): posts; ACTUAL: reverts Slippage. With b * 101 / 100 it posts.","severity":"info","title":"On the MARG venue a BUY call bounded at the exactly quoted `postPrice` reverts Slippage: the post's own 0.35 IMD purchase is folded into the baseline"}],"hash":"da534bbc65b5cd262b47651d79589cf4ea7591314fa72c365bb6808eec282a2c","nodeId":"c4514b85-d347-4eca-b101-b785dad41d91","outcome":"completed","summary":"The findings file is excluded by the network's own `.git/info/exclude`, so it is read from the working tree as the brief intends. The proof still fails on the current code. The work is complete.\n\n## Recap\n\n**What changed in the implementation after my last round, and what I did about it.** The revision added a sixth `baselineBound` argument to `post`, refused reads while the PoolManager is unlocked, made a zero-liquidity venue record a priceless reading that settles WRONG, and made `noteOf` revert on unknown ids. My two suites no longer compiled. I adapted them and left the rest as accepted.\n\n**Files touched** (only my two test files):\n- `test/AnnexAdversarial.t.sol`: signature fixes, `noteOf` now asserted to revert for hook ids, unknown ids, zero and the next unissued id. Five new tests: the bound is inclusive at the quoted baseline and refuses one wei inside with nothing taken, zero and extreme bounds are no constraint, each side is bounded against its own window extreme, priceless readings rank below a hold breach and above any price and are never replaced by one, two priceless readings still settle as no data, and an LP pull cannot turn a wrong call into a refund.\n- `test/AnnexInvariant.t.sol`: the handler now posts with a bound quoted from the contract (exact on the X venue, 1% slack on MARG), lets the venue's LP pull and refill both positions, prefers a live window when observing, and checks a reading is priceless exactly when the venue has no liquidity. All six invariants held over 96 runs of 48 calls, including sequences with priceless readings and forfeits.\n\n**Results.** `forge test` passes with 318 tests across 24 suites. `test/Annex.t.sol` alone passes its 26.\n\n**Finding reported in `.imd-findings.json`, with a self-contained failing proof.** The new rule reads zero in-range liquidity as a pulled pool, but v4's `getLiquidity` is the liquidity at the current tick. When the price runs past the last tick of a concentrated position, which is what a correct BUY call on a thin launch pool looks like, every reading is priceless and the right author settles WRONG, losing the whole bond with 10% to the settler. The pre-revision code refunded that case. A third party can also now hurt a call by moving the price in the call's own direction past the range edge for one standing block, which the old rule could not do. The proof posts a 10 IMD BUY call, buys through the range, observes three times, and shows status Wrong with 1 IMD to the settler. Rated high.\n\n**Second item, info only.** On the MARG venue the post's own 0.35 IMD purchase moves the spot before the baseline is read, so a BUY call bounded at the exactly quoted `postPrice` reverts Slippage there. The invariant handler surfaced this. AGENTS.md already says to allow a few percent, so it is a documentation nuance, not a code change.\n\n**Not run.** The fork test needs an RPC and was skipped. No Slither or Mythril ran.","treeHash":"c3f1ac68d557172eec4b541f3e51261b531d3e19","usage":{"cachedInputTokens":6017384,"inputTokens":1090,"model":"claude-fable-5-1","outputTokens":69518,"runtime":"claude","turns":72,"wallClockMs":2073739}},{"artifacts":[],"attempt":1,"bundleHash":"829dc6d7fb25db585147d05a15d86db1b4aa41ab12efd170c7e67cca2b5e18fa","device":"b4f6137e7c93a2b3","findings":[],"hash":"e33df0e0d819a4709c434df20d9e076b97300d643e3d552faa1e6ca2dd1ed4f0","nodeId":"e6102ba0-936c-4275-bba8-f70b2f059f73","outcome":"completed","summary":"The revision is complete. The reopened finding reproduced and is fixed; the advisory one reproduced and is documented with a pinned test.\n\n**The high finding, reproduced and fixed.** The reviewer's scenario failed on the unchanged tree exactly as described: a right BUY call whose pool sold out above its target settled Wrong, paid the settler 1 IMD and refused the claim. The cause was that v4's current-tick liquidity reads zero past a range's edge as well as on a pulled pool. The fix in `src/MarginaliaAnnex.sol` replaces the priceless reading with a standing-price read. A new private `_spot` helper prices the pool's slot0 through the pricer's own `fromSqrt` when nothing is in range, with the quote leg read the same way the pricer does. The pull-liquidity closure from the previous round stays, since an emptied venue is read rather than voided.\n\n**A flaw I caught in my own first draft.** Past the last initialised tick a swap moves the price for nothing, so a keeper could push a sold-out pool to an extreme the pricer cannot express and still plant an adverse \"no price\" reading. The standing sqrt price is therefore clamped into the pricer's expressible range before it is read. An extreme reads as the extreme itself, adverse to one side only, and nothing is ever a missing reading. The dead priceless branches in settle and the adverse ranking were removed.\n\n**Size.** The fix pushed the runtime over EIP-170, so I made behaviour-preserving reductions in the same file: a shared bounded read helper, literal panel numbers in the admission body with byte-identical output, a simpler form of the same hook predicate, two dead checks removed, and an unused return value dropped. Runtime is now 24,493 bytes with 83 bytes of headroom. The callback measures 167,188 gas at the full list and its write-set is untouched.\n\n**Tests and docs.**\n- `test/Annex.t.sol`: three new tests (the reviewer's sold-out scenario with free pushes both ways, a pulled pool pushed to both extremes where a keeper's reading decides, and the MARG-venue baseline note), one updated to the standing-price rule.\n- The advisory MARG-venue finding reproduced, and the reviewer asked for documentation only. `AGENTS.md` now names the MARG venue as the one where the exactly quoted bound is refused, and describes the free-swap residual on pools with no positions.\n- `ADAPTATION.md` has a new top section listing each change, why it was needed and the residual. `.imd-responses.json` answers all eight finding ids.\n\n**Verification.**\n- `forge build` clean. Annex suite: 29 passed. Full local suite outside scratch and fork: 291 passed.\n- The supplied protected contracts floor ran in scratch against the new creation code with the four constructor arguments and passed.\n- Not run: the mainnet fork suite, since there is no RPC in this environment. No build configuration, dependency, git or environment path changed, and there is no `launch.json` in the tree.","treeHash":"b15083efde466ed3cb44b498b101b0f482387e86","usage":{"cachedInputTokens":3535377,"inputTokens":836,"model":"claude-fable-5-1","outputTokens":63029,"runtime":"claude","turns":62,"wallClockMs":1766023}},{"artifacts":[],"attempt":1,"bundleHash":"6cf92c337cce68bcf0e4ea8eb3ed594b3561fcf66889702928efc8bd658d2c36","device":"589ef002581a5371","findings":[],"hash":"f4e7c7c71930afa91a13eef5e76eaa55b150650299fe8c074fd108e6822356a8","nodeId":"215639ec-256a-4e11-987c-c26776a22c35","outcome":"completed","summary":"Done. `launch.json` is written at the repository root and is the only changed file.\n\n**Manifest contents**\n\n- Kind `evm_contracts`, one contract: `MarginaliaAnnex`.\n- Constructor arguments in declaration order, matching the compiled ABI `(address hook_, address intake_, bytes32 action_, address signer_)`:\n  1. `0xf0457dd0cf526686190e4f057ba19db14d34a0cc`, the live MarginaliaHook of launch 1283.\n  2. `0x1397434cd35e8a9C8aC312A61D3A285EB31dea56`, the IdentityMD Intake.\n  3. `0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000`, which is `bytes32(\"oracle.request@oracle-1\")` as a static word.\n  4. `0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982`, the IdentityMD oracle signer.\n- These equal the hook's INTAKE, ACTION and ORACLE_SIGNER constants in `src/MarginaliaHook.sol`.\n- No `$owner`: the Annex has no owner, pause or upgrade, and its constructor takes no owner argument.\n- Notes describe the venue rule, admission, economics and the pricer address in about 2,000 characters.\n\n**Verification**\n\n- The manifest parses as JSON with exactly the keys kind, contracts and notes.\n- The constructor stores four values and reads no chain state. The signer setter only rejects zero and emits an event.\n- `forge build` succeeded.\n- `forge test --match-path test/Annex.t.sol` passed every test: 20 passed, 0 failed. The brief says 17; the accepted tree carries 20.\n- Compiled Annex runtime is 24,293 bytes, under the 24,576-byte EIP-170 limit the protected check enforces.\n- `git status` shows only the new `launch.json`.","treeHash":"9de17ba6b20cbdda6e6e162ee6dc5787396c26a3","usage":{"cachedInputTokens":176647,"inputTokens":38,"model":"claude-fable-5-1","outputTokens":1222,"runtime":"claude","turns":3,"wallClockMs":989398}},{"artifacts":[],"attempt":1,"bundleHash":"75917ad8a040961f78497bfb195ed2ce84edeeb4fc13c1555357161c30c074ec","device":"ab846a7d68ed31f8","findings":[],"hash":"fbcf15f9978f0faf1f61a7219a5b0de5728575ac31ab3d146317a2e992480623","nodeId":"c4514b85-d347-4eca-b101-b785dad41d91","outcome":"completed","summary":"Updated Annex regressions and invariants for empty-pool observations, sold-out SELL calls, and hold breaches. A bytecode-equivalent fixture change resolved compiler memory failures. All changes are under `test/`.\n\nValidation: `forge build` passed; `forge test` reported **324 passed, 0 failed, 1 skipped**. Annex invariants completed 4,608 calls with zero reverts. The mainnet fork suite skipped without RPC configuration.","treeHash":"51ef53726aa98d406001c5688a5219079d58dd3d","usage":{"cachedInputTokens":18876800,"inputTokens":245188,"model":"gpt-6-astra","outputTokens":53988,"runtime":"codex","turns":32,"wallClockMs":3192243}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"194b47a372650d59","findings":[],"hash":"fca8923ce460f44c0f7be1df39468b3514cb006791622d8c624b9a588b2a8331","nodeId":"215639ec-256a-4e11-987c-c26776a22c35","outcome":"failed","summary":"the task produced no changes; the agent's last message was: The existing [launch.json](/home/imd-worker/.identitymd/work/ceb82ab3-93fd-4157-8deb-3768fd95ff9a/215639ec-256a-4e11-987c-c26776a22c35/launch.json) already matches the required manifest structure and constructor arguments. Preserved unchanged.\n\n- `forge build`: passed.\n- `forge test`: 289 passed, 0 failed; mainnet fork test skipped.\n- All 26 Annex tests passed.\n- Runtime: 24,501 bytes, below EIP-170.\n\nNo submitted files changed.","treeHash":null,"usage":{"cachedInputTokens":3005824,"inputTokens":83131,"model":"gpt-6-astra","outputTokens":11148,"runtime":"codex","turns":18,"wallClockMs":1215764}}],"verification":[{"checks":[{"durationMs":298373,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 298.09s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[boolean-cst]: misuse of a boolean constant\n    ╭▸ src/MarginaliaAnnex.sol:489:45\n    │\n489 │         if (!ok || ret.length < 32) return (false, 0);\n    │                                             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:253:13\n    │\n253 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:295:9\n    │\n295 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:278:22\n    │\n278 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:279:17\n    │\n279 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:333:13\n    │\n333 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:334:13\n    │\n334 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:345:47\n    │\n345 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:353:9\n    │\n353 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:27\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:52\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:439:9\n    │\n439 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:398:35\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:360:13\n    │\n360 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:398:9\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:385:30\n    │\n385 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:388:26\n    │\n388 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:405:13\n    │\n405 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:412:9\n    │\n412 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:413:9\n    │\n413 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:407:30\n    │\n407 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:452:17\n    │\n452 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:488:21\n    │\n488 │         (ok, ret) = x.staticcall{gas: BALANCE_READ_GAS}(data);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:612:21\n    │\n612 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n613 │ ┃             action,\n614 │ ┃             bytes(admissionBody(hooks)),\n615 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n616 │ ┃             imd,\n617 │ ┃             price\n618 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:622:9\n    │\n622 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:605:70\n    │\n605 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:646:21\n    │\n646 │                     emit HookAdmitted(open[i], requestId);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\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/MarginaliaAnnex.sol:691:13\n    │\n691 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:672:18\n    │\n672 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:679:38\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:679:46\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:680:24\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:680:32\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:687:9\n    │\n687 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7351,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 527.51µs (0.00ns CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 14.79ms (6.67ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 16.76ms (10.73ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 18.30ms (6.63ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 19.17ms (3.48ms CPU time)\n\nRan 29 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAPulledPoolPushedToAnExtremeIsReadAtTheExtreme() (gas: 4898651)\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2491254)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 759446)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1542625)\n[PASS] testAgentClassForContractAuthors() (gas: 1208062)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1042590)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3472853)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2799765)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467516)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609075)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 135567)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 3126196)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1677805)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54539)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1851403)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2230314)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1708364)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 98895)\n[PASS] testMargVenueBaselineBoundNeedsRoomForThePostsOwnPurchase() (gas: 1102399)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 734020)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23176)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2956772)\n[PASS] testObservationWindowAndSpacing() (gas: 901122)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 857166)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137269)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 924322)\n[PASS] testRightCallReturnsTheBond() (gas: 1529261)\n[PASS] testSoldOutRangeStillSettlesRight() (gas: 3269214)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1511821)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 20.22ms (29.84ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 27.05ms (23.47ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 23150, ~: 21270)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 55.96ms (37.98ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 66.53ms (63.28ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 72.15ms (166.53ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 115.68ms (78.11ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 115.75ms (83.03ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 117.37ms (22.84ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106048, ~: 106088)\nLogs:\n  Bound result 2\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 117.51ms (106.99ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 117.49ms (575.34µs CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 117.50ms (5.61ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 128696, ~: 114042)\nLogs:\n  Bound result 2\n  Bound result 900408713292983757916083264295\n  Bound result 1659001519494594638696\n  Bound result 999999999999999999999999999997\n  Bound result 872994613650161597462999566840\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36899, ~: 36973)\nLogs:\n  Bound result 5613101\n  Bound result 11002\n  Bound result 7\n  Bound result 430735406787218593129606015839\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141451, ~: 141832)\nLogs:\n  Bound result 891100088332886822066479779486\n  Bound result 13682687152222358674533628849\n  Bound result 1496\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36744, ~: 36900)\nLogs:\n  Bound result 775268\n  Bound result 1\n  Bound result 7\n  Bound result 430735406787218593129606015839\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23402, ~: 21564)\nLogs:\n  Bound result 1461446703485210103287273052103989903735604878418\n  Bound result 1415143297959374019533231723\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39683, ~: 39274)\nLogs:\n  Bound result 3600984908010129719496491\n  Bound result 8934891560819061264952546348188087584637\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16246, ~: 14465)\nLogs:\n  Bound result 0\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 53917, ~: 51987)\nLogs:\n  Bound result 5487\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36437, ~: 36402)\nLogs:\n  Bound result 732\n  Bound result 5892\n  Bound result 2\n  Bound result 999999999999999999999999999997\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19161, ~: 17016)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21345, ~: 21299)\nLogs:\n  Bound result 18579968628053572407\n  Bound result 808777296425509421\n  Bound result 121\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 63603, ~: 59808)\nLogs:\n  Bound result 16809\n  Bound result 7\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 102186, ~: 93688)\nLogs:\n  Bound result 14\n  Bound result 245461943182716824487264065405\n  Bound result 385760083548488253384486535220\n  Bound result 793458403278049753194989591830\n  Bound result 580386815871977208491271448141\n  Bound result 28374275444609275832\n  Bound result 5\n  Bound result 1012866\n  Bound result 999999999999999999999999999998\n  Bound result 999999999999999999999999999998\n  Bound result 101383122238024215215603\n  Bound result 445018646920376171633638210852\n  Bound result 999999999999999999999999999999\n  Bound result 5161901601190919258155985504\n  Bound result 3525\n  Bound result 18820441565617130195723942133\n  Bound result 1\n  Bound result 424465786016084026594681533793\n  Bound result 220797986651378392132568219029\n  Bound result 868608285793234304623663409072\n  Bound result 92995996730701441632707229491\n  Bound result 363319010905451561816222803801\n  Bound result 999999999999999999999999999997\n  Bound result 55168118316422284143124375731\n  Bound result 677284864803\n  Bound result 111\n  Bound result 977686830650172835718288913604\n  Bound result 32803562704008637087348611358\n  Bound result 53011101270793752413645112444\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 117.51ms (1.10s CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 117.10ms (1.73ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 117.65ms (28.52ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838166, ~: 838176)\nLogs:\n  Bound result 7845969975746729786\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58959, ~: 58968)\nLogs:\n  Bound result 250000000000000002\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 118.75ms (213.53ms CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 5)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 217   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 218   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 453   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 219   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 215   | 5       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 196   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 200   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 202   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 50000000000000000\n  Bound result 52292\n  Bound result 92\n  Bound result 1\n  Bound result 22549\n  Bound result 1\n  Bound result 1015000000000000000000\n  Bound result 58454\n  Bound result 98\n  Bound result 1844\n  Bound result 0\n  Bound result 4193069140106\n  Bound result 50019\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000\n  Bound result 11\n  Bound result 6\n  Bound result 0\n  Bound result 240\n  Bound result 4938\n  Bound result 0\n  Bound result 1979777740593664616655\n  Bound result 50032\n  Bound result 29\n  Bound result 0\n  Bound result 0\n  Bound result 220\n  Bound result 201\n  Bound result 2\n  Bound result 0\n  Bound result 10000000000000000002360\n  Bound result 0\n  Bound result 2\n  Bound result 400000000000000000000\n  Bound result 1\n  Bound result 0\n  Bound result 467766399817206126207\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 2989\n  Bound result 50942\n  Bound result 94\n  Bound result 2\n  Bound result 1\n  Bound result 71010037920623610405\n  Bound result 2\n  Bound result 2\n  Bound result 10\n  Bound result 1\n  Bound result 2939082604\n  Bound result 17\n  Bound result 2\n  Bound result 2\n  Bound result 0\n  Bound result 0\n  Bound result 137206755869780225311\n  Bound result 5273\n  Bound result 2\n  Bound result 6000\n  Bound result 2\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 604799\n  Bound result 9577\n  Bound result 60\n  Bound result 2\n  Bound result 10500\n  Bound result 11435\n  Bound result 17\n  Bound result 2982\n  Bound result 2\n  Bound result 13807\n  Bound result 2\n  Bound result 973079788987075031674\n  Bound result 10002\n  Bound result 48\n  Bound result 0\n  Bound result 5400\n  Bound result 2413\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 455.62ms (445.83ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2527  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2454  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2491  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2388  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2428  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 828066563558574777042168\n  Bound result 8088\n  Bound result 2993782792835301376\n  Bound result 1832736856\n  Bound result 4945\n  Bound result 94852\n  Bound result 2174\n  Bound result 6105\n  Bound result 40000\n  Bound result 5836\n  Bound result 1800003600\n  Bound result 162258\n  Bound result 65000000000000000\n  Bound result 10000000000000000000000\n  Bound result 163271366443441129591558\n  Bound result 49\n  Bound result 9344\n  Bound result 1336\n  Bound result 180319948891367460030091941535420926414557573971\n  Bound result 9600000000000000000\n  Bound result 240\n  Bound result 6362\n  Bound result 556248281403800660139171114472365505398652072478\n  Bound result 1383346711581696184\n  Bound result 0\n  Bound result 807\n  Bound result 3609\n  Bound result 172800\n  Bound result 950585103117042893264631\n  Bound result 1000000000000000000000000\n  Bound result 3567\n  Bound result 2308\n  Bound result 94176\n  Bound result 122\n  Bound result 19\n  Bound result 999999999999999999999976\n  Bound result 19\n  Bound result 4\n  Bound result 168340\n  Bound result 1\n  Bound result 29927\n  Bound result 6256\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.07s (1.06s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 518   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 498   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 529   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 547   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 518   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 487   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 513   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 496   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 488   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 528   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1030  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 526   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 538   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 529   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 480   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 520   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 479   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2450000\n  Bound result 99999000000000000021220\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 99999000000000000004097\n  Bound result 60186455830861534859\n  Bound result 99999000000000000000211\n  Bound result 2\n  Bound result 98000000000000008397\n  Bound result 1\n  Bound result 4\n  Bound result 112\n  Bound result 98000000000000054773\n  Bound result 5\n  Bound result 5\n  Bound result 1\n  Bound result 98000000001412685869\n  Bound result 1\n  Bound result 2\n  Bound result 10000000000000000000\n  Bound result 99476012366049991642\n  Bound result 2989\n  Bound result 4\n  Bound result 16958\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 8\n  Bound result 9750000000000008562\n  Bound result 100000\n  Bound result 9\n  Bound result 10\n  Bound result 8073774821725156283108\n  Bound result 88264337592735499697\n  Bound result 4674\n  Bound result 21894\n  Bound result 10\n  Bound result 11\n  Bound result 100000000000000000000\n  Bound result 9\n  Bound result 99999000000000000000480\n  Bound result 9750000000000004727\n  Bound result 1\n  Bound result 9750000000000000031\n  Bound result 749999999999999797\n  Bound result 99999000000000000000009\n  Bound result 98000000000000005071\n  Bound result 4\n  Bound result 10\n  Bound result 6\n  Bound result 98000000003674537644\n  Bound result 95813\n  Bound result 59600000000000000000\n  Bound result 7\n  Bound result 105638\n  Bound result 16\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.21s (7.21s CPU time)\n\nRan 23 test suites in 7.22s (10.22s CPU time): 292 tests passed, 0 failed, 1 skipped (293 total tests)\n","passed":true},{"durationMs":225,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":611,\"AGENTS.md\":126,\"README.md\":247,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"launch.json\":15,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":695,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":1053,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3a68daf16509996ae132808ee1cf74885a1153ee73b1e1a50a59eabb3d4835fa","verifiedTreeHash":"45da8ee05cbd23c4971ef4f7378ee944ae9d626f","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":265901,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 265.66s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' 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/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:638:28\n    │\n638 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:246:13\n    │\n246 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:289:9\n    │\n289 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:271:22\n    │\n271 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:272:17\n    │\n272 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:338:74\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                                          ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:338:81\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\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/MarginaliaAnnex.sol:327:13\n    │\n327 │         if (block.timestamp < end) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\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/MarginaliaAnnex.sol:328:13\n    │\n328 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:344:47\n    │\n344 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:352:9\n    │\n352 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:27\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:52\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:442:9\n    │\n442 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:374:17\n    │\n374 │             if (settlePrice == 0 && !emptied) {\n    │                 ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:373:18\n    │\n373 │             if (!emptied) settlePrice = _settlementPrice(n, obs);\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/MarginaliaAnnex.sol:359:13\n    │\n359 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:401:9\n    │\n401 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:388:30\n    │\n388 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:391:26\n    │\n391 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:408:13\n    │\n408 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:415:9\n    │\n415 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:416:9\n    │\n416 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:410:30\n    │\n410 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:455:17\n    │\n455 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:487:13\n    │\n487 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:494:13\n    │\n494 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:593:21\n    │\n593 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n594 │ ┃             action,\n595 │ ┃             bytes(admissionBody(hooks)),\n596 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n597 │ ┃             imd,\n598 │ ┃             price\n599 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:603:9\n    │\n603 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:586:70\n    │\n586 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:627:21\n    │\n627 │                     emit HookAdmitted(open[i], requestId);\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/MarginaliaAnnex.sol:673:13\n    │\n673 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:654:18\n    │\n654 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:661:38\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:661:46\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:662:24\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:662:32\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:669:9\n    │\n669 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7127,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 785.76µs (0.00ns CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 956.72µs (401.78µs CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 16.34ms (4.74ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 22.11ms (56.37ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 36.19ms (24.67ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 36.53ms (23.04ms CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 43.55ms (1.92ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 52.01ms (85.58ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 22405, ~: 19400)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 61.37ms (45.47ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 107.02ms (11.13ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 107.12ms (17.96ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 118.68ms (139.10ms CPU time)\n\nRan 26 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492823)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763896)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544275)\n[PASS] testAgentClassForContractAuthors() (gas: 1206088)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044977)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3460745)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2791883)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467464)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3608537)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134854)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 2743846)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1495641)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54517)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852958)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2228036)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1705980)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96996)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 732076)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23166)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2952349)\n[PASS] testObservationWindowAndSpacing() (gas: 898633)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 855286)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137551)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922354)\n[PASS] testRightCallReturnsTheBond() (gas: 1526986)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1509440)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 118.97ms (35.67ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 118.85ms (47.26ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 118.81ms (70.73ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838163, ~: 838176)\nLogs:\n  Bound result 9750000000000000092\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58956, ~: 58968)\nLogs:\n  Bound result 8817051148877343063\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 118.87ms (179.20ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 119.06ms (6.97ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106058, ~: 106106)\nLogs:\n  Bound result -120\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 118.93ms (43.57ms CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 118.96ms (9.61ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 130868, ~: 114783)\nLogs:\n  Bound result 9\n  Bound result 999999999999999999999000016688\n  Bound result 999999999999999999999000002401\n  Bound result 99500000000000000000\n  Bound result 1000000000\n  Bound result 999999999999999999999000000017\n  Bound result 1300000000000000000000000\n  Bound result 999999999999999999999000005001\n  Bound result 999999999999999999999000000113\n  Bound result 999999999999999999999000003699\n  Bound result 300000000000000000\n  Bound result 999999999999999999999000021762\n  Bound result 999999999999999999999000000051\n  Bound result 1800003600\n  Bound result 514264337593623178497920771838\n  Bound result 1000000000001\n  Bound result 999999999999999999999000003995\n  Bound result 999999999999999999999000000245\n  Bound result 999999999999999999999000007078\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36887, ~: 36898)\nLogs:\n  Bound result 15670\n  Bound result 9685866\n  Bound result 34\n  Bound result 485879473765820285705974006016\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141425, ~: 141832)\nLogs:\n  Bound result 802505888514412516512533602915\n  Bound result 151085184368540305177462057301\n  Bound result 17274\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36708, ~: 36862)\nLogs:\n  Bound result 15670\n  Bound result 15\n  Bound result 34\n  Bound result 485879473765820285705974006016\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23383, ~: 21564)\nLogs:\n  Bound result 1461446703485210103287273052103988822380820735867\n  Bound result 1461446703485210103287273052103988822378724004047\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39884, ~: 39537)\nLogs:\n  Bound result 11965030477023961921\n  Bound result 7197193670790514204531543450206899195441\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16082, ~: 14429)\nLogs:\n  Bound result 143\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 53509, ~: 51987)\nLogs:\n  Bound result 23\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36426, ~: 36402)\nLogs:\n  Bound result 6\n  Bound result 5295\n  Bound result 1\n  Bound result 342917448434265081253156957284\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 18958, ~: 16761)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21337, ~: 21299)\nLogs:\n  Bound result 5192296858534827628530496329220095\n  Bound result 16950\n  Bound result 612608\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 62816, ~: 58113)\nLogs:\n  Bound result 745\n  Bound result 3\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 98876, ~: 88101)\nLogs:\n  Bound result 3\n  Bound result 219508834\n  Bound result 663576253634051648832470715518\n  Bound result 508461796619456896546888398156\n  Bound result 696951112608338383577689355220\n  Bound result 1794961549132445\n  Bound result 19980\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 118.97ms (1.14s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 5)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 208   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 213   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 394   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 229   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 221   | 5       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 222   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 214   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 219   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 86400\n  Bound result 1\n  Bound result 136113543438\n  Bound result 4332\n  Bound result 2\n  Bound result 1000000000000\n  Bound result 0\n  Bound result 11281\n  Bound result 9961\n  Bound result 70\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1000000000000000000000\n  Bound result 50058\n  Bound result 12\n  Bound result 27\n  Bound result 1\n  Bound result 7424\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 101345193996981843461\n  Bound result 2\n  Bound result 0\n  Bound result 33775869812978527169102\n  Bound result 1211\n  Bound result 0\n  Bound result 2989\n  Bound result 10140\n  Bound result 44\n  Bound result 1\n  Bound result 2000000000000000000000\n  Bound result 50021\n  Bound result 15\n  Bound result 1\n  Bound result 2000000000000000000000\n  Bound result 3271\n  Bound result 33\n  Bound result 18000\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 50177\n  Bound result 1\n  Bound result 27\n  Bound result 1\n  Bound result 1\n  Bound result 49459365377411958715645\n  Bound result 1\n  Bound result 2989\n  Bound result 1741\n  Bound result 10\n  Bound result 4055\n  Bound result 0\n  Bound result 8895\n  Bound result 0\n  Bound result 1\n  Bound result 11209\n  Bound result 2\n  Bound result 12391\n  Bound result 2\n  Bound result 2\n  Bound result 14726\n  Bound result 50066\n  Bound result 90\n  Bound result 0\n  Bound result 29380328\n  Bound result 52168\n  Bound result 10\n  Bound result 1\n  Bound result 1\n  Bound result 18354\n  Bound result 53\n  Bound result 400000\n  Bound result 2\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 8677\n  Bound result 1\n  Bound result 1\n  Bound result 49942851022512914212548\n  Bound result 1\n  Bound result 1854931027590941345036\n  Bound result 0\n  Bound result 917762068586626449001\n  Bound result 9499\n  Bound result 12\n  Bound result 0\n  Bound result 1910\n  Bound result 2\n  Bound result 8027\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 468.61ms (454.19ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2389  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2426  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2485  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2500  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2488  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1762\n  Bound result 500000000000000000\n  Bound result 5412\n  Bound result 2110234842\n  Bound result 5794\n  Bound result 3000\n  Bound result 237\n  Bound result 9474\n  Bound result 2\n  Bound result 1358\n  Bound result 9228162514264337593\n  Bound result 99\n  Bound result 3442\n  Bound result 98\n  Bound result 3347894085922448798\n  Bound result 1666\n  Bound result 4827\n  Bound result 18483808273940800841364556349769472261452413413\n  Bound result 17\n  Bound result 3470024922855922\n  Bound result 7749782527162950100\n  Bound result 280\n  Bound result 78\n  Bound result 830\n  Bound result 50000000000000000000\n  Bound result 3567\n  Bound result 32194\n  Bound result 20125\n  Bound result 2560\n  Bound result 3243\n  Bound result 141669\n  Bound result 358866102386262780222450125668654112388604133691\n  Bound result 3345\n  Bound result 1018\n  Bound result 4247067953537247501\n  Bound result 1800000000\n  Bound result 6931\n  Bound result 2000000000000000000\n  Bound result 12\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.08s (1.07s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 505   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 507   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 537   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 524   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 494   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 547   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 542   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 508   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 525   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1022  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 501   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 513   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 514   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 511   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 483   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 495   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 3249999999999866667\n  Bound result 18000\n  Bound result 5\n  Bound result 99999000000000000003001\n  Bound result 5325947234057367939\n  Bound result 4\n  Bound result 6\n  Bound result 1739\n  Bound result 461\n  Bound result 4\n  Bound result 283588\n  Bound result 71026963654536215254041\n  Bound result 2\n  Bound result 9750000000000008049\n  Bound result 7\n  Bound result 256\n  Bound result 7\n  Bound result 99999999999999999999\n  Bound result 99999000000000000093674\n  Bound result 7\n  Bound result 99610105479643263248214\n  Bound result 20000000000000000000\n  Bound result 749999999999999797\n  Bound result 5\n  Bound result 9750000000000007201\n  Bound result 7391681336262831373\n  Bound result 5\n  Bound result 26\n  Bound result 3\n  Bound result 2\n  Bound result 4694279954683880805\n  Bound result 8960536795862094302\n  Bound result 3\n  Bound result 3\n  Bound result 344345\n  Bound result 1629\n  Bound result 16124\n  Bound result 3107\n  Bound result 5\n  Bound result 499999999999999998\n  Bound result 157650\n  Bound result 24500000\n  Bound result 99999000000000000040001\n  Bound result 1\n  Bound result 1\n  Bound result 10\n  Bound result 10\n  Bound result 98000000000000000065\n  Bound result 1250840543138519929\n  Bound result 2\n  Bound result 2\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.00s (6.99s CPU time)\n\nRan 23 test suites in 7.01s (10.10s CPU time): 289 tests passed, 0 failed, 1 skipped (290 total tests)\n","passed":true},{"durationMs":136,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":553,\"AGENTS.md\":126,\"README.md\":245,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"launch.json\":15,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":677,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":924,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"65505b24cf290ac7f1ebab19fe14cf11e7b3ce0de97e3a90afcf72ffe60dc6d3","verifiedTreeHash":"17cb0193bbe93b33d6e82014613a0acddf5589bb","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":318066,"exitCode":0,"name":"build","output":"Compiling 124 files with Solc 0.8.26\nSolc 0.8.26 finished in 317.80s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/AnnexInvariant.t.sol:381:52:\n    |\n381 |         try annex.requestAdmission(asked) returns (bytes32 r) {\n    |                                                    ^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/AnnexInvariant.t.sol:408:19:\n    |\n408 |         (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerKey, annex.attestationDigest(a));\n    |                   ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:605:28\n    │\n605 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:240:13\n    │\n240 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:279:9\n    │\n279 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:265:22\n    │\n265 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:266:17\n    │\n266 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:312:13\n    │\n312 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:313:13\n    │\n313 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:324:47\n    │\n324 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:332:9\n    │\n332 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:27\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:52\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:418:9\n    │\n418 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:377:35\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:339:13\n    │\n339 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:377:9\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:364:30\n    │\n364 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:367:26\n    │\n367 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:384:13\n    │\n384 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:391:9\n    │\n391 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:392:9\n    │\n392 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:386:30\n    │\n386 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:431:17\n    │\n431 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:461:13\n    │\n461 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:468:13\n    │\n468 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:560:21\n    │\n560 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n561 │ ┃             action,\n562 │ ┃             bytes(admissionBody(hooks)),\n563 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n564 │ ┃             imd,\n565 │ ┃             price\n566 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:570:9\n    │\n570 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:553:70\n    │\n553 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:594:21\n    │\n594 │                     emit HookAdmitted(open[i], requestId);\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/MarginaliaAnnex.sol:640:13\n    │\n640 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:621:18\n    │\n621 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:628:38\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:628:46\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:629:24\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:629:32\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:636:9\n    │\n636 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/AnnexAdversarial.t.sol:187:21\n    │\n187 │         a.chainId = block.chainid;\n    │                     ━━━━━━━━━━━━━\n    ‡\n819 │         vm.chainId(999);\n    │         ─────────────── `vm.chainId` changes this environment here\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7265,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 544.20µs (0.00ns CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 728.94µs (316.95µs CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 10.46ms (4.57ms CPU time)\n\nRan 20 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492691)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763866)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544099)\n[PASS] testAgentClassForContractAuthors() (gas: 1205929)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044796)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2790507)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1458978)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609337)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134395)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54684)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852936)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1697424)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96771)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 731945)\n[PASS] testObservationWindowAndSpacing() (gas: 893335)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 856026)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137297)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922278)\n[PASS] testRightCallReturnsTheBond() (gas: 1518691)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1501229)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 19.42ms (13.50ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 19.82ms (5.13ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 21.87ms (13.53ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 22.15ms (10.45ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 23.80ms (17.55ms CPU time)\n\nRan 23 tests for test/AnnexAdversarial.t.sol:AnnexAdversarialTest\n[PASS] testAdmissionListRulesAndPrice() (gas: 2593632)\n[PASS] testAnEmptyAnswerIsStoredNotReverted() (gas: 1166556)\n[PASS] testAttestationEdgesAreRefusedOneByOne() (gas: 1595836)\n[PASS] testCallbackGasAtTheFullListStaysUnderTheStipend() (gas: 2113400)\n[PASS] testCheckpointWindowAgesAndExpiresLikeTheRouter() (gas: 4952032)\n[PASS] testConstructorStoresFourValuesWithoutReadingTheChain() (gas: 51614)\n[PASS] testCountersRefuseClosedParentsAndTheses() (gas: 5706528)\n[PASS] testHoldRuleGiftsCountAsHeldAndAReadFailureAsBroken() (gas: 4181818)\n[PASS] testLifecycleRefusalsOnUnknownClosedAndForeignNotes() (gas: 1863235)\n[PASS] testMoreAdverseReadingReplacesTheLastInTheSameBlock() (gas: 1792025)\n[PASS] testOneOracleUuidServesOneRequestOnly() (gas: 1426870)\n[PASS] testPostBoundariesExactly() (gas: 2249936)\n[PASS] testProtocolVectorDigestSelectorAndSignature() (gas: 1185060)\n[PASS] testScoreIsDifficultyWeightedAndRetractIsHalf() (gas: 4662714)\n[PASS] testSellCallSettlesRightAndMaySellThroughTheHorizon() (gas: 1533578)\n[PASS] testSellCallWrongWhenThePriceRises() (gas: 1586853)\n[PASS] testSettlementTakesTheMostAdverseReading() (gas: 1754375)\n[PASS] testSixteenReadingsAtMostAndTheLastSlotWaitsForTheHour() (gas: 4623345)\n[PASS] testSlippageAndUnfundedAuthorsTakeNothing() (gas: 1549415)\n[PASS] testSplitIsExactAndNothingStaysInTheAnnex() (gas: 632582)\n[PASS] testThreeReadingsInsideAnHourAreNoData() (gas: 1484320)\n[PASS] testUnlockCallbackAcceptsOnlyThePoolManager() (gas: 630577)\n[PASS] testVenueQuoteRule() (gas: 1220619)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 32.67ms (24.59ms CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 40.88ms (1.80ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 42.14ms (30.46ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 44.17ms (37.50ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 92.22ms (65.02ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 96.37ms (78.19ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 96.39ms (165.21ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 96.77ms (76.30ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106052, ~: 106088)\nLogs:\n  Bound result 36871\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 120.33ms (41.82ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 23423, ~: 21695)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 120.33ms (24.20ms CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 120.48ms (7.23ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838166, ~: 838176)\nLogs:\n  Bound result 9651008090153548961\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58958, ~: 58968)\nLogs:\n  Bound result 9750000000000011001\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 120.48ms (235.22ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 132201, ~: 114670)\nLogs:\n  Bound result 13\n  Bound result 999999999999999999999000014381\n  Bound result 999999999999999999999000006511\n  Bound result 4295128740\n  Bound result 999999999999999999999001000001\n  Bound result 999999999999999999999000024428\n  Bound result 1000000000000000\n  Bound result 999999999999999999999000008724\n  Bound result 999999999999999999999000000031\n  Bound result 999999999999999999999000007001\n  Bound result 999999999999999999999000032044\n  Bound result 999999999999999999999000015570\n  Bound result 999999999999999999999000007052\n  Bound result 600000000000000000\n  Bound result 999999999999999999999000009469\n  Bound result 70000000000000000000\n  Bound result 70000000000000000000\n  Bound result 999999999999999999999000400001\n  Bound result 999999999999999999999000031750\n  Bound result 999999999999999999999000000055\n  Bound result 999999999999999999999000000866\n  Bound result 999999999999999999999000034504\n  Bound result 999999999999999999999000008194\n  Bound result 1170413884\n  Bound result 999999999999999999999000013047\n  Bound result 999999999999999999999000000011\n  Bound result 3000000000000000000000000\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36933, ~: 36956)\nLogs:\n  Bound result 18820\n  Bound result 9993601\n  Bound result 65\n  Bound result 2400\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141482, ~: 141832)\nLogs:\n  Bound result 1266413223074410410233971399736\n  Bound result 1266412660188944021221804081212\n  Bound result 21428\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36734, ~: 36864)\nLogs:\n  Bound result 16674\n  Bound result 15\n  Bound result 6\n  Bound result 37780\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23231, ~: 21542)\nLogs:\n  Bound result 763344792537129160143596710928138622256470897\n  Bound result 10621610169810811917658366012376788724332510473\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39468, ~: 39304)\nLogs:\n  Bound result 9999999999999999999999999999999999996096\n  Bound result 3266167182\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16239, ~: 14903)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 54070, ~: 51987)\nLogs:\n  Bound result 9843\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36416, ~: 36439)\nLogs:\n  Bound result 1095\n  Bound result 3779\n  Bound result 31\n  Bound result 11260026\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19567, ~: 17611)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21355, ~: 21299)\nLogs:\n  Bound result 5192296858534827628530496329220095\n  Bound result 695\n  Bound result 23118\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 63733, ~: 61087)\nLogs:\n  Bound result 678\n  Bound result 4\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 101726, ~: 94076)\nLogs:\n  Bound result 1\n  Bound result 1015000000000000000000\n  Bound result 8192\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 120.63ms (1.01s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 4)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 193   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 221   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 438   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 220   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 216   | 4       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 224   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 206   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 202   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 6641\n  Bound result 1\n  Bound result 4711\n  Bound result 2\n  Bound result 5088\n  Bound result 50027\n  Bound result 50\n  Bound result 1746\n  Bound result 1\n  Bound result 0\n  Bound result 2\n  Bound result 13058\n  Bound result 2406\n  Bound result 90\n  Bound result 1\n  Bound result 144\n  Bound result 57201\n  Bound result 4\n  Bound result 80\n  Bound result 0\n  Bound result 1341611864325049298534\n  Bound result 408\n  Bound result 24\n  Bound result 1\n  Bound result 1930\n  Bound result 0\n  Bound result 500000\n  Bound result 2\n  Bound result 1\n  Bound result 500000000000000000000\n  Bound result 0\n  Bound result 2\n  Bound result 113236182\n  Bound result 9999\n  Bound result 4\n  Bound result 0\n  Bound result 839976113907150608982\n  Bound result 9037\n  Bound result 33\n  Bound result 1\n  Bound result 1313373041\n  Bound result 1\n  Bound result 0\n  Bound result 443438647566422588163\n  Bound result 42860\n  Bound result 95\n  Bound result 2\n  Bound result 1015000000000000000000\n  Bound result 12345\n  Bound result 47\n  Bound result 2\n  Bound result 0\n  Bound result 12631\n  Bound result 1\n  Bound result 12589\n  Bound result 2\n  Bound result 1\n  Bound result 2455\n  Bound result 0\n  Bound result 14\n  Bound result 0\n  Bound result 16383\n  Bound result 18000\n  Bound result 32\n  Bound result 120\n  Bound result 2\n  Bound result 16760\n  Bound result 55401\n  Bound result 100\n  Bound result 2\n  Bound result 868457691554\n  Bound result 28931\n  Bound result 23\n  Bound result 2\n  Bound result 7395\n  Bound result 50211\n  Bound result 47\n  Bound result 2\n  Bound result 65\n  Bound result 3559\n  Bound result 1\n  Bound result 14375\n  Bound result 2\n  Bound result 4789\n  Bound result 2\n  Bound result 5055\n  Bound result 49601\n  Bound result 79\n  Bound result 1\n  Bound result 250000000000000000\n  Bound result 651\n  Bound result 15\n  Bound result 997\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000001\n  Bound result 1\n  Bound result 9089\n  Bound result 2\n  Bound result 24576\n  Bound result 961\n  Bound result 30\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 494.66ms (484.08ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2466  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2475  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2447  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2456  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2444  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 177362147\n  Bound result 9001\n  Bound result 185\n  Bound result 52132133\n  Bound result 3318218668866603793505\n  Bound result 237684487542793012780631851008\n  Bound result 30\n  Bound result 885\n  Bound result 2142931689149524007\n  Bound result 2109295512424009991\n  Bound result 3071718129638534124167738597197334407826324654\n  Bound result 4888\n  Bound result 10000000000000000000\n  Bound result 62714\n  Bound result 7958\n  Bound result 543\n  Bound result 6290724081224217120\n  Bound result 8429\n  Bound result 1018\n  Bound result 4004\n  Bound result 8854358526382128510\n  Bound result 3766\n  Bound result 50\n  Bound result 9999\n  Bound result 20833\n  Bound result 660406\n  Bound result 2000000000000000000\n  Bound result 5000000000000000000\n  Bound result 784819174662801712272640\n  Bound result 141516\n  Bound result 999999999000000000000001\n  Bound result 2351343361319601665146314411460636764926414663\n  Bound result 32\n  Bound result 1334\n  Bound result 112\n  Bound result 1000000000000000\n  Bound result 66872829713967544936569\n  Bound result 895946978006648146744783948085809244276388164894\n  Bound result 8780\n  Bound result 80\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.15s (1.15s CPU time)\n\nRan 1 test for test/AnnexInvariant.t.sol:AnnexInvariantTest\n[PASS]\nAnnexInvariantTest invariants:\n[PASS] invariant_admissionIsPermanent\n[PASS] invariant_bondsConserved\n[PASS] invariant_imdHeldEqualsBondsOwed\n[PASS] invariant_noMargRetained\n[PASS] invariant_recordsCountOutcomes\n[PASS] invariant_statusesAreFinalAndDepositsMatch\n AnnexInvariantTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭--------------+---------------+-------+---------+----------╮\n| Contract     | Selector      | Calls | Reverts | Discards |\n+===========================================================+\n| AnnexHandler | admission     | 410   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | claim         | 386   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | moveX         | 362   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | observe       | 383   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | observeSeries | 385   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | post          | 371   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | retract       | 394   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | settle        | 389   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | strangerClaim | 374   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | tradeMarg     | 381   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | tradeX        | 365   | 0       | 0        |\n|--------------+---------------+-------+---------+----------|\n| AnnexHandler | warp          | 408   | 0       | 0        |\n╰--------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3333\n  Bound result 5\n  Bound result 9750000000000004774\n  Bound result 2\n  Bound result 7359\n  Bound result 3\n  Bound result 1171442760588921200\n  Bound result 118752\n  Bound result 100000000000000000\n  Bound result 9999999999999999998\n  Bound result 507\n  Bound result 4\n  Bound result 4\n  Bound result 10999\n  Bound result 7126\n  Bound result 155408019560299983391836\n  Bound result 299999000000000000009405\n  Bound result 299999000000000000017194\n  Bound result 1986\n  Bound result 127300\n  Bound result 160000\n  Bound result 3\n  Bound result 8811\n  Bound result 7329\n  Bound result 5\n  Bound result 9750000000000008397\n  Bound result 1037\n  Bound result 10000000000000000000\n  posts 3 settles 2\n  claimed 10921442760588925974 forfeited to pools 0\n  keeper paid 0 admitted hooks 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.22s (2.21s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 518   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 513   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 509   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 534   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 472   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 506   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 457   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 525   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 537   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 522   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 969   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 543   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 507   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 523   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 519   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 526   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 542   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 506   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 9750000000000000301\n  Bound result 5\n  Bound result 5\n  Bound result 99999000000000000000108\n  Bound result 72801021273120678261\n  Bound result 5702\n  Bound result 9750000000000000061\n  Bound result 99999999999999999956\n  Bound result 9750000000000000095\n  Bound result 6\n  Bound result 4121\n  Bound result 1737344311211939708\n  Bound result 9750000000000000281\n  Bound result 99999000000000000017068\n  Bound result 98000000000000040001\n  Bound result 7\n  Bound result 6\n  Bound result 49466856247732530805017\n  Bound result 2\n  Bound result 39577\n  Bound result 11\n  Bound result 46050105\n  Bound result 99999000000000020000001\n  Bound result 90\n  Bound result 2\n  Bound result 3\n  Bound result 9750000000000000058\n  Bound result 8\n  Bound result 5\n  Bound result 103825\n  Bound result 9\n  Bound result 9584\n  Bound result 5\n  Bound result 99999000000000000000359\n  Bound result 3081\n  Bound result 99999000000000000000121\n  Bound result 630817510\n  Bound result 98000000000000011960\n  Bound result 3\n  Bound result 12\n  Bound result 76347632249928301164\n  Bound result 98000000000000005393\n  Bound result 15\n  Bound result 4\n  Bound result 1914186853908833888\n  Bound result 99999000000000000015117\n  Bound result 735000\n  Bound result 15\n  Bound result 1000000000000\n  Bound result 291487\n  Bound result 7\n  Bound result 15\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.13s (7.13s CPU time)\n\nRan 25 test suites in 7.13s (12.25s CPU time): 307 tests passed, 0 failed, 1 skipped (308 total tests)\n","passed":true},{"durationMs":163,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":505,\"AGENTS.md\":123,\"README.md\":240,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":644,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":679,\"test/AnnexAdversarial.t.sol\":1053,\"test/AnnexInvariant.t.sol\":579,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"68a16eb0c7298dc54bdfb426f1679d1721c20ed2f4836ca6d5eccbc999ddf2e0","verifiedTreeHash":"66eab4fe54bfc6e0b3883f7eb4025785c5b795df","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":273833,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 273.55s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:605:28\n    │\n605 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:240:13\n    │\n240 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:279:9\n    │\n279 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:265:22\n    │\n265 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:266:17\n    │\n266 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:312:13\n    │\n312 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:313:13\n    │\n313 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:324:47\n    │\n324 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:332:9\n    │\n332 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:27\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:52\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:418:9\n    │\n418 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:377:35\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:339:13\n    │\n339 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:377:9\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:364:30\n    │\n364 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:367:26\n    │\n367 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:384:13\n    │\n384 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:391:9\n    │\n391 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:392:9\n    │\n392 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:386:30\n    │\n386 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:431:17\n    │\n431 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:461:13\n    │\n461 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:468:13\n    │\n468 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:560:21\n    │\n560 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n561 │ ┃             action,\n562 │ ┃             bytes(admissionBody(hooks)),\n563 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n564 │ ┃             imd,\n565 │ ┃             price\n566 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:570:9\n    │\n570 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:553:70\n    │\n553 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\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/MarginaliaAnnex.sol:594:21\n    │\n594 │                     emit HookAdmitted(open[i], requestId);\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/MarginaliaAnnex.sol:640:13\n    │\n640 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:621:18\n    │\n621 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:628:38\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:628:46\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:629:24\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:629:32\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:636:9\n    │\n636 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\n   │             ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7564,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 716.35µs (0.00ns CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 988.63µs (537.96µs CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 8.26ms (8.07ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 11.67ms (4.62ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 12.31ms (7.26ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 21.76ms (12.78ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 30.66ms (14.71ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 31.10ms (20.39ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 41.84ms (29.22ms CPU time)\n\nRan 20 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492691)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763866)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544099)\n[PASS] testAgentClassForContractAuthors() (gas: 1205929)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044796)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2790507)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1458978)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609337)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134395)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54684)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852936)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1697424)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96771)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 731945)\n[PASS] testObservationWindowAndSpacing() (gas: 893335)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 856026)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137297)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922278)\n[PASS] testRightCallReturnsTheBond() (gas: 1518691)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1501229)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 43.25ms (21.50ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 54.99ms (61.90ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 23766, ~: 21950)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 84.55ms (87.33ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 103.06ms (91.51ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 107.41ms (48.17ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106051, ~: 106088)\nLogs:\n  Bound result 787\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 116.18ms (109.12ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 117.62ms (46.57ms CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 117.64ms (4.01ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 126.25ms (189.77ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838165, ~: 838176)\nLogs:\n  Bound result 9750000000000008193\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58958, ~: 58968)\nLogs:\n  Bound result 250000000000000000\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 126.30ms (192.90ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 131529, ~: 115060)\nLogs:\n  Bound result 7\n  Bound result 1359182279\n  Bound result 999999999999999999999000002821\n  Bound result 999999999999999999999000000056\n  Bound result 150000000000000000\n  Bound result 30000000000000000\n  Bound result 2500000000000000000000\n  Bound result 999999999999999999999000002615\n  Bound result 920938463463714889797427929089\n  Bound result 999999999999999999999000000031\n  Bound result 999999999999999999999000000551\n  Bound result 999999999999999999999000000256\n  Bound result 999999999999999999999000000101\n  Bound result 999999999999999999999000002401\n  Bound result 350000000000000000\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36924, ~: 36934)\nLogs:\n  Bound result 11002\n  Bound result 9989017\n  Bound result 1\n  Bound result 759321917816718225988655404719\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141509, ~: 141832)\nLogs:\n  Bound result 196318512438534429833748477331\n  Bound result 1266412660188944021221804092239\n  Bound result 7386\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36757, ~: 36900)\nLogs:\n  Bound result 48879\n  Bound result 68\n  Bound result 11\n  Bound result 1100000000000000000\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23313, ~: 21564)\nLogs:\n  Bound result 100000000000000000001\n  Bound result 1461446703485210103287273052103988822378723970376\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39225, ~: 38315)\nLogs:\n  Bound result 9999999999999999999999999999999999997046\n  Bound result 9999999999999999999999999999999999991609\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16184, ~: 14210)\nLogs:\n  Bound result 95\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 53843, ~: 51987)\nLogs:\n  Bound result 8718\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36429, ~: 36412)\nLogs:\n  Bound result 291\n  Bound result 4131\n  Bound result 45\n  Bound result 25008447561966522780\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19113, ~: 17101)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21353, ~: 21299)\nLogs:\n  Bound result 7923\n  Bound result 17235\n  Bound result 228\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 62273, ~: 57819)\nLogs:\n  Bound result 24372\n  Bound result 14\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 101168, ~: 91586)\nLogs:\n  Bound result 6\n  Bound result 572797761477457500770599885112\n  Bound result 428749200243108417099567378235\n  Bound result 799149315245144447364158430674\n  Bound result 79546816006159\n  Bound result 79186498126054649920064385\n  Bound result 8\n  Bound result 32957705261\n  Bound result 12072824025400602060945762492\n  Bound result 384063367428397724721210040561\n  Bound result 2557321401\n  Bound result 31673337860289786\n  Bound result 11635105023989549396\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 126.35ms (1.00s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 6)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 206   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 238   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 418   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 196   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 206   | 6       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 221   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 223   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 212   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3062\n  Bound result 1\n  Bound result 18\n  Bound result 7015\n  Bound result 90\n  Bound result 0\n  Bound result 1812575548381300035809\n  Bound result 34180\n  Bound result 1\n  Bound result 0\n  Bound result 1256215292482693439572\n  Bound result 0\n  Bound result 2\n  Bound result 16473\n  Bound result 0\n  Bound result 1\n  Bound result 40864577178759316744936\n  Bound result 1\n  Bound result 16\n  Bound result 50513\n  Bound result 71\n  Bound result 0\n  Bound result 55\n  Bound result 0\n  Bound result 1\n  Bound result 94\n  Bound result 50061\n  Bound result 40\n  Bound result 0\n  Bound result 600000000000000000\n  Bound result 1688\n  Bound result 2\n  Bound result 1\n  Bound result 3209\n  Bound result 52828\n  Bound result 31\n  Bound result 2293\n  Bound result 0\n  Bound result 1260000000000000000\n  Bound result 18\n  Bound result 32\n  Bound result 2\n  Bound result 2\n  Bound result 10930\n  Bound result 1\n  Bound result 713377652947462488309\n  Bound result 10001\n  Bound result 57\n  Bound result 2\n  Bound result 184270605330689760506\n  Bound result 1\n  Bound result 1\n  Bound result 255911068699283149077\n  Bound result 1\n  Bound result 19189\n  Bound result 54107\n  Bound result 40\n  Bound result 0\n  Bound result 11164\n  Bound result 2\n  Bound result 259200\n  Bound result 54239\n  Bound result 28\n  Bound result 3552\n  Bound result 0\n  Bound result 2\n  Bound result 16\n  Bound result 1724\n  Bound result 90\n  Bound result 1\n  Bound result 0\n  Bound result 2450\n  Bound result 0\n  Bound result 917350912428584318019\n  Bound result 50098\n  Bound result 2\n  Bound result 2\n  Bound result 680650050612882041873\n  Bound result 8489\n  Bound result 84\n  Bound result 5774\n  Bound result 2\n  Bound result 0\n  Bound result 775091088854197\n  Bound result 2\n  Bound result 2419200\n  Bound result 0\n  Bound result 1291200139696142939577\n  Bound result 23701\n  Bound result 25\n  Bound result 1\n  Bound result 16894\n  Bound result 1\n  Bound result 14639502805886276\n  Bound result 1\n  Bound result 450000000000000000\n  Bound result 17594\n  Bound result 19\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 509.94ms (502.96ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2432  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2519  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2435  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2416  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2486  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 127557\n  Bound result 8947\n  Bound result 1420727721434613761800528883976909068745183556426\n  Bound result 1406773304555124326480195126977287549170452924945\n  Bound result 43\n  Bound result 9874884007295565257\n  Bound result 24366\n  Bound result 12345\n  Bound result 7954\n  Bound result 36596176529639866728903087\n  Bound result 6901\n  Bound result 40\n  Bound result 7102326\n  Bound result 2921573149\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 75000000000000000000\n  Bound result 999999999999999999999998\n  Bound result 820645491817104859032882637320174340376690513926\n  Bound result 626241297036028119006252\n  Bound result 300000000000000000\n  Bound result 7956\n  Bound result 6239\n  Bound result 635\n  Bound result 693609447223960910241780\n  Bound result 404\n  Bound result 1224\n  Bound result 73\n  Bound result 91187\n  Bound result 30000000000000000\n  Bound result 221398\n  Bound result 2812\n  Bound result 2411\n  Bound result 613\n  Bound result 20000000000000000000000\n  Bound result 4026892629880812708\n  Bound result 160\n  Bound result 1267650600228229401496703205376\n  Bound result 4745453329624072214\n  Bound result 95\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.21s (1.20s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 540   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 500   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 497   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 527   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 487   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 534   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 502   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 511   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 542   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 515   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 472   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1027  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 486   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 491   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 505   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 511   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 540   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 544   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 509   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 4\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4\n  Bound result 4\n  Bound result 9750000000000017122\n  Bound result 98000000000000022158\n  Bound result 5\n  Bound result 4\n  Bound result 172800\n  Bound result 4\n  Bound result 6\n  Bound result 63999999999999998868\n  Bound result 2\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 9750000000000012501\n  Bound result 4\n  Bound result 8178595300493713192\n  Bound result 676002599751551264\n  Bound result 2\n  Bound result 5\n  Bound result 99999000000000000100001\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 5\n  Bound result 20000000\n  Bound result 10\n  Bound result 9\n  Bound result 114991\n  Bound result 3\n  Bound result 6\n  Bound result 83051\n  Bound result 9195697185624604576\n  Bound result 1\n  Bound result 99999000000000000000361\n  Bound result 9750000000000002402\n  Bound result 9750000000000003701\n  Bound result 2\n  Bound result 5\n  Bound result 9750000000000001879\n  Bound result 2\n  Bound result 9750000000000002049\n  Bound result 15\n  Bound result 3999999999999989744\n  Bound result 9750000000000000156\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.43s (7.42s CPU time)\n\nRan 23 test suites in 7.43s (10.43s CPU time): 283 tests passed, 0 failed, 1 skipped (284 total tests)\n","passed":true},{"durationMs":141,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":505,\"AGENTS.md\":123,\"README.md\":240,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":644,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":679,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":16791,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a weak PRNG: \"delta < 0 && delta % int256(dt) != 0 (src/MarginaliaPricer.sol#215)\"\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:287: Reentrancy in MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292):\n[high/high] uninitialized-state at src/MarginaliaHook.sol:536: MarginaliaHook.observations (src/MarginaliaHook.sol#106) is never initialized. It is used in:\n[high/high] uninitialized-state at src/MarginaliaAnnex.sol:308: MarginaliaAnnex.observations (src/MarginaliaAnnex.sol#97) is never initialized. It is used in:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:233: MarginaliaAnnex.post(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256) (src/MarginaliaAnnex.sol#233-280) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:233: MarginaliaAnnex.post(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256) (src/MarginaliaAnnex.sol#233-280) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:377: MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPages.sol:404: MarginaliaPages.abandonClaim(bytes32) (src/MarginaliaPages.sol#404-411) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:299: MarginaliaRouter.unlockCallback(bytes) (src/MarginaliaRouter.sol#299-340) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:294: MarginaliaRouter._checkSubject(MarginaliaRouter.Job) (src/MarginaliaRouter.sol#294-297) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:176: MarginaliaPricer.settlePrice(MarginaliaTypes.Venue,bool,MarginaliaTypes.Observation[]) (src/MarginaliaPricer.sol#176-201) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:287: MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:454: MarginaliaAnnex._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaAnnex.sol#454-457) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:579: MarginaliaHook._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaHook.sol#579-582) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:135: MarginaliaPricer.postPrice(IPoolManager,MarginaliaTypes.Venue,address,bool,MarginaliaTypes.PriceWindow) (src/MarginaliaPricer.sol#135-155) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:242: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey) (src/MarginaliaRouter.sol#242-284) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:603: Reentrancy in MarginaliaHook.settle(bytes32) (src/MarginaliaHook.sol#603-652):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:337: Reentrancy in MarginaliaPages.requestClaim(string,uint256) (src/MarginaliaPages.sol#337-364):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:855: Reentrancy in MarginaliaHook.payJudged(uint32,bytes32[3]) (src/MarginaliaHook.sol#855-874):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:248: Reentrancy in MarginaliaPages.buy(bytes32,uint256,uint256) (src/MarginaliaPages.sol#248-261):\n[medium/medium] reentrancy-no-eth at src/MarginaliaJudge.sol:203: Reentrancy in MarginaliaJudge.requestJudging(uint32) (src/MarginaliaJudge.sol#203-226):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:679: Reentrancy in MarginaliaHook.retract(bytes32,string) (src/MarginaliaHook.sol#679-695):\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:179: MarginaliaRouter.sellWithNote(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#179) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:516: MarginaliaAnnex.admissionBody(address[]).named (src/MarginaliaAnnex.sol#516) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:127: MarginaliaJudge.questionBody(uint32).allow (src/MarginaliaJudge.sol#127) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:343: MarginaliaAnnex.settle(bytes32).settlePrice (src/MarginaliaAnnex.sol#343) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:611: MarginaliaHook.settle(bytes32).settlePrice (src/MarginaliaHook.sol#611) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:515: MarginaliaAnnex.admissionBody(address[]).list (src/MarginaliaAnnex.sol#515) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:166: MarginaliaRouter.note(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#166) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:257: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey).job (src/MarginaliaRouter.sol#257) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:113: MarginaliaJudge.eligibleTheses(uint32).n (src/MarginaliaJudge.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:205: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t1 (src/MarginaliaRouter.sol#205) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:272: MarginaliaJudge.judgedOf(uint32).dup (src/MarginaliaJudge.sol#272) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:268: MarginaliaJudge.judgedOf(uint32).kept (src/MarginaliaJudge.sol#268) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:862: MarginaliaHook.payJudged(uint32,bytes32[3]).paidAmounts (src/MarginaliaHook.sol#862) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:168: MarginaliaJudge._dec(uint256).n (src/MarginaliaJudge.sol#168) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:204: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t0 (src/MarginaliaRouter.sol#204) is a local variable never initialized\n[medium/medium] unused-return at src/MarginaliaPricer.sol:255: MarginaliaPricer._quoteSpot(IPoolManager,address,address) (src/MarginaliaPricer.sol#255-264) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(HUB_POOL_ID)) (src/MarginaliaPricer.sol#260)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = annex.records(wallet) (src/MarginaliaPages.sol#223)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (r0,r1,None) = IUniswapV2PairOracle(ref).getReserves() (src/MarginaliaPricer.sol#245)\n[medium/medium] unused-return at src/MarginaliaHook.sol:930: MarginaliaHook.unlockCallback(bytes) (src/MarginaliaHook.sol#930-950) ignores return value by poolManager.settle() (src/MarginaliaHook.sol#945)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = IMarginaliaRecords(address(hook)).records(wallet) (src/MarginaliaPages.sol#220)\n[medium/medium] unused-return at src/MarginaliaHook.sol:294: MarginaliaHook.margPriceInImd() (src/MarginaliaHook.sol#294-297) ignores return value by (sqrtP,None,None,None) = poolManager.getSlot0(poolId) (src/MarginaliaHook.sol#295)\n[medium/medium] unused-return at src/MarginaliaPages.sol:430: MarginaliaPages._burnMarg(uint256) (src/MarginaliaPages.sol#430-432) ignores return value by hook.poolManager().unlock(abi.encode(imdIn)) (src/MarginaliaPages.sol#431)\n[medium/medium] unused-return at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) ignores return value by (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP_scope_0,None,None,None,None,None,None) = IUniswapV3PoolOracle(ref).slot0() (src/MarginaliaPricer.sol#241)\n[medium/medium] unused-return at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) ignores return value by (r0,r1,None) = pair.getReserves() (src/MarginaliaRouter.sol#426)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:267: MarginaliaPricer._v3Cumulative(address) (src/MarginaliaPricer.sol#267-271) ignores return value by (cum,None) = IUniswapV3PoolOracle(pool).observe(ago) (src/MarginaliaPricer.sol#269)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(v.ref)) (src/MarginaliaPricer.sol#237)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:609: MarginaliaAnnex.unlockCallback(bytes) (src/MarginaliaAnnex.sol#609-643) ignores return value by manager.settle() (src/MarginaliaAnnex.sol#636)\n[medium/medium] unused-return at src/MarginaliaPages.sol:434: MarginaliaPages.unlockCallback(bytes) (src/MarginaliaPages.sol#434-460) ignores return value by manager.settle() (src/MarginaliaPages.sol#455)\n[low/high] shadowing-local at src/MarginaliaHook.sol:859: MarginaliaHook.payJudged(uint32,bytes32[3]).pool (src/MarginaliaHook.sol#859) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.noteMeta(bytes32).week (src/MarginaliaJudge.sol#19) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesesOfWeek(uint32).week (src/MarginaliaJudge.sol#15) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesisPool(uint32).week (src/MarginaliaJudge.sol#12) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.drawForJudging(uint32,uint256,bool).week (src/MarginaliaJudge.sol#21) shadows:\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaAnnex.sol:422: MarginaliaAnnex._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaAnnex.sol#422-438) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaAnnex.sol#431-436)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:266: MarginaliaJudge.judgedOf(uint32) (src/MarginaliaJudge.sol#266-279) has external calls inside a loop: (author,noteWeek,thesis,hasChild) = hook.noteMeta(ranked[i]) (src/MarginaliaJudge.sol#270)\n[low/medium] calls-loop at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) has external calls inside a loop: out = poolManager.unlock(data) (src/MarginaliaHook.sol#925)\n[low/medium] calls-loop at src/MarginaliaHook.sol:658: MarginaliaHook._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaHook.sol#658-676) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaHook.sol#669-674)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:91: MarginaliaJudge.convertForfeits() (src/MarginaliaJudge.sol#91-106) has external calls inside a loop: out = hook.sellPotMarg(marg) (src/MarginaliaJudge.sol#96-100)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:266: MarginaliaJudge.judgedOf(uint32) (src/MarginaliaJudge.sol#266-279) has external calls inside a loop: (author,noteWeek,thesis,hasChild) = hook.noteMeta(ranked[i]) (src/MarginaliaJudge.sol#270)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls ins","passed":true},{"durationMs":944,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/MarginaliaPages.sol:169: `abi.encodePacked()` Hash Collision (2 places)\n[high] eth-send-unchecked-address at src/MarginaliaHook.sol:779: ETH transferred without address checks (3 places)\n[high] reentrancy-state-change at src/MarginaliaAnnex.sol:217: Reentrancy: State change after external call (25 places)\n[high] storage-array-memory-edit at src/MarginaliaAnnex.sol:326: Storage Array Edited with Memory (2 places)\n[high] unsafe-casting at src/MarginaliaHook.sol:936: Unsafe Casting of integers\n[low] costly-loop at src/MarginaliaAnnex.sol:590: Costly operations inside loop (4 places)\n[low] internal-function-used-once at src/HookFlags.sol:26: Internal Function Used Only Once (4 places)\n[low] large-numeric-literal at src/Marginalia.sol:10: Large Numeric Literal (28 places)\n[low] literal-instead-of-constant at src/MarginaliaAnnex.sol:246: Literal Instead of Constant (68 places)\n[low] local-variable-shadowing at src/MarginaliaHook.sol:859: Local Variable Shadows State Variable\n[low] require-revert-in-loop at src/MarginaliaAnnex.sol:517: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/MarginaliaHook.sol:835: State Change Without Event (6 places)\n[low] state-no-address-check at src/MarginaliaRouter.sol:135: Address State Variable Set Without Checks\n[low] unchecked-return at src/MarginaliaAnnex.sol:253: Unchecked Return (10 places)\n[low] uninitialized-local-variable at src/MarginaliaAnnex.sol:429: Uninitialized Local Variable (4 places)\n[low] unused-import at src/MarginaliaHook.sol:10: Unused Import\n[low] unused-public-function at src/MarginaliaHook.sol:294: Public Function Not Used Internally (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7211914283bd866442ca09c294ee0990682015ddef0fd16b3b1e77b54e1eaade","verifiedTreeHash":"199c5b98bffa5f99ef918fda83db8c2eab1b54f4","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":270878,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 270.62s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:638:28\n    │\n638 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:246:13\n    │\n246 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:289:9\n    │\n289 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:271:22\n    │\n271 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:272:17\n    │\n272 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaAnnex.sol:338:74\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                                          ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:338:81\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\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/MarginaliaAnnex.sol:327:13\n    │\n327 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:328:13\n    │\n328 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:344:47\n    │\n344 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:352:9\n    │\n352 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:27\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:52\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:442:9\n    │\n442 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:374:17\n    │\n374 │             if (settlePrice == 0 && !emptied) {\n    │                 ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:373:18\n    │\n373 │             if (!emptied) settlePrice = _settlementPrice(n, obs);\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/MarginaliaAnnex.sol:359:13\n    │\n359 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:401:9\n    │\n401 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:388:30\n    │\n388 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:391:26\n    │\n391 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:408:13\n    │\n408 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:415:9\n    │\n415 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:416:9\n    │\n416 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:410:30\n    │\n410 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:455:17\n    │\n455 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:487:13\n    │\n487 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:494:13\n    │\n494 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:593:21\n    │\n593 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n594 │ ┃             action,\n595 │ ┃             bytes(admissionBody(hooks)),\n596 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n597 │ ┃             imd,\n598 │ ┃             price\n599 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:603:9\n    │\n603 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:586:70\n    │\n586 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:627:21\n    │\n627 │                     emit HookAdmitted(open[i], requestId);\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/MarginaliaAnnex.sol:673:13\n    │\n673 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:654:18\n    │\n654 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:661:38\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:661:46\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:662:24\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:662:32\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:669:9\n    │\n669 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\n   │             ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7394,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 595.09µs (0.00ns CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.48ms (2.05ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.13ms (4.54ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 17.76ms (3.48ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 28.46ms (18.97ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 32.29ms (12.27ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 46.18ms (29.60ms CPU time)\n\nRan 26 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492823)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763896)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544275)\n[PASS] testAgentClassForContractAuthors() (gas: 1206088)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044977)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3460745)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2791883)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467464)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3608537)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134854)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 2743846)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1495641)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54517)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852958)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2228036)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1705980)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96996)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 732076)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23166)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2952349)\n[PASS] testObservationWindowAndSpacing() (gas: 898633)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 855286)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137551)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922354)\n[PASS] testRightCallReturnsTheBond() (gas: 1526986)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1509440)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 49.77ms (32.42ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 21926, ~: 19315)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 54.57ms (39.08ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 91.14ms (77.01ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 114.31ms (50.40ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 126.06ms (164.02ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106119, ~: 106129)\nLogs:\n  Bound result -68822\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 126.09ms (127.04ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 126.14ms (33.67ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 126.30ms (101.83ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 126.37ms (868.58µs CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 126.33ms (6.41ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 129563, ~: 114620)\nLogs:\n  Bound result 3\n  Bound result 1422998091376048\n  Bound result 638542869959395036706967732970\n  Bound result 999999999999999999999999999998\n  Bound result 1000000002\n  Bound result 183304281245812613399308346137\n  Bound result 756606770120135819359502760410\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36940, ~: 36939)\nLogs:\n  Bound result 11001\n  Bound result 372873\n  Bound result 12\n  Bound result 599220274865938559664479842726\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141470, ~: 141856)\nLogs:\n  Bound result 1267650600227075352991603096574\n  Bound result 1237940039285380274899124224\n  Bound result 4562\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36759, ~: 36889)\nLogs:\n  Bound result 11001\n  Bound result 47\n  Bound result 12\n  Bound result 599220274865938559664479842726\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23098, ~: 21542)\nLogs:\n  Bound result 576095271671332266423139766777859662111129\n  Bound result 11033007502802514232368\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39057, ~: 38339)\nLogs:\n  Bound result 2355740194596982692835910444517950361587\n  Bound result 213029533658614418312479066196952112\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16129, ~: 14429)\nLogs:\n  Bound result 80\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 54164, ~: 51987)\nLogs:\n  Bound result 27107\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36421, ~: 36429)\nLogs:\n  Bound result 1\n  Bound result 3873\n  Bound result 12\n  Bound result 599220274865938559664479842726\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 18736, ~: 16506)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21350, ~: 21299)\nLogs:\n  Bound result 242943165482848405\n  Bound result 5192296858534827628530496329220093\n  Bound result 23\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 63642, ~: 60341)\nLogs:\n  Bound result 0\n  Bound result 11\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 100019, ~: 91582)\nLogs:\n  Bound result 12\n  Bound result 4124025\n  Bound result 228125465870943669173230370238\n  Bound result 906420635787423121955109933240\n  Bound result 14612942780244890193365034642\n  Bound result 765892373345052212954920568567\n  Bound result 306221824406029095391895926894\n  Bound result 376820707218453867963761256431\n  Bound result 433872378518794085530981322337\n  Bound result 359821850039073991197969110521\n  Bound result 3\n  Bound result 162431086846934883991867538784\n  Bound result 569227076991821789097822642241\n  Bound result 21815329997943339319038939931\n  Bound result 150878254840742382304866841567\n  Bound result 962739858002667290524861141174\n  Bound result 58029093270667268141174706179\n  Bound result 243256147175280666593811\n  Bound result 854856536160486595211957687780\n  Bound result 2325453\n  Bound result 178347697755937333936565445432\n  Bound result 276\n  Bound result 289618894060949934825060174417\n  Bound result 822661219478\n  Bound result 1\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 126.31ms (1.04s CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 126.40ms (86.09ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838165, ~: 838176)\nLogs:\n  Bound result 9750000000000312294\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58958, ~: 58968)\nLogs:\n  Bound result 9750000000000003742\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 126.47ms (161.30ms CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 2)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 215   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 219   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 414   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 211   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 209   | 2       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 201   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 230   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 221   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 18618448265687\n  Bound result 29485\n  Bound result 5\n  Bound result 0\n  Bound result 99500000000000000000\n  Bound result 2662\n  Bound result 39\n  Bound result 2\n  Bound result 0\n  Bound result 9302\n  Bound result 2783\n  Bound result 44\n  Bound result 0\n  Bound result 461200043\n  Bound result 51682\n  Bound result 18\n  Bound result 0\n  Bound result 0\n  Bound result 6855\n  Bound result 0\n  Bound result 2178083051\n  Bound result 2\n  Bound result 5685\n  Bound result 4741\n  Bound result 65\n  Bound result 2\n  Bound result 2\n  Bound result 18000\n  Bound result 0\n  Bound result 3660\n  Bound result 2\n  Bound result 0\n  Bound result 8000\n  Bound result 51001\n  Bound result 28\n  Bound result 1\n  Bound result 2\n  Bound result 27\n  Bound result 1098\n  Bound result 9\n  Bound result 1\n  Bound result 0\n  Bound result 30841045352367249063794\n  Bound result 4819564728518505578419\n  Bound result 0\n  Bound result 1\n  Bound result 15955\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 3117440616336829617218\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3770\n  Bound result 36399\n  Bound result 21\n  Bound result 0\n  Bound result 50000000000000000000\n  Bound result 51381\n  Bound result 81\n  Bound result 0\n  Bound result 20\n  Bound result 1294\n  Bound result 3\n  Bound result 0\n  Bound result 2419200\n  Bound result 0\n  Bound result 1066098561459142947511\n  Bound result 12069\n  Bound result 56\n  Bound result 1\n  Bound result 14264337593543950336\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 306291325147818070960\n  Bound result 50097\n  Bound result 24\n  Bound result 0\n  Bound result 0\n  Bound result 5000\n  Bound result 49981\n  Bound result 87\n  Bound result 0\n  Bound result 1375\n  Bound result 20\n  Bound result 8\n  Bound result 589\n  Bound result 2260\n  Bound result 1800\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 489.82ms (472.19ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2386  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2524  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2431  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2459  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2488  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 8750043977755113264\n  Bound result 251532388\n  Bound result 691200\n  Bound result 100000000\n  Bound result 997\n  Bound result 1\n  Bound result 593208315305282176379219\n  Bound result 540932851798826746857820092130564598613706116367\n  Bound result 2542\n  Bound result 244749\n  Bound result 125851850757528677285397\n  Bound result 4384\n  Bound result 6749\n  Bound result 1319247939384534478222813399746672790388875957981\n  Bound result 25341\n  Bound result 7200\n  Bound result 1100000000000000000\n  Bound result 8388608\n  Bound result 1500000000000000000\n  Bound result 13\n  Bound result 458089233741591132\n  Bound result 1390\n  Bound result 8596974521181594298\n  Bound result 787763744282765106\n  Bound result 5236\n  Bound result 6187\n  Bound result 2000\n  Bound result 23488716722779996\n  Bound result 2137\n  Bound result 1885\n  Bound result 20000000000000000\n  Bound result 3094085759\n  Bound result 650057057350374175484432\n  Bound result 1144843866019349119410801699105247666598173731082\n  Bound result 25\n  Bound result 824\n  Bound result 150216027670530386275778\n  Bound result 173368\n  Bound result 6000\n  Bound result 50000\n  Bound result 4825\n  Bound result 130\n  Bound result 73\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.12s (1.11s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 505   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 543   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 526   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 541   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 488   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 501   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 533   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 484   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 491   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 511   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 480   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1058  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 502   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 517   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 495   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 535   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 515   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 520   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 495   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 8192\n  Bound result 2\n  Bound result 124783\n  Bound result 99999000000000000000056\n  Bound result 997\n  Bound result 1\n  Bound result 4\n  Bound result 9750000000000003399\n  Bound result 1\n  Bound result 19263\n  Bound result 500000000000000001\n  Bound result 5\n  Bound result 250000000000000000\n  Bound result 98000000000000021576\n  Bound result 20538\n  Bound result 9750000000000009049\n  Bound result 59872\n  Bound result 39219318529320711002424\n  Bound result 9750000000000000008\n  Bound result 345600\n  Bound result 36988649612434766575205\n  Bound result 2463\n  Bound result 62912686846945729603\n  Bound result 54577402885130994685\n  Bound result 2905427309413009786\n  Bound result 98000000000000001388\n  Bound result 5\n  Bound result 9750000000000017403\n  Bound result 9\n  Bound result 6\n  Bound result 1048907787409406782\n  Bound result 14\n  Bound result 11\n  Bound result 2718247660\n  Bound result 100000000000000000000\n  Bound result 5\n  Bound result 12\n  Bound result 345594\n  Bound result 99999002553310893274459\n  Bound result 13\n  Bound result 5\n  Bound result 14\n  Bound result 12\n  Bound result 11\n  Bound result 6\n  Bound result 345598\n  Bound result 2\n  Bound result 18899030278117498523260\n  Bound result 9\n  Bound result 3\n  Bound result 13\n  Bound result 9750000000000004525\n  Bound result 9750000000000013883\n  Bound result 8\n  Bound result 12\n  Bound result 4\n  Bound result 6\n  Bound result 16\n  Bound result 1934\n  Bound result 5000000000000000000\n  Bound result 250000000000000000\n  Bound result 2\n  Bound result 18\n  Bound result 9750000000000021241\n  Bound result 98000000000000006619\n  Bound result 9\n  Bound result 98000000000000010924\n  Bound result 9750000000000007622\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.26s (7.26s CPU time)\n\nRan 23 test suites in 7.27s (10.45s CPU time): 289 tests passed, 0 failed, 1 skipped (290 total tests)\n","passed":true},{"durationMs":162,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":553,\"AGENTS.md\":126,\"README.md\":245,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":677,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":924,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":16426,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a weak PRNG: \"delta < 0 && delta % int256(dt) != 0 (src/MarginaliaPricer.sol#215)\"\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:287: Reentrancy in MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292):\n[high/high] uninitialized-state at src/MarginaliaHook.sol:536: MarginaliaHook.observations (src/MarginaliaHook.sol#106) is never initialized. It is used in:\n[high/high] uninitialized-state at src/MarginaliaAnnex.sol:323: MarginaliaAnnex.observations (src/MarginaliaAnnex.sol#98) is never initialized. It is used in:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:377: MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPages.sol:404: MarginaliaPages.abandonClaim(bytes32) (src/MarginaliaPages.sol#404-411) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:464: MarginaliaAnnex._moreAdverse(MarginaliaTypes.Note,MarginaliaTypes.Observation,MarginaliaTypes.Observation) (src/MarginaliaAnnex.sol#464-478) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:299: MarginaliaRouter.unlockCallback(bytes) (src/MarginaliaRouter.sol#299-340) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:294: MarginaliaRouter._checkSubject(MarginaliaRouter.Job) (src/MarginaliaRouter.sol#294-297) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:176: MarginaliaPricer.settlePrice(MarginaliaTypes.Venue,bool,MarginaliaTypes.Observation[]) (src/MarginaliaPricer.sol#176-201) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:287: MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:238: MarginaliaAnnex.post(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256,uint256) (src/MarginaliaAnnex.sol#238-290) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:238: MarginaliaAnnex.post(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256,uint256) (src/MarginaliaAnnex.sol#238-290) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:579: MarginaliaHook._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaHook.sol#579-582) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:135: MarginaliaPricer.postPrice(IPoolManager,MarginaliaTypes.Venue,address,bool,MarginaliaTypes.PriceWindow) (src/MarginaliaPricer.sol#135-155) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:242: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey) (src/MarginaliaRouter.sol#242-284) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:480: MarginaliaAnnex._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaAnnex.sol#480-483) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:603: Reentrancy in MarginaliaHook.settle(bytes32) (src/MarginaliaHook.sol#603-652):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:337: Reentrancy in MarginaliaPages.requestClaim(string,uint256) (src/MarginaliaPages.sol#337-364):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:855: Reentrancy in MarginaliaHook.payJudged(uint32,bytes32[3]) (src/MarginaliaHook.sol#855-874):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:248: Reentrancy in MarginaliaPages.buy(bytes32,uint256,uint256) (src/MarginaliaPages.sol#248-261):\n[medium/medium] reentrancy-no-eth at src/MarginaliaJudge.sol:203: Reentrancy in MarginaliaJudge.requestJudging(uint32) (src/MarginaliaJudge.sol#203-226):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:679: Reentrancy in MarginaliaHook.retract(bytes32,string) (src/MarginaliaHook.sol#679-695):\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:179: MarginaliaRouter.sellWithNote(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#179) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:331: MarginaliaAnnex.observe(bytes32).xRead (src/MarginaliaAnnex.sol#331) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:368: MarginaliaAnnex.settle(bytes32).emptied (src/MarginaliaAnnex.sol#368) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:549: MarginaliaAnnex.admissionBody(address[]).named (src/MarginaliaAnnex.sol#549) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:127: MarginaliaJudge.questionBody(uint32).allow (src/MarginaliaJudge.sol#127) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:363: MarginaliaAnnex.settle(bytes32).settlePrice (src/MarginaliaAnnex.sol#363) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:611: MarginaliaHook.settle(bytes32).settlePrice (src/MarginaliaHook.sol#611) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:548: MarginaliaAnnex.admissionBody(address[]).list (src/MarginaliaAnnex.sol#548) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:166: MarginaliaRouter.note(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#166) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:332: MarginaliaAnnex.observe(bytes32).quoteRead (src/MarginaliaAnnex.sol#332) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:257: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey).job (src/MarginaliaRouter.sol#257) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:113: MarginaliaJudge.eligibleTheses(uint32).n (src/MarginaliaJudge.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:205: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t1 (src/MarginaliaRouter.sol#205) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:272: MarginaliaJudge.judgedOf(uint32).dup (src/MarginaliaJudge.sol#272) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:268: MarginaliaJudge.judgedOf(uint32).kept (src/MarginaliaJudge.sol#268) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:862: MarginaliaHook.payJudged(uint32,bytes32[3]).paidAmounts (src/MarginaliaHook.sol#862) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:168: MarginaliaJudge._dec(uint256).n (src/MarginaliaJudge.sol#168) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:204: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t0 (src/MarginaliaRouter.sol#204) is a local variable never initialized\n[medium/medium] unused-return at src/MarginaliaPricer.sol:255: MarginaliaPricer._quoteSpot(IPoolManager,address,address) (src/MarginaliaPricer.sol#255-264) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(HUB_POOL_ID)) (src/MarginaliaPricer.sol#260)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = annex.records(wallet) (src/MarginaliaPages.sol#223)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:642: MarginaliaAnnex.unlockCallback(bytes) (src/MarginaliaAnnex.sol#642-676) ignores return value by manager.settle() (src/MarginaliaAnnex.sol#669)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (r0,r1,None) = IUniswapV2PairOracle(ref).getReserves() (src/MarginaliaPricer.sol#245)\n[medium/medium] unused-return at src/MarginaliaHook.sol:930: MarginaliaHook.unlockCallback(bytes) (src/MarginaliaHook.sol#930-950) ignores return value by poolManager.settle() (src/MarginaliaHook.sol#945)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = IMarginaliaRecords(address(hook)).records(wallet) (src/MarginaliaPages.sol#220)\n[medium/medium] unused-return at src/MarginaliaHook.sol:294: MarginaliaHook.margPriceInImd() (src/MarginaliaHook.sol#294-297) ignores return value by (sqrtP,None,None,None) = poolManager.getSlot0(poolId) (src/MarginaliaHook.sol#295)\n[medium/medium] unused-return at src/MarginaliaPages.sol:430: MarginaliaPages._burnMarg(uint256) (src/MarginaliaPages.sol#430-432) ignores return value by hook.poolManager().unlock(abi.encode(imdIn)) (src/MarginaliaPages.sol#431)\n[medium/medium] unused-return at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) ignores return value by (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP_scope_0,None,None,None,None,None,None) = IUniswapV3PoolOracle(ref).slot0() (src/MarginaliaPricer.sol#241)\n[medium/medium] unused-return at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) ignores return value by (r0,r1,None) = pair.getReserves() (src/MarginaliaRouter.sol#426)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:267: MarginaliaPricer._v3Cumulative(address) (src/MarginaliaPricer.sol#267-271) ignores return value by (cum,None) = IUniswapV3PoolOracle(pool).observe(ago) (src/MarginaliaPricer.sol#269)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(v.ref)) (src/MarginaliaPricer.sol#237)\n[medium/medium] unused-return at src/MarginaliaPages.sol:434: MarginaliaPages.unlockCallback(bytes) (src/MarginaliaPages.sol#434-460) ignores return value by manager.settle() (src/MarginaliaPages.sol#455)\n[low/high] shadowing-local at src/MarginaliaHook.sol:859: MarginaliaHook.payJudged(uint32,bytes32[3]).pool (src/MarginaliaHook.sol#859) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.noteMeta(bytes32).week (src/MarginaliaJudge.sol#19) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesesOfWeek(uint32).week (src/MarginaliaJudge.sol#15) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesisPool(uint32).week (src/MarginaliaJudge.sol#12) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.drawForJudging(uint32,uint256,bool).week (src/MarginaliaJudge.sol#21) shadows:\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:266: MarginaliaJudge.judgedOf(uint32) (src/MarginaliaJudge.sol#266-279) has external calls inside a loop: (author,noteWeek,thesis,hasChild) = hook.noteMeta(ranked[i]) (src/MarginaliaJudge.sol#270)\n[low/medium] calls-loop at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) has external calls inside a loop: out = poolManager.unlock(data) (src/MarginaliaHook.sol#925)\n[low/medium] calls-loop at src/MarginaliaAnnex.sol:446: MarginaliaAnnex._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaAnnex.sol#446-462) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaAnnex.sol#455-460)\n[low/medium] calls-loop at src/MarginaliaHook.sol:658: MarginaliaHook._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaHook.sol#658-676) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaHook.sol#669-674)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:91: MarginaliaJudge.con","passed":true},{"durationMs":991,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/MarginaliaPages.sol:169: `abi.encodePacked()` Hash Collision (2 places)\n[high] eth-send-unchecked-address at src/MarginaliaHook.sol:779: ETH transferred without address checks (3 places)\n[high] reentrancy-state-change at src/MarginaliaAnnex.sol:219: Reentrancy: State change after external call (25 places)\n[high] storage-array-memory-edit at src/MarginaliaAnnex.sol:346: Storage Array Edited with Memory (2 places)\n[high] unsafe-casting at src/MarginaliaHook.sol:936: Unsafe Casting of integers\n[low] costly-loop at src/MarginaliaAnnex.sol:623: Costly operations inside loop (4 places)\n[low] internal-function-used-once at src/HookFlags.sol:26: Internal Function Used Only Once (4 places)\n[low] large-numeric-literal at src/Marginalia.sol:10: Large Numeric Literal (28 places)\n[low] literal-instead-of-constant at src/MarginaliaAnnex.sol:252: Literal Instead of Constant (68 places)\n[low] local-variable-shadowing at src/MarginaliaHook.sol:859: Local Variable Shadows State Variable\n[low] require-revert-in-loop at src/MarginaliaAnnex.sol:550: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/MarginaliaHook.sol:835: State Change Without Event (6 places)\n[low] state-no-address-check at src/MarginaliaRouter.sol:135: Address State Variable Set Without Checks\n[low] unchecked-return at src/MarginaliaAnnex.sol:259: Unchecked Return (10 places)\n[low] uninitialized-local-variable at src/MarginaliaAnnex.sol:453: Uninitialized Local Variable (4 places)\n[low] unused-import at src/MarginaliaHook.sol:10: Unused Import\n[low] unused-public-function at src/MarginaliaHook.sol:294: Public Function Not Used Internally (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b42cf4d82c4b014d457b86f67c5b24d5b06595f40954888f7605b3c4a8b5a513","verifiedTreeHash":"a6d68df059a70bcf1c5c4367a621eb4155c4e05f","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":328224,"exitCode":0,"name":"build","output":"Compiling 124 files with Solc 0.8.26\nSolc 0.8.26 finished in 327.94s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/AnnexInvariant.t.sol:477:52:\n    |\n477 |         try annex.requestAdmission(asked) returns (bytes32 r) {\n    |                                                    ^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/AnnexInvariant.t.sol:504:19:\n    |\n504 |         (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerKey, annex.attestationDigest(a));\n    |                   ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' 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/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:638:28\n    │\n638 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:246:13\n    │\n246 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:289:9\n    │\n289 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:271:22\n    │\n271 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:272:17\n    │\n272 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:338:74\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                                          ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:338:81\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\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/MarginaliaAnnex.sol:327:13\n    │\n327 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:328:13\n    │\n328 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:344:47\n    │\n344 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:352:9\n    │\n352 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:27\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:338:52\n    │\n338 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:442:9\n    │\n442 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:373:18\n    │\n373 │             if (!emptied) settlePrice = _settlementPrice(n, obs);\n    │                  ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:374:17\n    │\n374 │             if (settlePrice == 0 && !emptied) {\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/MarginaliaAnnex.sol:359:13\n    │\n359 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:401:9\n    │\n401 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:388:30\n    │\n388 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:391:26\n    │\n391 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:408:13\n    │\n408 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:415:9\n    │\n415 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:416:9\n    │\n416 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:410:30\n    │\n410 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:455:17\n    │\n455 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:487:13\n    │\n487 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:494:13\n    │\n494 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:593:21\n    │\n593 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n594 │ ┃             action,\n595 │ ┃             bytes(admissionBody(hooks)),\n596 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n597 │ ┃             imd,\n598 │ ┃             price\n599 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\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/MarginaliaAnnex.sol:603:9\n    │\n603 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:586:70\n    │\n586 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:627:21\n    │\n627 │                     emit HookAdmitted(open[i], requestId);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:673:13\n    │\n673 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:654:18\n    │\n654 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:661:38\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:661:46\n    │\n661 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:662:24\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:662:32\n    │\n662 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:669:9\n    │\n669 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\n   │             ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n     ╭▸ test/AnnexAdversarial.t.sol:189:21\n     │\n 189 │         a.chainId = block.chainid;\n     │                     ━━━━━━━━━━━━━\n     ‡\n1010 │         vm.chainId(999);\n     │         ─────────────── `vm.chainId` changes this environment here\n     │\n     ├ help: capture it with `vm.getChainId()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7332,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 593.89µs (0.00ns CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.19ms (2.37ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 10.75ms (4.57ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 15.19ms (10.36ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 20.36ms (10.31ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 22253, ~: 20080)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 27.90ms (23.94ms CPU time)\n\nRan 26 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492823)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763896)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544275)\n[PASS] testAgentClassForContractAuthors() (gas: 1206088)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044977)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3460745)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2791883)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467464)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3608537)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134854)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 2743846)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1495641)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54517)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852958)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2228036)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1705980)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96996)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 732076)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23166)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2952349)\n[PASS] testObservationWindowAndSpacing() (gas: 898633)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 855286)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137551)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922354)\n[PASS] testRightCallReturnsTheBond() (gas: 1526986)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1509440)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 28.94ms (19.45ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 34.93ms (27.23ms CPU time)\n\nRan 28 tests for test/AnnexAdversarial.t.sol:AnnexAdversarialTest\n[PASS] testAdmissionListRulesAndPrice() (gas: 2593784)\n[PASS] testAnEmptyAnswerIsStoredNotReverted() (gas: 1166600)\n[PASS] testAnLpPullCannotTurnAWrongCallIntoARefund() (gas: 1754243)\n[PASS] testAttestationEdgesAreRefusedOneByOne() (gas: 1595946)\n[PASS] testBaselineBoundIsInclusiveAtTheBaselineAndOffAtZero() (gas: 3624656)\n[PASS] testBaselineBoundReadsTheSidesOwnBaseline() (gas: 2440740)\n[PASS] testCallbackGasAtTheFullListStaysUnderTheStipend() (gas: 2113488)\n[PASS] testCheckpointWindowAgesAndExpiresLikeTheRouter() (gas: 4956579)\n[PASS] testConstructorStoresFourValuesWithoutReadingTheChain() (gas: 51724)\n[PASS] testCountersRefuseClosedParentsAndTheses() (gas: 5708031)\n[PASS] testFewerThanThreePricelessReadingsAreStillNoData() (gas: 1413135)\n[PASS] testHoldRuleGiftsCountAsHeldAndAReadFailureAsBroken() (gas: 4199696)\n[PASS] testLifecycleRefusalsOnUnknownClosedAndForeignNotes() (gas: 1867825)\n[PASS] testMoreAdverseReadingReplacesTheLastInTheSameBlock() (gas: 1805050)\n[PASS] testOneOracleUuidServesOneRequestOnly() (gas: 1426936)\n[PASS] testPostBoundariesExactly() (gas: 2246587)\n[PASS] testPricelessReadingsRankBelowABreachAndAboveAnyPrice() (gas: 3351293)\n[PASS] testProtocolVectorDigestSelectorAndSignature() (gas: 1185884)\n[PASS] testScoreIsDifficultyWeightedAndRetractIsHalf() (gas: 4688644)\n[PASS] testSellCallSettlesRightAndMaySellThroughTheHorizon() (gas: 1541891)\n[PASS] testSellCallWrongWhenThePriceRises() (gas: 1595260)\n[PASS] testSettlementTakesTheMostAdverseReading() (gas: 1762574)\n[PASS] testSixteenReadingsAtMostAndTheLastSlotWaitsForTheHour() (gas: 4674854)\n[PASS] testSlippageAndUnfundedAuthorsTakeNothing() (gas: 1548295)\n[PASS] testSplitIsExactAndNothingStaysInTheAnnex() (gas: 632482)\n[PASS] testThreeReadingsInsideAnHourAreNoData() (gas: 1492228)\n[PASS] testUnlockCallbackAcceptsOnlyThePoolManager() (gas: 630756)\n[PASS] testVenueQuoteRule() (gas: 1222381)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 35.56ms (41.29ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 68.74ms (87.59ms CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 96.26ms (6.84ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 107.41ms (6.83ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 107.26ms (92.19ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 108.78ms (24.49ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 105958, ~: 106111)\nLogs:\n  Bound result 14835\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 121.77ms (18.10ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838164, ~: 838176)\nLogs:\n  Bound result 5118915866220045712\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58957, ~: 58968)\nLogs:\n  Bound result 9750000000000009015\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 121.80ms (201.28ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 124.60ms (154.68ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 124.73ms (37.84ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 124.65ms (74.66ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 124.78ms (531.87µs CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 133076, ~: 114844)\nLogs:\n  Bound result 2\n  Bound result 771005964206074286793396630579\n  Bound result 515838748565487192535180210300\n  Bound result 1000000001\n  Bound result 382722315410021752069311570446\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36919, ~: 36921)\nLogs:\n  Bound result 9989315\n  Bound result 11000\n  Bound result 1\n  Bound result 4731291315743030923\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141583, ~: 141887)\nLogs:\n  Bound result 86876464396802749825707841970\n  Bound result 1266412660189234547323125452406\n  Bound result 1\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36764, ~: 36902)\nLogs:\n  Bound result 989315\n  Bound result 1\n  Bound result 1\n  Bound result 4731291315743030923\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23489, ~: 21564)\nLogs:\n  Bound result 54933845692814916411780612294197277208572629\n  Bound result 262487382507606293056881445\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39558, ~: 39119)\nLogs:\n  Bound result 5298294414293543997669025463990708463017\n  Bound result 564733577753140126106868492862969513\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 15802, ~: 14064)\nLogs:\n  Bound result 30\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 53969, ~: 51987)\nLogs:\n  Bound result 9828\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36429, ~: 36404)\nLogs:\n  Bound result 641\n  Bound result 6000\n  Bound result 69\n  Bound result 77\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 18988, ~: 16591)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21372, ~: 21299)\nLogs:\n  Bound result 24485215663920517434899\n  Bound result 595861981717055180183\n  Bound result 1710897\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 64392, ~: 61087)\nLogs:\n  Bound result -120\n  Bound result 12\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 99155, ~: 91489)\nLogs:\n  Bound result 12\n  Bound result 1800003600\n  Bound result 158456325028528675187087900672\n  Bound result 150\n  Bound result 2419200\n  Bound result 19854\n  Bound result 10819\n  Bound result 2\n  Bound result 28799\n  Bound result 37500000000000000000\n  Bound result 210\n  Bound result 694270066784247067953537247501\n  Bound result 1500000000000000000000000\n  Bound result 15000\n  Bound result 23106\n  Bound result 3082\n  Bound result 15080\n  Bound result 9096\n  Bound result 50\n  Bound result 48\n  Bound result 2400\n  Bound result 32812\n  Bound result 25\n  Bound result 5922\n  Bound result 1800000000\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 124.85ms (1.09s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 4)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 248   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 193   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 426   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 228   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 196   | 4       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 206   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 224   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 199   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 228\n  Bound result 0\n  Bound result 6931\n  Bound result 50281\n  Bound result 91\n  Bound result 0\n  Bound result 4\n  Bound result 50005\n  Bound result 33\n  Bound result 3092\n  Bound result 1\n  Bound result 418630441\n  Bound result 0\n  Bound result 32437350073250948223\n  Bound result 10001\n  Bound result 48\n  Bound result 4336\n  Bound result 2\n  Bound result 300\n  Bound result 15988\n  Bound result 92\n  Bound result 687\n  Bound result 1\n  Bound result 27\n  Bound result 512\n  Bound result 14\n  Bound result 2\n  Bound result 2\n  Bound result 72056494526300160\n  Bound result 2\n  Bound result 10500\n  Bound result 50113\n  Bound result 19\n  Bound result 1\n  Bound result 2\n  Bound result 19908\n  Bound result 754\n  Bound result 1\n  Bound result 1\n  Bound result 60\n  Bound result 0\n  Bound result 3376814322\n  Bound result 6864\n  Bound result 52\n  Bound result 0\n  Bound result 2\n  Bound result 1800\n  Bound result 40002\n  Bound result 8\n  Bound result 13\n  Bound result 1\n  Bound result 0\n  Bound result 54115\n  Bound result 50006\n  Bound result 12\n  Bound result 1\n  Bound result 700000000000000000000\n  Bound result 52401\n  Bound result 12\n  Bound result 2\n  Bound result 20\n  Bound result 22016\n  Bound result 2\n  Bound result 0\n  Bound result 37500000000000000000\n  Bound result 58689\n  Bound result 88\n  Bound result 0\n  Bound result 0\n  Bound result 240361897591530673867\n  Bound result 10002\n  Bound result 54\n  Bound result 1\n  Bound result 6291\n  Bound result 0\n  Bound result 457584007913129639836\n  Bound result 2\n  Bound result 1\n  Bound result 11000\n  Bound result 58328\n  Bound result 19\n  Bound result 1000000000000000000000\n  Bound result 2\n  Bound result 1211\n  Bound result 1\n  Bound result 716283019655932542975\n  Bound result 4091\n  Bound result 87\n  Bound result 1\n  Bound result 6347\n  Bound result 3686\n  Bound result 55\n  Bound result 1\n  Bound result 300000000000000000\n  Bound result 1\n  Bound result 1433166039311865098624\n  Bound result 1\n  Bound result 1\n  Bound result 15215\n  Bound result 0\n  Bound result 2350000000000000000\n  Bound result 344\n  Bound result 20\n  Bound result 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 487.69ms (466.09ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2458  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2498  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2427  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2490  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2415  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 200000000000000000000000\n  Bound result 4003\n  Bound result 647153\n  Bound result 6171\n  Bound result 8782\n  Bound result 229496\n  Bound result 3041954473\n  Bound result 150938\n  Bound result 320\n  Bound result 200\n  Bound result 62899200\n  Bound result 4018\n  Bound result 266412963841012544793658\n  Bound result 500000000000000001\n  Bound result 60000\n  Bound result 6151\n  Bound result 50000000000000000\n  Bound result 6110\n  Bound result 6189\n  Bound result 11893885297948\n  Bound result 72\n  Bound result 8461\n  Bound result 111461\n  Bound result 7082852134016808806\n  Bound result 2966\n  Bound result 943138306600211565520786\n  Bound result 109860\n  Bound result 256\n  Bound result 2841\n  Bound result 86400\n  Bound result 9345\n  Bound result 2000000000000000000\n  Bound result 10000000000000000000\n  Bound result 10000000000000000000\n  Bound result 60234\n  Bound result 1695\n  Bound result 192989\n  Bound result 5285\n  Bound result 10000000\n  Bound result 97\n  Bound result 1428\n  Bound result 604800\n  Bound result 2434\n  Bound result 256\n  Bound result 3096\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.12s (1.11s CPU time)\n\nRan 1 test for test/AnnexInvariant.t.sol:AnnexInvariantTest\n[PASS]\nAnnexInvariantTest invariants:\n[PASS] invariant_admissionIsPermanent\n[PASS] invariant_bondsConserved\n[PASS] invariant_imdHeldEqualsBondsOwed\n[PASS] invariant_noMargRetained\n[PASS] invariant_recordsCountOutcomes\n[PASS] invariant_statusesAreFinalAndDepositsMatch\n AnnexInvariantTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| AnnexHandler | admission         | 349   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | claim             | 373   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | moveX             | 350   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | observe           | 358   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | observeSeries     | 354   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | post              | 340   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | pullOrRefillVenue | 366   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | retract           | 366   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | settle            | 339   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | strangerClaim     | 363   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | tradeMarg         | 351   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | tradeX            | 339   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | warp              | 360   | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 299999000000000000000844\n  Bound result 29361\n  Bound result 3\n  Bound result 9750000000056291071\n  Bound result 9031\n  Bound result 226489792566772575170538\n  Bound result 99999000000000000019039\n  Bound result 11000\n  Bound result 2\n  Bound result 9750000000000040001\n  Bound result 20556\n  Bound result 153217528675187087372483\n  Bound result 2400\n  Bound result 299999000000000000000120\n  Bound result 285096663969197703572\n  Bound result 128000\n  Bound result 4999999999999999995\n  Bound result 23761\n  Bound result 99999000000001359182280\n  Bound result 20000000000000000000000\n  Bound result 99999000000000000009001\n  Bound result 1824\n  Bound result 99999000000000000006282\n  Bound result 299999000000000000000009\n  Bound result 3600\n  posts 1 settles 1\n  claimed 0 forfeited to pools 8775000000050661964\n  keeper paid 975000000005629107 admitted hooks 0\n  bounded posts 0 priceless readings 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.15s (2.14s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 536   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 507   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 521   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 533   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 558   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 534   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 466   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 507   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 490   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 516   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 987   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 518   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 527   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 520   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 482   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 508   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 509   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 509   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 84749425756619930347\n  Bound result 4\n  Bound result 4\n  Bound result 2797\n  Bound result 8219022309815144579\n  Bound result 5\n  Bound result 10\n  Bound result 5\n  Bound result 114736\n  Bound result 372\n  Bound result 3\n  Bound result 99999999999999999981\n  Bound result 4\n  Bound result 9750000000000001910\n  Bound result 2\n  Bound result 23381\n  Bound result 99345529871600402100700\n  Bound result 5\n  Bound result 1535380274772156015\n  Bound result 999999897435897436\n  Bound result 7\n  Bound result 8\n  Bound result 8\n  Bound result 11513\n  Bound result 96558537022897301263031\n  Bound result 50\n  Bound result 6\n  Bound result 250000000000000001\n  Bound result 3\n  Bound result 8453\n  Bound result 172800\n  Bound result 1\n  Bound result 2249999999999969231\n  Bound result 6\n  Bound result 98000000002807011245\n  Bound result 1\n  Bound result 2749999999999997949\n  Bound result 9750000000000001861\n  Bound result 11\n  Bound result 8\n  Bound result 3\n  Bound result 10\n  Bound result 91524076928625126767790\n  Bound result 32271\n  Bound result 2\n  Bound result 13\n  Bound result 99999000000000016773120\n  Bound result 7469\n  Bound result 99999000000000000200001\n  Bound result 30953937890005485813481\n  Bound result 18793\n  Bound result 1\n  Bound result 11\n  Bound result 12\n  Bound result 9\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.19s (7.19s CPU time)\n\nRan 25 test suites in 7.19s (12.47s CPU time): 318 tests passed, 0 failed, 1 skipped (319 total tests)\n","passed":true},{"durationMs":202,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":553,\"AGENTS.md\":126,\"README.md\":245,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":677,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":924,\"test/AnnexAdversarial.t.sol\":1244,\"test/AnnexInvariant.t.sol\":679,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"da534bbc65b5cd262b47651d79589cf4ea7591314fa72c365bb6808eec282a2c","verifiedTreeHash":"c3f1ac68d557172eec4b541f3e51261b531d3e19","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":266360,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 266.11s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[boolean-cst]: misuse of a boolean constant\n    ╭▸ src/MarginaliaAnnex.sol:489:45\n    │\n489 │         if (!ok || ret.length < 32) return (false, 0);\n    │                                             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:253:13\n    │\n253 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:295:9\n    │\n295 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:278:22\n    │\n278 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:279:17\n    │\n279 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:333:13\n    │\n333 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:334:13\n    │\n334 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:345:47\n    │\n345 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:353:9\n    │\n353 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:27\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:52\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:439:9\n    │\n439 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:398:35\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:360:13\n    │\n360 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:398:9\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:385:30\n    │\n385 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:388:26\n    │\n388 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:405:13\n    │\n405 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:412:9\n    │\n412 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:413:9\n    │\n413 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:407:30\n    │\n407 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:452:17\n    │\n452 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:488:21\n    │\n488 │         (ok, ret) = x.staticcall{gas: BALANCE_READ_GAS}(data);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:612:21\n    │\n612 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n613 │ ┃             action,\n614 │ ┃             bytes(admissionBody(hooks)),\n615 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n616 │ ┃             imd,\n617 │ ┃             price\n618 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:622:9\n    │\n622 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:605:70\n    │\n605 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:646:21\n    │\n646 │                     emit HookAdmitted(open[i], requestId);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:691:13\n    │\n691 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:672:18\n    │\n672 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:679:38\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:679:46\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:680:24\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:680:32\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:687:9\n    │\n687 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7328,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 939.82µs (0.00ns CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.92ms (2.11ms CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.75ms (3.69ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 14.27ms (5.21ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 14.74ms (7.54ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 18.77ms (8.22ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 25.00ms (16.63ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 25.67ms (35.13ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 27.19ms (20.30ms CPU time)\n\nRan 29 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAPulledPoolPushedToAnExtremeIsReadAtTheExtreme() (gas: 4898651)\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2491254)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 759446)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1542625)\n[PASS] testAgentClassForContractAuthors() (gas: 1208062)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1042590)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3472853)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2799765)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467516)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609075)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 135567)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 3126196)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1677805)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54539)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1851403)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2230314)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1708364)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 98895)\n[PASS] testMargVenueBaselineBoundNeedsRoomForThePostsOwnPurchase() (gas: 1102399)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 734020)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23176)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2956772)\n[PASS] testObservationWindowAndSpacing() (gas: 901122)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 857166)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137269)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 924322)\n[PASS] testRightCallReturnsTheBond() (gas: 1529261)\n[PASS] testSoldOutRangeStillSettlesRight() (gas: 3269214)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1511821)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 33.59ms (27.19ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 60.84ms (55.42ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 101.08ms (77.15ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 108.86ms (568.43µs CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 108.93ms (32.07ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 108.89ms (133.73ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 106068, ~: 106111)\nLogs:\n  Bound result 4000\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 108.89ms (86.04ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 113.64ms (44.73ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 22868, ~: 20760)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 118.67ms (29.92ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838165, ~: 838176)\nLogs:\n  Bound result 5000000000000000000\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58958, ~: 58968)\nLogs:\n  Bound result 250000000000000001\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 118.88ms (150.09ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 129073, ~: 113962)\nLogs:\n  Bound result 11\n  Bound result 569362300363645817537087292623\n  Bound result 1000000003\n  Bound result 999999999999999999999000007358\n  Bound result 1000000000000\n  Bound result 999999999999999999999000001081\n  Bound result 400000000000000000000\n  Bound result 999999999999999999999000019281\n  Bound result 999999999999999999999000006697\n  Bound result 999999999999999999999000006061\n  Bound result 999999999999999999999000028801\n  Bound result 999999999999999999999387663232\n  Bound result 999999999999999999999000007152\n  Bound result 999999999999999999999000003676\n  Bound result 999999999999999999999944818110\n  Bound result 999999999999999999999000000021\n  Bound result 999999999999999999999000001512\n  Bound result 999999999999999999999000012680\n  Bound result 1980000000000000000000\n  Bound result 999999999999999999999000005077\n  Bound result 999999999999999999999000999002\n  Bound result 999999999999999999999000005001\n  Bound result 50000000000000000\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36914, ~: 36960)\nLogs:\n  Bound result 5975257\n  Bound result 699631\n  Bound result 11\n  Bound result 845713006044288728045074196509\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141491, ~: 141832)\nLogs:\n  Bound result 1266412660188944021221804099611\n  Bound result 1266412660188944021221804113196\n  Bound result 7301\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36752, ~: 36900)\nLogs:\n  Bound result 11000\n  Bound result 90\n  Bound result 88\n  Bound result 10\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23366, ~: 21639)\nLogs:\n  Bound result 1461446703485210103287273052103988822378723990347\n  Bound result 1461446703485210103287273052103988822378723984795\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39235, ~: 38599)\nLogs:\n  Bound result 4817576725970182929935703230845172804092\n  Bound result 9999999999999999999999999999999999990030\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16050, ~: 14356)\nLogs:\n  Bound result 61\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 54242, ~: 51987)\nLogs:\n  Bound result 14630\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36452, ~: 36428)\nLogs:\n  Bound result 7384\n  Bound result 195\n  Bound result 23\n  Bound result 86400\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19285, ~: 17101)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21342, ~: 21299)\nLogs:\n  Bound result 5082\n  Bound result 2\n  Bound result 25\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 63011, ~: 59936)\nLogs:\n  Bound result -133\n  Bound result 3\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 99032, ~: 83439)\nLogs:\n  Bound result 1\n  Bound result 126\n  Bound result 370337483876876542863220740763\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 118.88ms (977.34ms CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 2)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 191   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 223   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 410   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 199   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 231   | 2       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 212   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 223   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 231   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 100000000000000000\n  Bound result 999\n  Bound result 19\n  Bound result 9\n  Bound result 0\n  Bound result 999001\n  Bound result 0\n  Bound result 0\n  Bound result 457\n  Bound result 201\n  Bound result 40\n  Bound result 0\n  Bound result 1038027497342589233435\n  Bound result 45797\n  Bound result 99\n  Bound result 0\n  Bound result 1\n  Bound result 1999999999999999999999\n  Bound result 8040\n  Bound result 5\n  Bound result 1\n  Bound result 2548542074\n  Bound result 50019\n  Bound result 0\n  Bound result 0\n  Bound result 2\n  Bound result 0\n  Bound result 3141\n  Bound result 2541\n  Bound result 1\n  Bound result 4096\n  Bound result 0\n  Bound result 1235278812534653596771\n  Bound result 3\n  Bound result 7\n  Bound result 2\n  Bound result 622\n  Bound result 2\n  Bound result 2000000000000000000000\n  Bound result 58978\n  Bound result 57\n  Bound result 1\n  Bound result 500000000000000000\n  Bound result 1\n  Bound result 6671\n  Bound result 57296\n  Bound result 49\n  Bound result 1\n  Bound result 912389983719937078044\n  Bound result 6301\n  Bound result 79\n  Bound result 3783\n  Bound result 2\n  Bound result 100\n  Bound result 0\n  Bound result 650000000000000000\n  Bound result 59065\n  Bound result 27\n  Bound result 0\n  Bound result 0\n  Bound result 15000\n  Bound result 17488\n  Bound result 64\n  Bound result 1\n  Bound result 98\n  Bound result 1\n  Bound result 15808\n  Bound result 1\n  Bound result 1902\n  Bound result 50012\n  Bound result 96\n  Bound result 1\n  Bound result 1884406387244185643010\n  Bound result 18\n  Bound result 71\n  Bound result 2\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 8810\n  Bound result 50065\n  Bound result 95\n  Bound result 0\n  Bound result 1324056287105997351250\n  Bound result 1093\n  Bound result 8\n  Bound result 0\n  Bound result 4950477813352361894009\n  Bound result 1\n  Bound result 3312\n  Bound result 195\n  Bound result 4999999999999999999999\n  Bound result 1\n  Bound result 0\n  Bound result 5400\n  Bound result 0\n  Bound result 12028\n  Bound result 8268\n  Bound result 7\n  Bound result 1\n  Bound result 10\n  Bound result 43\n  Bound result 83\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 471.20ms (458.19ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2462  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2408  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2480  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2444  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2494  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 7628530496329220096\n  Bound result 255\n  Bound result 6115878429168876579\n  Bound result 244\n  Bound result 4236\n  Bound result 7035\n  Bound result 1928028033\n  Bound result 1390\n  Bound result 472260498517428093450829853099908082\n  Bound result 57\n  Bound result 204\n  Bound result 5781\n  Bound result 100\n  Bound result 1149\n  Bound result 1842\n  Bound result 1000000000000000000000000000000000000000\n  Bound result 1119\n  Bound result 8976\n  Bound result 454373012108497280718315\n  Bound result 763600050\n  Bound result 129369\n  Bound result 117300740\n  Bound result 10000000000000000000\n  Bound result 6512\n  Bound result 735\n  Bound result 7534\n  Bound result 939019288152828454740844750\n  Bound result 18\n  Bound result 50966\n  Bound result 1000\n  Bound result 5\n  Bound result 6189\n  Bound result 2495930775285307636439662451909567988\n  Bound result 125819\n  Bound result 79228162514264337593543950336\n  Bound result 70\n  Bound result 729\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.04s (1.04s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 542   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 521   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 492   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 469   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 499   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 507   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 492   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 514   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 549   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 499   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1033  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 500   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 521   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 503   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 494   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 501   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 548   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 544   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 14251602503\n  Bound result 9750000000000005401\n  Bound result 3\n  Bound result 8924\n  Bound result 5\n  Bound result 9750000002939082605\n  Bound result 2\n  Bound result 3\n  Bound result 1800000000\n  Bound result 43\n  Bound result 4\n  Bound result 42688508548965964596624\n  Bound result 5\n  Bound result 3\n  Bound result 6\n  Bound result 99999000000000000018001\n  Bound result 6\n  Bound result 4\n  Bound result 100000000000000000000\n  Bound result 59600000000000000000\n  Bound result 2\n  Bound result 2\n  Bound result 9750000000000012715\n  Bound result 7\n  Bound result 5\n  Bound result 3\n  Bound result 98000000000000007581\n  Bound result 1\n  Bound result 8\n  Bound result 298220\n  Bound result 100000000000000000000\n  Bound result 99999000000000000004169\n  Bound result 9750000000000002001\n  Bound result 99999000394614252430185\n  Bound result 9750000000365729150\n  Bound result 6\n  Bound result 98000000000000000095\n  Bound result 2\n  Bound result 43379948883919784172\n  Bound result 4\n  Bound result 277941\n  Bound result 2\n  Bound result 98000000000000018171\n  Bound result 9750000000000000100\n  Bound result 62482843573848688091\n  Bound result 12\n  Bound result 8\n  Bound result 98000000000000012548\n  Bound result 10\n  Bound result 9750000000000001120\n  Bound result 50548891827367012614\n  Bound result 250000000000000002\n  Bound result 13\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.22s (7.22s CPU time)\n\nRan 23 test suites in 7.22s (9.97s CPU time): 292 tests passed, 0 failed, 1 skipped (293 total tests)\n","passed":true},{"durationMs":148,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":611,\"AGENTS.md\":126,\"README.md\":247,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":695,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":1053,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":15213,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a weak PRNG: \"delta < 0 && delta % int256(dt) != 0 (src/MarginaliaPricer.sol#215)\"\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:377: Reentrancy in MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:414: Reentrancy in MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439):\n[high/medium] reentrancy-balance at src/MarginaliaRouter.sol:287: Reentrancy in MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292):\n[high/high] uninitialized-state at src/MarginaliaHook.sol:536: MarginaliaHook.observations (src/MarginaliaHook.sol#106) is never initialized. It is used in:\n[high/high] uninitialized-state at src/MarginaliaAnnex.sol:329: MarginaliaAnnex.observations (src/MarginaliaAnnex.sol#105) is never initialized. It is used in:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:245: MarginaliaAnnex.post(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256,uint256) (src/MarginaliaAnnex.sol#245-296) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:377: MarginaliaRouter._tradeV3(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#377-404) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPages.sol:404: MarginaliaPages.abandonClaim(bytes32) (src/MarginaliaPages.sol#404-411) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:299: MarginaliaRouter.unlockCallback(bytes) (src/MarginaliaRouter.sol#299-340) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:294: MarginaliaRouter._checkSubject(MarginaliaRouter.Job) (src/MarginaliaRouter.sol#294-297) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:176: MarginaliaPricer.settlePrice(MarginaliaTypes.Venue,bool,MarginaliaTypes.Observation[]) (src/MarginaliaPricer.sol#176-201) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:287: MarginaliaRouter._pull(address,uint256) (src/MarginaliaRouter.sol#287-292) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:205: MarginaliaPricer.twap(MarginaliaTypes.VenueKind,bool,uint256,uint64,uint256,uint64) (src/MarginaliaPricer.sol#205-229) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:579: MarginaliaHook._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaHook.sol#579-582) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaTreasury.sol:42: MarginaliaTreasury.drip() (src/MarginaliaTreasury.sol#42-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaAnnex.sol:475: MarginaliaAnnex._broken(MarginaliaTypes.Note,uint256) (src/MarginaliaAnnex.sol#475-478) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:135: MarginaliaPricer.postPrice(IPoolManager,MarginaliaTypes.Venue,address,bool,MarginaliaTypes.PriceWindow) (src/MarginaliaPricer.sol#135-155) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaRouter.sol:242: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey) (src/MarginaliaRouter.sol#242-284) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/MarginaliaPricer.sol:295: MarginaliaPricer.fromSqrt(uint160,bool) (src/MarginaliaPricer.sol#295-304) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:603: Reentrancy in MarginaliaHook.settle(bytes32) (src/MarginaliaHook.sol#603-652):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:337: Reentrancy in MarginaliaPages.requestClaim(string,uint256) (src/MarginaliaPages.sol#337-364):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:855: Reentrancy in MarginaliaHook.payJudged(uint32,bytes32[3]) (src/MarginaliaHook.sol#855-874):\n[medium/medium] reentrancy-no-eth at src/MarginaliaPages.sol:248: Reentrancy in MarginaliaPages.buy(bytes32,uint256,uint256) (src/MarginaliaPages.sol#248-261):\n[medium/medium] reentrancy-no-eth at src/MarginaliaJudge.sol:203: Reentrancy in MarginaliaJudge.requestJudging(uint32) (src/MarginaliaJudge.sol#203-226):\n[medium/medium] reentrancy-no-eth at src/MarginaliaHook.sol:679: Reentrancy in MarginaliaHook.retract(bytes32,string) (src/MarginaliaHook.sol#679-695):\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:179: MarginaliaRouter.sellWithNote(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#179) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:572: MarginaliaAnnex.admissionBody(address[]).named (src/MarginaliaAnnex.sol#572) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:127: MarginaliaJudge.questionBody(uint32).allow (src/MarginaliaJudge.sol#127) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:364: MarginaliaAnnex.settle(bytes32).settlePrice (src/MarginaliaAnnex.sol#364) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:611: MarginaliaHook.settle(bytes32).settlePrice (src/MarginaliaHook.sol#611) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaAnnex.sol:571: MarginaliaAnnex.admissionBody(address[]).list (src/MarginaliaAnnex.sol#571) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:166: MarginaliaRouter.note(MarginaliaTypes.NoteParams,PoolKey,uint256,uint256,uint256).noX (src/MarginaliaRouter.sol#166) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:257: MarginaliaRouter._run(bool,uint256,uint256,uint256,MarginaliaRouter.XTrade,MarginaliaTypes.NoteParams,PoolKey).job (src/MarginaliaRouter.sol#257) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:113: MarginaliaJudge.eligibleTheses(uint32).n (src/MarginaliaJudge.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:205: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t1 (src/MarginaliaRouter.sol#205) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:272: MarginaliaJudge.judgedOf(uint32).dup (src/MarginaliaJudge.sol#272) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:268: MarginaliaJudge.judgedOf(uint32).kept (src/MarginaliaJudge.sol#268) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaHook.sol:862: MarginaliaHook.payJudged(uint32,bytes32[3]).paidAmounts (src/MarginaliaHook.sol#862) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaJudge.sol:168: MarginaliaJudge._dec(uint256).n (src/MarginaliaJudge.sol#168) is a local variable never initialized\n[medium/medium] uninitialized-local at src/MarginaliaRouter.sol:204: MarginaliaRouter.validateVenue(MarginaliaTypes.NoteParams,PoolKey).t0 (src/MarginaliaRouter.sol#204) is a local variable never initialized\n[medium/medium] unused-return at src/MarginaliaPricer.sol:255: MarginaliaPricer._quoteSpot(IPoolManager,address,address) (src/MarginaliaPricer.sol#255-264) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(HUB_POOL_ID)) (src/MarginaliaPricer.sol#260)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = annex.records(wallet) (src/MarginaliaPages.sol#223)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (r0,r1,None) = IUniswapV2PairOracle(ref).getReserves() (src/MarginaliaPricer.sol#245)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:511: MarginaliaAnnex._spot(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaAnnex.sol#511-526) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(pid) (src/MarginaliaAnnex.sol#519)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:511: MarginaliaAnnex._spot(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaAnnex.sol#511-526) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(HUB_POOL_ID)) (src/MarginaliaAnnex.sol#524)\n[medium/medium] unused-return at src/MarginaliaHook.sol:930: MarginaliaHook.unlockCallback(bytes) (src/MarginaliaHook.sol#930-950) ignores return value by poolManager.settle() (src/MarginaliaHook.sol#945)\n[medium/medium] unused-return at src/MarginaliaPages.sol:218: MarginaliaPages.eligible(address) (src/MarginaliaPages.sol#218-230) ignores return value by (None,posted) = IMarginaliaRecords(address(hook)).records(wallet) (src/MarginaliaPages.sol#220)\n[medium/medium] unused-return at src/MarginaliaHook.sol:294: MarginaliaHook.margPriceInImd() (src/MarginaliaHook.sol#294-297) ignores return value by (sqrtP,None,None,None) = poolManager.getSlot0(poolId) (src/MarginaliaHook.sol#295)\n[medium/medium] unused-return at src/MarginaliaPages.sol:430: MarginaliaPages._burnMarg(uint256) (src/MarginaliaPages.sol#430-432) ignores return value by hook.poolManager().unlock(abi.encode(imdIn)) (src/MarginaliaPages.sol#431)\n[medium/medium] unused-return at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) ignores return value by (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP_scope_0,None,None,None,None,None,None) = IUniswapV3PoolOracle(ref).slot0() (src/MarginaliaPricer.sol#241)\n[medium/medium] unused-return at src/MarginaliaRouter.sol:414: MarginaliaRouter._tradeV2(address,MarginaliaRouter.XTrade) (src/MarginaliaRouter.sol#414-439) ignores return value by (r0,r1,None) = pair.getReserves() (src/MarginaliaRouter.sol#426)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:267: MarginaliaPricer._v3Cumulative(address) (src/MarginaliaPricer.sol#267-271) ignores return value by (cum,None) = IUniswapV3PoolOracle(pool).observe(ago) (src/MarginaliaPricer.sol#269)\n[medium/medium] unused-return at src/MarginaliaPricer.sol:233: MarginaliaPricer._spotInQuote(IPoolManager,MarginaliaTypes.Venue) (src/MarginaliaPricer.sol#233-252) ignores return value by (sqrtP,None,None,None) = manager.getSlot0(PoolId.wrap(v.ref)) (src/MarginaliaPricer.sol#237)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:656: MarginaliaAnnex._buyMarg(uint256,uint256,uint256,address) (src/MarginaliaAnnex.sol#656-658) ignores return value by hook.poolManager().unlock(abi.encode(imdIn,authorIn,minOut,to)) (src/MarginaliaAnnex.sol#657)\n[medium/medium] unused-return at src/MarginaliaAnnex.sol:660: MarginaliaAnnex.unlockCallback(bytes) (src/MarginaliaAnnex.sol#660-694) ignores return value by manager.settle() (src/MarginaliaAnnex.sol#687)\n[medium/medium] unused-return at src/MarginaliaPages.sol:434: MarginaliaPages.unlockCallback(bytes) (src/MarginaliaPages.sol#434-460) ignores return value by manager.settle() (src/MarginaliaPages.sol#455)\n[low/high] shadowing-local at src/MarginaliaHook.sol:859: MarginaliaHook.payJudged(uint32,bytes32[3]).pool (src/MarginaliaHook.sol#859) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.noteMeta(bytes32).week (src/MarginaliaJudge.sol#19) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesesOfWeek(uint32).week (src/MarginaliaJudge.sol#15) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.thesisPool(uint32).week (src/MarginaliaJudge.sol#12) shadows:\n[low/high] shadowing-local at src/MarginaliaJudge.sol:14: IHookJudge.drawForJudging(uint32,uint256,bool).week (src/MarginaliaJudge.sol#21) shadows:\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:110: MarginaliaJudge.eligibleTheses(uint32) (src/MarginaliaJudge.sol#110-122) has external calls inside a loop: (None,None,None,hasChild) = hook.noteMeta(all[i]) (src/MarginaliaJudge.sol#115)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:266: MarginaliaJudge.judgedOf(uint32) (src/MarginaliaJudge.sol#266-279) has external calls inside a loop: (author,noteWeek,thesis,hasChild) = hook.noteMeta(ranked[i]) (src/MarginaliaJudge.sol#270)\n[low/medium] calls-loop at src/MarginaliaHook.sol:919: MarginaliaHook._unlock(uint8,address,uint256,uint256) (src/MarginaliaHook.sol#919-928) has external calls inside a loop: out = poolManager.unlock(data) (src/MarginaliaHook.sol#925)\n[low/medium] calls-loop at src/MarginaliaHook.sol:658: MarginaliaHook._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaHook.sol#658-676) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaHook.sol#669-674)\n[low/medium] calls-loop at src/MarginaliaAnnex.sol:443: MarginaliaAnnex._settlementPrice(MarginaliaTypes.Note,MarginaliaTypes.Observation[]) (src/MarginaliaAnnex.sol#443-459) has external calls inside a loop: p = pricer().settlePrice(n.venue,buy,sample) (src/MarginaliaAnnex.sol#452-457)\n[low/medium] calls-loop at src/MarginaliaJudge.sol:91: MarginaliaJudge.convertForfeits() (src/MarginaliaJudge.sol#91-106) has external calls inside a loop: out = hook.sellPotMarg(marg) (src/MarginaliaJudge.sol#96-100)\n[low/medium] calls-loop at src/MarginaliaJud","passed":true},{"durationMs":796,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/MarginaliaPages.sol:169: `abi.encodePacked()` Hash Collision (2 places)\n[high] eth-send-unchecked-address at src/MarginaliaHook.sol:779: ETH transferred without address checks (3 places)\n[high] reentrancy-state-change at src/MarginaliaAnnex.sol:226: Reentrancy: State change after external call (24 places)\n[high] storage-array-memory-edit at src/MarginaliaAnnex.sol:336: Storage Array Edited with Memory (3 places)\n[high] unsafe-casting at src/MarginaliaHook.sol:936: Unsafe Casting of integers\n[low] costly-loop at src/MarginaliaAnnex.sol:642: Costly operations inside loop (4 places)\n[low] internal-function-used-once at src/HookFlags.sol:26: Internal Function Used Only Once (4 places)\n[low] large-numeric-literal at src/Marginalia.sol:10: Large Numeric Literal (28 places)\n[low] literal-instead-of-constant at src/MarginaliaAnnex.sol:259: Literal Instead of Constant (67 places)\n[low] local-variable-shadowing at src/MarginaliaHook.sol:859: Local Variable Shadows State Variable\n[low] require-revert-in-loop at src/MarginaliaAnnex.sol:573: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/MarginaliaHook.sol:835: State Change Without Event (6 places)\n[low] state-no-address-check at src/MarginaliaRouter.sol:135: Address State Variable Set Without Checks\n[low] unchecked-return at src/MarginaliaAnnex.sol:657: Unchecked Return (10 places)\n[low] uninitialized-local-variable at src/MarginaliaAnnex.sol:450: Uninitialized Local Variable (4 places)\n[low] unused-import at src/MarginaliaHook.sol:10: Unused Import\n[low] unused-public-function at src/MarginaliaAnnex.sol:179: Public Function Not Used Internally (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e33df0e0d819a4709c434df20d9e076b97300d643e3d552faa1e6ca2dd1ed4f0","verifiedTreeHash":"b15083efde466ed3cb44b498b101b0f482387e86","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":254880,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 254.64s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\n   │             ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:605:28\n    │\n605 │         bytes memory ret = hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:240:13\n    │\n240 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:279:9\n    │\n279 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:265:22\n    │\n265 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:266:17\n    │\n266 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:312:13\n    │\n312 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:313:13\n    │\n313 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:324:47\n    │\n324 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:332:9\n    │\n332 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:27\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:318:52\n    │\n318 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:418:9\n    │\n418 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:377:35\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:339:13\n    │\n339 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:377:9\n    │\n377 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:364:30\n    │\n364 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:367:26\n    │\n367 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:384:13\n    │\n384 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:391:9\n    │\n391 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:392:9\n    │\n392 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\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/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:386:30\n    │\n386 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:431:17\n    │\n431 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:461:13\n    │\n461 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:468:13\n    │\n468 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:560:21\n    │\n560 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n561 │ ┃             action,\n562 │ ┃             bytes(admissionBody(hooks)),\n563 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n564 │ ┃             imd,\n565 │ ┃             price\n566 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:570:9\n    │\n570 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:553:70\n    │\n553 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:594:21\n    │\n594 │                     emit HookAdmitted(open[i], requestId);\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/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:640:13\n    │\n640 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:621:18\n    │\n621 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:628:38\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:628:46\n    │\n628 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:629:24\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:629:32\n    │\n629 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:636:9\n    │\n636 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:266:50\n    │\n266 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7187,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 461.90µs (0.00ns CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.33ms (2.07ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 20.85ms (9.34ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.48ms (5.89ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 27.54ms (18.36ms CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 22804, ~: 20930)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 27.58ms (28.62ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510057)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 29.63ms (15.41ms CPU time)\n\nRan 20 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2492691)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 763866)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1544099)\n[PASS] testAgentClassForContractAuthors() (gas: 1205929)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1044796)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2790507)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1458978)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609337)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 134395)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54684)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1852936)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1697424)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 96771)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 731945)\n[PASS] testObservationWindowAndSpacing() (gas: 893335)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 856026)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137297)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 922278)\n[PASS] testRightCallReturnsTheBond() (gas: 1518691)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1501229)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 37.81ms (15.79ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 48.69ms (317.23µs CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770870)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43621657)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43621441)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533665)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18139513)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42084867)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18283610)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18067221)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18069867)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18253068)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 57.76ms (165.29ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 105932, ~: 106118)\nLogs:\n  Bound result 4149\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 59.32ms (14.94ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567783)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 106.36ms (56.40ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 106.90ms (23.04ms CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 107.25ms (5.81ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 107.18ms (5.10ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 107.23ms (52.65ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838167, ~: 838176)\nLogs:\n  Bound result 9119754193153329050\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58960, ~: 58968)\nLogs:\n  Bound result 9750000000000001379\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 107.32ms (158.86ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 107.33ms (31.72ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710217)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 107.35ms (75.10ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 132311, ~: 115150)\nLogs:\n  Bound result 4\n  Bound result 1000000000000000000000000000000\n  Bound result 759033187022393483958362646723\n  Bound result 1000000003\n  Bound result 55912602086905134844\n  Bound result 1000000002\n  Bound result 999999999999999999999000000006\n  Bound result 30769917720431258593080723279\n  Bound result 847225646187425930265305585334\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36924, ~: 36961)\nLogs:\n  Bound result 9997001\n  Bound result 9992410\n  Bound result 49\n  Bound result 18000\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141527, ~: 141856)\nLogs:\n  Bound result 2023029987489629247424473389\n  Bound result 1266412660188944021221804113046\n  Bound result 3195\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36726, ~: 36881)\nLogs:\n  Bound result 997001\n  Bound result 79\n  Bound result 49\n  Bound result 18000\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23107, ~: 21542)\nLogs:\n  Bound result 16506678668725651941932118799097841804\n  Bound result 413310015549445766277653626\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39535, ~: 38758)\nLogs:\n  Bound result 4418896343449869303564747391204711441198\n  Bound result 9290163421559157796327495511581233227138\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16198, ~: 14429)\nLogs:\n  Bound result 53\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 54041, ~: 51987)\nLogs:\n  Bound result 10688\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36407, ~: 36402)\nLogs:\n  Bound result 8000\n  Bound result 3409\n  Bound result 49\n  Bound result 18000\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19117, ~: 16931)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21363, ~: 21299)\nLogs:\n  Bound result 14256734763443460933082057092\n  Bound result 27799165767414400\n  Bound result 516085\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 62579, ~: 58422)\nLogs:\n  Bound result 1365\n  Bound result 7\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 97298, ~: 82844)\nLogs:\n  Bound result 15\n  Bound result 750156052399\n  Bound result 609536897694190956339345918535\n  Bound result 12603447381771844\n  Bound result 87725536556425509746756145836\n  Bound result 286928722879391824399\n  Bound result 498846503323864560941214439507\n  Bound result 12168761238736968010806498\n  Bound result 1\n  Bound result 69248447046845756927061442229\n  Bound result 2\n  Bound result 379626784418576995024211606064\n  Bound result 2\n  Bound result 3\n  Bound result 262986209759\n  Bound result 916896137997880616423712133624\n  Bound result 289611197586464297901003463638\n  Bound result 761287475791116516895555588374\n  Bound result 32573771549693450081530567868\n  Bound result 19261437549514479471389205\n  Bound result 856413245816622471406378013283\n  Bound result 218194831665085238291993852114\n  Bound result 483374944103007447275829636496\n  Bound result 476500313137765849399509\n  Bound result 372516831022927937384816140956\n  Bound result 405906423970007930993362219440\n  Bound result 8733646925729274019605324060\n  Bound result 914596033140727757357347893405\n  Bound result 1\n  Bound result 381797632089255037383158772192\n  Bound result 924624035983185392900760075785\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 107.00ms (1.02s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 3)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 216   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 213   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 396   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 217   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 196   | 3       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 220   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 209   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 253   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 24\n  Bound result 2\n  Bound result 44767688728495783937\n  Bound result 50007\n  Bound result 51\n  Bound result 0\n  Bound result 2\n  Bound result 4096\n  Bound result 5273\n  Bound result 1\n  Bound result 28800\n  Bound result 8192\n  Bound result 1\n  Bound result 0\n  Bound result 2028\n  Bound result 7195\n  Bound result 0\n  Bound result 2\n  Bound result 2\n  Bound result 10744\n  Bound result 2\n  Bound result 500000000000000000000\n  Bound result 0\n  Bound result 32788888121552098501\n  Bound result 50021\n  Bound result 29\n  Bound result 0\n  Bound result 2\n  Bound result 7200\n  Bound result 49881\n  Bound result 29\n  Bound result 4999999999999999995904\n  Bound result 0\n  Bound result 0\n  Bound result 280\n  Bound result 2\n  Bound result 1\n  Bound result 31379442981\n  Bound result 2\n  Bound result 2\n  Bound result 1837366890\n  Bound result 5144\n  Bound result 71\n  Bound result 2\n  Bound result 120267249259245777233\n  Bound result 2\n  Bound result 0\n  Bound result 18000\n  Bound result 7000\n  Bound result 23\n  Bound result 0\n  Bound result 0\n  Bound result 320\n  Bound result 430\n  Bound result 2\n  Bound result 1152921504606846976\n  Bound result 16948\n  Bound result 0\n  Bound result 3406\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1980000000000000000000\n  Bound result 985\n  Bound result 52\n  Bound result 0\n  Bound result 488\n  Bound result 1\n  Bound result 800000000000000000\n  Bound result 2\n  Bound result 60\n  Bound result 1\n  Bound result 16000000000000000000\n  Bound result 50241\n  Bound result 51\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 463.61ms (451.77ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2444  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2442  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2459  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2465  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2478  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 4473\n  Bound result 5643\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 463463374267149401290517\n  Bound result 9999999999999999997\n  Bound result 999999999000000000000001\n  Bound result 343379535658481384289559\n  Bound result 1100000000000000000\n  Bound result 10000000000000000000\n  Bound result 8475426362216\n  Bound result 250000000000000000\n  Bound result 512\n  Bound result 520\n  Bound result 7774479242110625851\n  Bound result 43\n  Bound result 108256\n  Bound result 1800\n  Bound result 10000000000000000000\n  Bound result 68155\n  Bound result 2503250975676239158\n  Bound result 86\n  Bound result 625\n  Bound result 42739885737091812623827852133236522678093305\n  Bound result 246299\n  Bound result 2304\n  Bound result 9510\n  Bound result 90\n  Bound result 1230\n  Bound result 100\n  Bound result 5418\n  Bound result 422884584942014747107181\n  Bound result 5339\n  Bound result 3000\n  Bound result 1\n  Bound result 97\n  Bound result 2827\n  Bound result 71550979193790605994314\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.05s (1.05s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 517   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 522   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 515   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 527   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 493   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 482   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 552   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 488   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 523   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 517   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1033  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 497   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 497   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 489   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 495   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 560   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 517   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 2\n  Bound result 100000000000000000000\n  Bound result 4\n  Bound result 9750001000000000001\n  Bound result 5\n  Bound result 1800000000000000000\n  Bound result 4999999999999999980\n  Bound result 5400\n  Bound result 9750000000107663696\n  Bound result 9750000000000000934\n  Bound result 44141\n  Bound result 99999999999999999955\n  Bound result 4\n  Bound result 98000000000000001477\n  Bound result 6749999999999999993\n  Bound result 9750000000000012312\n  Bound result 9750000000000006091\n  Bound result 5\n  Bound result 50000000000000000000\n  Bound result 3700\n  Bound result 99999000000000000003568\n  Bound result 9000000000000000000\n  Bound result 12\n  Bound result 25377626501898675409\n  Bound result 1765\n  Bound result 9\n  Bound result 40480296444699229848780\n  Bound result 2\n  Bound result 2\n  Bound result 10000000000000000\n  Bound result 8\n  Bound result 99999000000000000000011\n  Bound result 12\n  Bound result 183320\n  Bound result 12\n  Bound result 3\n  Bound result 104725\n  Bound result 3\n  Bound result 3\n  Bound result 99999000000000000005335\n  Bound result 9\n  Bound result 4000000000000000000\n  Bound result 9750000000000005172\n  Bound result 4\n  Bound result 98000000000000005401\n  Bound result 90016804811974234882\n  Bound result 15\n  Bound result 77591276718979369397\n  Bound result 1\n  Bound result 98000000000000000008\n  Bound result 5\n  Bound result 27628530496329220095\n  Bound result 98000000000000005253\n  Bound result 8\n  Bound result 99999756553481222128444\n  Bound result 9750000000000003049\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.07s (7.07s CPU time)\n\nRan 23 test suites in 7.07s (9.88s CPU time): 283 tests passed, 0 failed, 1 skipped (284 total tests)\n","passed":true},{"durationMs":142,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":505,\"AGENTS.md\":123,\"README.md\":240,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"launch.json\":15,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":644,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":679,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":285,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f4e7c7c71930afa91a13eef5e76eaa55b150650299fe8c074fd108e6822356a8","verifiedTreeHash":"9de17ba6b20cbdda6e6e162ee6dc5787396c26a3","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":295017,"exitCode":0,"name":"build","output":"Compiling 124 files with Solc 0.8.26\nSolc 0.8.26 finished in 294.69s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/MarginaliaHook.sol:859:9:\n    |\n859 |         uint256 pool = thesisPool[w];\n    |         ^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/MarginaliaHook.sol:99:5:\n   |\n99 |     PoolKey private pool;\n   |     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/AnnexInvariant.t.sol:530:52:\n    |\n530 |         try annex.requestAdmission(asked) returns (bytes32 r) {\n    |                                                    ^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/AnnexInvariant.t.sol:557:19:\n    |\n557 |         (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerKey, annex.attestationDigest(a));\n    |                   ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/MarginaliaHook.sol:299:5:\n    |\n299 |     function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata data)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/helpers/Fixture.sol:114:5:\n    |\n114 |     function priceOf(bytes32, address) external view returns (uint256) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/fork/MainnetLaunch.t.sol:78:5:\n   |\n78 |     function _mine(bytes memory hookCode) internal view returns (bytes32 salt) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarginaliaTreasury.sol:51:9\n   │\n51 │         emit Dripped(day, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaTreasury.sol:43:22\n   │\n43 │         uint32 day = uint32(block.timestamp / 1 days);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `jobHash` is changed without an event but is used for access control\n    ╭▸ src/MarginaliaRouter.sol:303:16\n    │\n303 │         delete jobHash;\n    │                ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaPages.sol:181:17\n    │\n181 │                 revert BadHandle();\n    │                 ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:220:29\n    │\n220 │         (, uint32 posted) = IMarginaliaRecords(address(hook)).records(wallet);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:223:13\n    │\n223 │             (, posted) = annex.records(wallet);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/MarginaliaHook.sol:84:38\n   │\n84 │     bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes32' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:295:13\n    │\n295 │             hook.fundPot(toPools);\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:260:9\n    │\n260 │         emit Trade(subject, msg.sender, true, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:257:21\n    │\n257 │         s.supply += uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:275:9\n    │\n275 │         emit Trade(subject, msg.sender, false, amount, value, fee, s.supply);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:271:21\n    │\n271 │         s.supply -= uint64(amount);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:289:53\n    │\n289 │             if (s.escrowSince == 0) s.escrowSince = uint64(block.timestamp);\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `claims` is updated\n    ╭▸ src/MarginaliaPages.sol:352:21\n    │\n352 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n353 │ ┃             action,\n354 │ ┃             bytes(questionBody(normalized, tweetId)),\n355 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n356 │ ┃             imd,\n357 │ ┃             price\n358 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:363:9\n    │\n363 │         emit ClaimRequested(subject, requestId, msg.sender, tweetId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:361:63\n    │\n361 │         claims[subject] = Claim(requestId, msg.sender, price, uint64(block.timestamp));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaRouter.sol:251:13\n    │\n251 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:252:41\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:252:49\n    │\n252 │         if (amountIn == 0 || amountIn > uint256(uint128(type(int128).max))) revert InvalidSwap();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:386:13\n    │\n386 │             emit ClaimFailed(subject, requestId);\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/MarginaliaPages.sol:399:9\n    │\n399 │         emit Claimed(subject, wallet, owed, reimbursed);\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/MarginaliaPages.sol:407:13\n    │\n407 │         if (block.timestamp < uint256(c.requestedAt) + ANSWER_DEADLINE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaPages.sol:424:9\n    │\n424 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:338:9\n    │\n338 │         emit Noted(job.payer, job.sellMarg, spent, received);\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/MarginaliaPages.sol:419:13\n    │\n419 │         if (block.timestamp < uint256(s.escrowSince) + CLAIM_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:425:9\n    │\n425 │         emit Recycled(subject, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:320:18\n    │\n320 │                 -int256(job.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:431:9\n    │\n431 │         hook.poolManager().unlock(abi.encode(imdIn));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:328:25\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:328:33\n    │\n328 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:329:28\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:329:36\n    │\n329 │         uint256 received = uint256(uint128(outputDelta));\n    │                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaPages.sol:458:9\n    │\n458 │         emit Burned(imdIn, marg);\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/MarginaliaRouter.sol:373:9\n    │\n373 │         emit XTraded(payer, X_V4, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:444:30\n    │\n444 │                 zeroForOne, -int256(imdIn), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:355:18\n    │\n355 │                 -int256(x.amountIn),\n    │                  ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPages.sol:450:38\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:450:46\n    │\n450 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:363:25\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:363:33\n    │\n363 │         uint256 spent = uint256(uint128(-inputDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:364:20\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:364:28\n    │\n364 │         received = uint256(uint128(outputDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPages.sol:455:9\n    │\n455 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPages.sol:456:24\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPages.sol:456:32\n    │\n456 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:403:9\n    │\n403 │         emit XTraded(payer, X_V3, xIn, xOut, spent, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:394:13\n    │\n394 │             int256(x.amountIn),\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaRouter.sol:399:25\n    │\n399 │         uint256 spent = uint256(zeroForOne ? a0 : a1);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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[boolean-cst]: misuse of a boolean constant\n    ╭▸ src/MarginaliaAnnex.sol:489:45\n    │\n489 │         if (!ok || ret.length < 32) return (false, 0);\n    │                                             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaRouter.sol:409:78\n    │\n409 │         if (amount0Delta > 0) IERC20(pool.token0()).safeTransfer(msg.sender, uint256(amount0Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaRouter.sol:410:78\n    │\n410 │         if (amount1Delta > 0) IERC20(pool.token1()).safeTransfer(msg.sender, uint256(amount1Delta));\n    │                                                                              ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaRouter.sol:438:9\n    │\n438 │         emit XTraded(payer, X_V2, xIn, xOut, actualIn, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaRouter.sol:426:37\n    │\n426 │         (uint112 r0, uint112 r1,) = pair.getReserves();\n    │                                     ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:253:13\n    │\n253 │         if (block.timestamp > deadline) revert Expired();\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/MarginaliaAnnex.sol:295:9\n    │\n295 │         emit NotePosted(id, author, p.x, n.class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:278:22\n    │\n278 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:279:17\n    │\n279 │         n.day = uint32(block.timestamp / 1 days);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:333:13\n    │\n333 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaAnnex.sol:334:13\n    │\n334 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaAnnex.sol:345:47\n    │\n345 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaAnnex.sol:353:9\n    │\n353 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:27\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:339:52\n    │\n339 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:439:9\n    │\n439 │         hook.fundPot(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaAnnex.sol:398:35\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaAnnex.sol:360:13\n    │\n360 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:398:9\n    │\n398 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:385:30\n    │\n385 │         int256 scoreDelta = -int256(diff);\n    │                              ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:388:26\n    │\n388 │             scoreDelta = int256(diff);\n    │                          ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaAnnex.sol:405:13\n    │\n405 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaAnnex.sol:412:9\n    │\n412 │         emit Retracted(id, text);\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/MarginaliaAnnex.sol:413:9\n    │\n413 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:407:30\n    │\n407 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:452:17\n    │\n452 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaAnnex.sol:488:21\n    │\n488 │         (ok, ret) = x.staticcall{gas: BALANCE_READ_GAS}(data);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaAnnex.sol:612:21\n    │\n612 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n613 │ ┃             action,\n614 │ ┃             bytes(admissionBody(hooks)),\n615 │ ┃             IIntake.Callback(address(this), this.onOracleResult.selector),\n616 │ ┃             imd,\n617 │ ┃             price\n618 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:622:9\n    │\n622 │         emit AdmissionRequested(requestId, msg.sender, hooks, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaAnnex.sol:605:70\n    │\n605 │             if (hooks[i] == address(0) || hooks[i].code.length == 0) revert BadList();\n    │                                                                      ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:646:21\n    │\n646 │                     emit HookAdmitted(open[i], requestId);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:657:9\n    │\n657 │         hook.poolManager().unlock(abi.encode(imdIn, authorIn, minOut, to));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaAnnex.sol:691:13\n    │\n691 │             emit Burned(imdIn - authorIn, marg - authorMarg);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:672:18\n    │\n672 │                 -int256(imdIn),\n    │                  ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaAnnex.sol:679:38\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:679:46\n    │\n679 │         if (inD >= 0 || outD <= 0 || uint256(uint128(-inD)) != imdIn) revert UnauthorizedCallback();\n    │                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaAnnex.sol:680:24\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaAnnex.sol:680:32\n    │\n680 │         uint256 marg = uint256(uint128(outD));\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaAnnex.sol:687:9\n    │\n687 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/MarginaliaJudge.sol:96:17\n   │\n96 │             try hook.sellPotMarg(marg) returns (uint256 out) {\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:114:47\n    │\n114 │         for (uint256 i = 0; i < all.length && n < MAX_JUDGED; ++i) {\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaJudge.sol:115:35\n    │\n115 │             (,,, bool hasChild) = hook.noteMeta(all[i]);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:170:15\n    │\n170 │             ++n;\n    │               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:174:33\n    │\n174 │             out[i - 1] = bytes1(uint8(48 + v % 10));\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:186:52\n    │\n186 │         return eligibleTheses(week).length == 0 || block.timestamp >= (uint256(week) + 1) * 7 days + 28 days;\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/MarginaliaJudge.sol:194:32\n    │\n194 │         if (judgedSet[week] || block.timestamp < requestedAt[week] + ANSWER_DEADLINE) {\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:214:9\n    │\n214 │         hook.drawForJudging(day, price, retry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `requestOf` is updated\n    ╭▸ src/MarginaliaJudge.sol:217:21\n    │\n217 │           requestId = intake.request(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━┛\n218 │ ┃             action, body, IIntake.Callback(address(this), this.onOracleResult.selector), imd, price\n219 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaJudge.sol:206:41\n    │\n206 │         if (judgedSet[day] || (retry && block.timestamp < requestedAt[day] + ANSWER_DEADLINE)) {\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/MarginaliaJudge.sol:225:9\n    │\n225 │         emit Requested(day, requestId, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaJudge.sol:223:28\n    │\n223 │         requestedAt[day] = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaJudge.sol:255:9\n    │\n255 │ ┏         emit Judged(\n256 │ ┃             day,\n257 │ ┃             [\n258 │ ┃                 count > 0 ? ranked[0] : bytes32(0),\n    ‡ ┃\n262 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:276:17\n    │\n276 │             if (dup) continue;\n    │                 ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaJudge.sol:269:50\n    │\n269 │         for (uint256 i = 0; i < ranked.length && kept < 3; ++i) {\n    │                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaJudge.sol:270:77\n    │\n270 │             (address author, uint32 noteWeek, bool thesis, bool hasChild) = hook.noteMeta(ranked[i]);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/MarginaliaJudge.sol:288:9\n    │\n288 │         hook.payJudged(day, top);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/MarginaliaPricer.sol:85:13\n   │\n85 │             n += 1;\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/MarginaliaPricer.sol:120:33\n    │\n120 │         if (w.startedAt == 0 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE) {\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:34\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:121:59\n    │\n121 │             return T.PriceWindow(uint64(block.timestamp), uint64(block.number), x, x, x, q, q);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaPricer.sol:142:20\n    │\n142 │                 || block.timestamp < uint256(w.startedAt) + POST_MIN_SPAN\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/MarginaliaPricer.sol:143:20\n    │\n143 │                 || block.timestamp > uint256(w.startedAt) + POST_MAX_AGE\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:149:69\n    │\n149 │             x = twap(v.kind, v.xIsToken0, w.xStart, w.startedAt, x, uint64(block.timestamp));\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:168:55\n    │\n168 │         else if (v.kind == T.VenueKind.UniV3) xRead = uint256(_v3Cumulative(ref));\n    │                                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaPricer.sol:213:28\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                            ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:213:41\n    │\n213 │             int256 delta = int256(c2) - int256(c1);\n    │                                         ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:214:35\n    │\n214 │             int256 mean = delta / int256(dt);\n    │                                   ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:215:38\n    │\n215 │             if (delta < 0 && delta % int256(dt) != 0) mean -= 1; // round toward negative infinity, as v3 does\n    │                                      ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaPricer.sol:217:57\n    │\n217 │             return fromSqrt(TickMath.getSqrtPriceAtTick(int24(mean)), xIsToken0);\n    │                                                         ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:241:37\n    │\n241 │             (uint160 sqrtP,,,,,,) = IUniswapV3PoolOracle(ref).slot0();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:245:41\n    │\n245 │             (uint112 r0, uint112 r1,) = IUniswapV2PairOracle(ref).getReserves();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaPricer.sol:269:33\n    │\n269 │         (int56[] memory cum,) = IUniswapV3PoolOracle(pool).observe(ago);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaPricer.sol:279:24\n    │\n279 │         uint32 nowTs = uint32(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:312:49\n    │\n312 │                 specifiedTake = STAMP + _bondOf(uint256(-params.amountSpecified));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:389:9\n    │\n389 │         emit Accrued(day, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:471:17\n    │\n471 │                 emit Revealed(id, hash);\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/MarginaliaHook.sol:495:9\n    │\n495 │         emit NotePosted(id, author, p.x, class, p.side, p.targetBps, p.horizonDays, p.parentId, p.text);\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/MarginaliaHook.sol:348:13\n    │\n348 │             emit SwapFee(true, author, poolImd, 0, STAMP);\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/MarginaliaHook.sol:361:13\n    │\n361 │             emit SwapFee(false, author, poolImd, fee - STAMP, STAMP);\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/MarginaliaHook.sol:372:9\n    │\n372 │         emit SwapFee(false, tx.origin, poolImd, quietFee, 0);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:33\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:41\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                         ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:335:63\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:335:71\n    │\n335 │         uint256 poolImd = buy ? uint256(uint128(-imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                       ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:340:36\n    │\n340 │             uint256 bond = _bondOf(uint256(-params.amountSpecified));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:31\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' 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/MarginaliaHook.sol:342:39\n    │\n342 │             uint256 margOut = uint256(uint128(margDelta));\n    │                                       ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:450:17\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:450:60\n    │\n450 │             if (weekTheses[w].length >= MAX_WEEK_THESES || thesesPerAuthor[w][author] >= MAX_AUTHOR_THESES) {\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/MarginaliaHook.sol:465:26\n    │\n465 │             if (bound && age < SEAL_MIN) revert TooEarly(); // the head start is the key holders', not the public's\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/MarginaliaHook.sol:466:26\n    │\n466 │             if (bound && age <= SEAL_MAX) {\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/MarginaliaHook.sol:484:32\n    │\n484 │ …                     || block.timestamp > uint256(parent.postedAt) + THESIS_GRACE\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:442:22\n    │\n442 │         n.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:540:13\n    │\n540 │         if (block.timestamp < end) revert TooEarly();\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/MarginaliaHook.sol:541:13\n    │\n541 │         if (block.timestamp > end + SETTLE_WINDOW) revert TooLate();\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/MarginaliaHook.sol:554:47\n    │\n554 │                     || (len == OBS_MAX - 1 && block.timestamp < uint256(obs[0].timestamp) + OBS_MIN_SPAN))\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/MarginaliaHook.sol:562:9\n    │\n562 │         emit Observed(id, xRead, balance);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:27\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:546:52\n    │\n546 │             T.Observation(uint64(block.timestamp), uint64(block.number), xRead, quoteRead, balance);\n    │                                                    ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:570:13\n    │\n570 │             x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.balanceOf.selector, who));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MarginaliaHook.sol:651:35\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\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/MarginaliaHook.sol:607:13\n    │\n607 │         if (block.timestamp <= end + SETTLE_WINDOW) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:736:13\n    │\n736 │             emit ThesisReleased(n.parentId);\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/MarginaliaHook.sol:651:9\n    │\n651 │         emit Settled(id, outcome, settlePrice, scoreDelta, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:634:26\n    │\n634 │             scoreDelta = int256(_difficulty(n));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:639:27\n    │\n639 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:641:27\n    │\n641 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/MarginaliaHook.sol:645:27\n    │\n645 │             scoreDelta = -int256(_difficulty(n));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:669:17\n    │\n669 │             try pricer().settlePrice(n.venue, buy, sample) returns (uint256 p) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:683:13\n    │\n683 │         if (block.timestamp >= horizonEnd(id)) revert TooLate();\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/MarginaliaHook.sol:693:9\n    │\n693 │         emit Retracted(id, text);\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/MarginaliaHook.sol:694:9\n    │\n694 │         emit Settled(id, T.Status.Retracted, 0, scoreDelta, address(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:687:30\n    │\n687 │         int256 scoreDelta = -int256(_difficulty(n) / 2);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:702:13\n    │\n702 │         if (block.timestamp <= uint256(n.postedAt) + THESIS_GRACE) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:705:9\n    │\n705 │         emit ThesisForfeited(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/MarginaliaHook.sol:719:9\n    │\n719 │         emit DepositClaimed(id, n.author, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/MarginaliaHook.sol:749:13\n    │\n749 │             n.x.staticcall{gas: BALANCE_READ_GAS}(abi.encodeWithSelector(IERC20.totalSupply.selector));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:758:16\n    │\n758 │         return uint32(block.timestamp / 1 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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/MarginaliaHook.sol:762:16\n    │\n762 │         return uint32(block.timestamp / 7 days);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:782:9\n    │\n782 │         emit PotFunded(_today(), amount, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `seals` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:816:25\n    │\n816 │         if ((at != 0 && block.timestamp - at <= SEAL_MAX) || x == address(0) || hash == bytes32(0)) {\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/MarginaliaHook.sol:830:9\n    │\n830 │         emit Sealed(hash, msg.sender, x, venue.ref);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:824:13\n    │\n824 │             uint64(block.timestamp),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:837:23\n    │\n837 │         if (!retry && block.timestamp < (uint256(w) + 1) * 7 days + THESIS_GRACE) revert TooEarly();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:851:27\n    │\n851 │         return (n.author, uint32(uint256(n.postedAt) / 7 days), n.targetBps == 0, n.children > 0);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `thesisPool` is updated\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/MarginaliaHook.sol:925:28\n    │\n925 │         bytes memory out = poolManager.unlock(data);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:873:9\n    │\n873 │         emit JudgedPaid(w, paidAmounts);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MarginaliaHook.sol:926:39\n    │\n926 │         if (unlockHash != bytes32(0)) revert InvalidUnlock();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:880:13\n    │\n880 │         if (n.day >= _today()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MarginaliaHook.sol:890:9\n    │\n890 │         emit RefundClaimed(id, msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:888:30\n    │\n888 │         notesPerDay[n.day] = uint32(count - 1);\n    │                              ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MarginaliaHook.sol:899:17\n    │\n899 │             if (block.timestamp < (uint256(epoch) + 1) * 1 days + SWEEP_AFTER) revert TooEarly();\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/MarginaliaHook.sol:903:17\n    │\n903 │             if (block.timestamp < (uint256(epoch) + 1) * 7 days + SWEEP_AFTER) revert TooEarly();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MarginaliaHook.sol:936:40\n    │\n936 │             address currency = address(uint160(extra));\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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[unused-return]: return value of an external call is not used\n    ╭▸ src/MarginaliaHook.sol:945:13\n    │\n945 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n     ╭▸ test/AnnexAdversarial.t.sol:190:21\n     │\n 190 │         a.chainId = block.chainid;\n     │                     ━━━━━━━━━━━━━\n     ‡\n1088 │         vm.chainId(999);\n     │         ─────────────── `vm.chainId` changes this environment here\n     │\n     ├ help: capture it with `vm.getChainId()` instead\n     ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/AuditFindings.t.sol:19:30\n   │\n19 │         uint256 startBlock = block.number;\n   │                              ━━━━━━━━━━━━\n   ‡\n23 │             vm.roll(startBlock + 25 * (i + 1));\n   │             ────────────────────────────────── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AuditFindings.t.sol:20:27\n   │\n20 │         uint256 startTs = block.timestamp;\n   │                           ━━━━━━━━━━━━━━━\n   ‡\n24 │             vm.warp(startTs + 31 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:18:9\n    │\n 18 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/AuditFindings.t.sol:65:9\n    │\n 65 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookBoundaries.t.sol:347:9\n    │\n347 │         vm.warp(deadline - 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:82:9\n    │\n 82 │         vm.warp(deadline - 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:193:9\n    │\n193 │         vm.warp(weekEnd - 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/HookReview.t.sol:195:9\n    │\n195 │         vm.warp(weekEnd + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:148:9\n    │\n148 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:149:30\n    │\n149 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n153 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:150:27\n    │\n150 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n154 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:176:9\n    │\n176 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:177:30\n    │\n177 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n181 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:178:27\n    │\n178 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n182 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:203:9\n    │\n203 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:204:30\n    │\n204 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n208 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:205:27\n    │\n205 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n209 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:302:9\n    │\n302 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:357:9\n    │\n357 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:358:30\n    │\n358 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n363 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:359:27\n    │\n359 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n364 │             vm.warp(startTs + 30 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:421:9\n    │\n421 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:488:9\n    │\n488 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:489:30\n    │\n489 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n492 │         vm.roll(startBlock + 25);\n    │         ──────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:490:27\n    │\n490 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n493 │         vm.warp(startTs + 30 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:512:9\n    │\n512 │         vm.warp(hook.horizonEnd(id));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:513:30\n    │\n513 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n517 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:514:27\n    │\n514 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n518 │             vm.warp(startTs + 10 minutes * (i + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:554:9\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:538:49\n    │\n538 │         router.note(rebuttal, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/Lifecycle.t.sol:554:17\n    │\n554 │         vm.warp(block.timestamp + hook.THESIS_GRACE() + 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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Lifecycle.t.sol:583:9\n    │\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:575:49\n    │\n575 │         router.note(sameSide, key, 10 ether, 1, block.timestamp + 1);\n    │                                                 ━━━━━━━━━━━━━━━\n    ‡\n583 │         vm.warp(hook.horizonEnd(a));\n    │         ─────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Lifecycle.t.sol:584:30\n    │\n584 │         uint256 startBlock = block.number;\n    │                              ━━━━━━━━━━━━\n    ‡\n589 │             vm.roll(startBlock + 25 * (i + 1));\n    │             ────────────────────────────────── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:585:27\n    │\n585 │         uint256 startTs = block.timestamp;\n    │                           ━━━━━━━━━━━━━━━\n    ‡\n590 │             vm.warp(startTs + 30 minutes * (i + 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/Lifecycle.t.sol:629:22\n    │\n629 │         assertEq(at, block.timestamp);\n    │                      ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:634:42\n    │\n634 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:638:17\n    │\n638 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:653:17\n    │\n653 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:657:42\n    │\n657 │         router.note(p, key, 10 ether, 1, block.timestamp + 1);\n    │                                          ━━━━━━━━━━━━━━━\n    ‡\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:663:17\n    │\n663 │         vm.warp(block.timestamp + hook.SEAL_MIN());\n    │         ────────━━━━━━━━━━━━━━━─────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Lifecycle.t.sol:679:17\n    │\n679 │         vm.warp(block.timestamp + hook.SEAL_MAX() + 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/Lifecycle.t.sol:682:17\n    │\n682 │         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/RevisionFindings.t.sol:199:17\n    │\n199 │         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/helpers/Fixture.sol:267:50\n    │\n267 │         received = router.note(p, key, imdIn, 1, block.timestamp + 1);\n    │                                                  ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionFindings.t.sol:267:9\n    │\n267 │         vm.warp((uint256(w) + 1) * 7 days + hook.THESIS_GRACE());\n    │         ──────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Round3Findings.t.sol:67:17\n   │\n67 │         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\n","passed":true},{"durationMs":7625,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/MainnetLaunch.t.sol:MainnetLaunchTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 571.59µs (0.00ns CPU time)\n\nRan 7 tests for test/JudgeOracle.t.sol:JudgeOracleTest\n[PASS] testEmptySignedRankingIsAnExecutableNoWinnerResult() (gas: 248153)\n[PASS] testFiveIdsWithEoaSignatureFitStipend() (gas: 554052)\n[PASS] testFullRankingWithEoaSignatureFitsStipend() (gas: 633672)\n[PASS] testProtocolDigestSignatureAndSelectorConformanceOnClone() (gas: 3322442)\n[PASS] testRejectedAnswersDoNotConsumeThePendingRequest() (gas: 892875)\n[PASS] testRequestedHeadIsFilteredAndDeduplicatedWithoutPromotingTheTail() (gas: 250679)\n[PASS] testTimeoutRetryInvalidatesOldIntakeRequest() (gas: 523953)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 10.95ms (9.00ms CPU time)\n\nRan 6 tests for test/AuditFindings.t.sol:AuditFindingsTest\n[PASS] testEmptyV4ObservationIsRefused() (gas: 918993)\n[PASS] testExpiredBaselineRejectsPostWithoutTakingFunds() (gas: 601798)\n[PASS] testHeadOfThreeFitsIntakeStipendAndAFullRankingIsRetried() (gas: 2111077)\n[PASS] testSameBlockDumpPostUnwindDoesNotWinBuy() (gas: 1822381)\n[PASS] testSameBlockPumpPostUnwindDoesNotWinSell() (gas: 1691295)\n[PASS] testUnpayableRankingRollsTheWholePoolForward() (gas: 2384827)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 11.84ms (5.56ms CPU time)\n\nRan 8 tests for test/LaunchAuditFindings.t.sol:LaunchAuditFindingsTest\n[PASS] testAHugeSupplyBooksTierOneInsteadOfOverflowing() (gas: 2461200)\n[PASS] testALapsedSealCanBeSealedAgain() (gas: 703279)\n[PASS] testARetractedNoteLeavesTheDaysRefundSplit() (gas: 1382965)\n[PASS] testARetractionAfterTheRefundClaimDoesNotDoubleCount() (gas: 1359071)\n[PASS] testARevertingTotalSupplyDoesNotBlockARetraction() (gas: 1932201)\n[PASS] testARevertingTotalSupplyStillSettlesWrongAndPaysTheKeeper() (gas: 2554573)\n[PASS] testAStrangersSealNeitherBlocksNorPricesTheAuthorsNote() (gas: 2518397)\n[PASS] testAnAuthorsSealOnAnotherVenueDoesNotPriceTheNote() (gas: 2235395)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 12.17ms (6.55ms CPU time)\n\nRan 14 tests for test/CompanionFailures.t.sol:RouterFailuresTest\n[PASS] testExpiredDeadlineTakesNothing() (gas: 668139)\n[PASS] testExpiredWindowRefusesPostsUntilAFreshCheckpointMatures() (gas: 1756378)\n[PASS] testInitRequiresAManagerWithCode() (gas: 4169863)\n[PASS] testSlippageFloorRefundsEverything() (gas: 639941)\n[PASS] testStrangersCannotEnterTheCallbacks() (gas: 133302)\n[PASS] testTradeAndNoteRefusesNoTradeZeroTradeAndNativeInput() (gas: 290673)\n[PASS] testTradedNoteMustBeAboutTheTokenTraded() (gas: 980650)\n[PASS] testTradedV4LegUnderAForeignHookOrEmptyPoolIsRefused() (gas: 396113)\n[PASS] testUnapprovedOrUnfundedAuthorIsRefused() (gas: 224265)\n[PASS] testV4VenueUnderAForeignHookIsRefused() (gas: 69759)\n[PASS] testV4VenueWithoutLiquidityIsRefused() (gas: 134961)\n[PASS] testVenueFieldsAreDerivedFromThePoolNotTheCaller() (gas: 48554)\n[PASS] testVenueKindNoneIsRefusedForAPricedCall() (gas: 116223)\n[PASS] testZeroAndOversizedAmountsAreRefused() (gas: 138593)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 13.00ms (5.04ms CPU time)\n\nRan 12 tests for test/HoldRule.t.sol:HoldRuleTest\n[PASS] testABreachIsNeverReplacedByANonBreachInsideTheGap() (gas: 1653878)\n[PASS] testABreachReplacesANonBreachInsideTheGap() (gas: 1661691)\n[PASS] testABuyCallWithAnUnreadableBalanceIsVoidSold() (gas: 1484869)\n[PASS] testASellAuthorMayDumpTheirWholeRemainingBalance() (gas: 1622310)\n[PASS] testASellAuthorWhoBuysBackTheirWholePostBalanceIsStillRight() (gas: 1717897)\n[PASS] testASellCallWithAnUnreadableBalanceStillSettlesOnPrice() (gas: 1510086)\n[PASS] testASellCallsBalanceIsNeverAnAdverseReading() (gas: 1360897)\n[PASS] testAWrongSellCallForfeitsWhateverTheBalanceDid() (gas: 1426628)\n[PASS] testAnEqualReadingInsideTheGapIsRefused() (gas: 1031930)\n[PASS] testAtTheCapAHigherReadingCannotLiftABuyCallsMinimum() (gas: 3939441)\n[PASS] testAtTheCapOnlyAMoreAdverseReadingGetsIn() (gas: 4186133)\n[PASS] testBuyCallHasNoToleranceDownwards() (gas: 1570913)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 16.28ms (11.58ms CPU time)\n\nRan 8 tests for test/PriceHistory.t.sol:PriceHistoryTest\n[PASS] testBaselineRequiresMatureFreshHistory() (gas: 188472)\n[PASS] testEmptyVenueAndHubCannotBeCheckpointedObservedOrPriced() (gas: 284549)\n[PASS] testFuzzV4BaselineIsNeverFavourableToTheCall(int24,bool) (runs: 256, μ: 105951, ~: 106118)\nLogs:\n  Bound result 60\n\n[PASS] testHubBaselineUsesOppositeExtremeFromSettlement() (gas: 180334)\n[PASS] testLiveCheckpointCannotEraseHonestExtremesOrRestartTheClock() (gas: 224282)\n[PASS] testV2BaselineIgnoresSameBlockReservesDumpAndPumpBothOrientations() (gas: 467543)\n[PASS] testV3BaselineIgnoresSameBlockTickChangesBothOrientations() (gas: 418025)\n[PASS] testV3BaselineWeightsElapsedTime() (gas: 371037)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 35.73ms (35.83ms CPU time)\n\nRan 29 tests for test/Annex.t.sol:AnnexTest\n[PASS] testAPulledPoolPushedToAnExtremeIsReadAtTheExtreme() (gas: 4898651)\n[PASS] testAdmissionAsksThePanelAndAdmitsOnlyWhatItNamed() (gas: 2491242)\n[PASS] testAdmissionBodyIsStrictJson() (gas: 759173)\n[PASS] testAdmissionRefusesBadAnswersAndBadLists() (gas: 1542625)\n[PASS] testAgentClassForContractAuthors() (gas: 1208062)\n[PASS] testAnAdmittedHookPassesTheDynamicFeeGate() (gas: 1042590)\n[PASS] testBaselineBoundRefusesASandwichedPost() (gas: 3472853)\n[PASS] testBuyCallOnAnUnreadableBalanceIsRefusedLikeTheHook() (gas: 2799765)\n[PASS] testBuyCallOnMargCountsThePurchaseOnce() (gas: 1467516)\n[PASS] testCounterAgainstAHookNoteAndAgainstAnAnnexNote() (gas: 3609075)\n[PASS] testDynamicFeePoolNeedsAdmissionEvenWithoutSwapBits() (gas: 135567)\n[PASS] testEmptiedVenueForfeitsInsteadOfRefunding() (gas: 3126196)\n[PASS] testEmptiedVenueOnASoldBuyCallIsStillVoidSold() (gas: 1677805)\n[PASS] testEmptyTextIsRefusedLikeTheHook() (gas: 54539)\n[PASS] testFullListFitsTheCallbackStipend() (gas: 1851403)\n[PASS] testHeldPriceStillSettlesRightAfterAFailedFlashRead() (gas: 2230314)\n[PASS] testHoldRuleVoidsASoldBuyCall() (gas: 1708364)\n[PASS] testHookBitsDecideWithoutAnOracle() (gas: 98895)\n[PASS] testMargVenueBaselineBoundNeedsRoomForThePostsOwnPurchase() (gas: 1102399)\n[PASS] testNoObservationsVoidAndReturnTheBond() (gas: 734020)\n[PASS] testNoteOfAnUnknownIdReverts() (gas: 23176)\n[PASS] testObservationInsideAnUnlockIsRefused() (gas: 2956772)\n[PASS] testObservationWindowAndSpacing() (gas: 901122)\n[PASS] testPostPaysTheStampBuysMargAndHoldsTheBond() (gas: 857166)\n[PASS] testRefusesWhatTheRouterAlreadyTakesAndBadKeys() (gas: 137269)\n[PASS] testRetractHalvesTheScoreAndForfeitsWithoutAKeeperCut() (gas: 924322)\n[PASS] testRightCallReturnsTheBond() (gas: 1529261)\n[PASS] testSoldOutRangeStillSettlesRight() (gas: 3269214)\n[PASS] testWrongCallForfeitsToThePoolsWithTheSettlerCut() (gas: 1511821)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 41.76ms (41.97ms CPU time)\n\nRan 3 tests for test/Implementations.t.sol:ImplementationsTest\n[PASS] testClonesInitializeOnceOnlyFromTheirHook() (gas: 4551335)\n[PASS] testFactoryDeploysAllFourWithoutArgumentsOrExternalDependencies() (gas: 34608585)\nLogs:\n  four implementation CREATE2 deployments (gas): 8829579\n\n[PASS] testImplementationsRejectInitialization() (gas: 81376)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 59.58ms (49.33ms CPU time)\n\nRan 28 tests for test/CompanionFailures.t.sol:JudgeFailuresTest\n[PASS] testAJudgedWeekCannotBeAbandoned() (gas: 1257630)\n[PASS] testAbandonNeedsALiveRequestPastItsDeadline() (gas: 1190393)\n[PASS] testAbandonTakesNothingAndTheRetryDrawsAgain() (gas: 1467522)\n[PASS] testAnswerAtTheExactExpiryStillCountsAndOneSecondLaterDoesNot() (gas: 1257046)\n[PASS] testAnswerForAWeekAlreadyJudgedIsRefused() (gas: 1320679)\n[PASS] testAnswerSignedByAnotherKeyIsRefused() (gas: 1069433)\n[PASS] testAnswerSignedForAnotherConsumerIsRefused() (gas: 3952788)\n[PASS] testConvertForfeitsWithAnEmptyPotIsANoOp() (gas: 236930)\n[PASS] testConvertNeverSellsMoreThanThePot() (gas: 236488)\n[PASS] testConvertSellsTheLargestHalvingThePoolAbsorbs() (gas: 275386)\n[PASS] testConvertTriesExactlyNineTranchesDownToOneTwoHundredFiftySixth() (gas: 363686)\n[PASS] testCurrentAndFutureWeeksCannotBeRequested() (gas: 128617)\n[PASS] testEligibleThesesAreCappedAtTheJudgedMaximum() (gas: 14217218)\n[PASS] testImplementationHasAPlaceholderSignerAndCannotBeConfigured() (gas: 2726709)\n[PASS] testInitRequiresEveryConfigurationValue() (gas: 2953442)\n[PASS] testIntakeReturningAnIdAlreadyPendingIsRefused() (gas: 1599187)\n[PASS] testJudgedOfFiltersWrongWeekShortFormAndChildlessIds() (gas: 1439829)\n[PASS] testJudgedWeekCannotBeRequestedAgainEvenAfterTheDeadline() (gas: 1242650)\n[PASS] testMalformedAnswerBytesAreRefused() (gas: 1067354)\n[PASS] testOnlyTheHeadOfThreeIsStoredAndTheTailNeverPromotes() (gas: 1221812)\n[PASS] testPayBeforeAnAnswerReverts() (gas: 1064318)\n[PASS] testPayIsPermissionlessAndOnce() (gas: 1438634)\n[PASS] testQuestionBodyNamesTheConsumerChainAndEligibleIdsOnly() (gas: 2516225)\n[PASS] testRepeatRequestBeforeTheDeadlineIsRefused() (gas: 1419149)\n[PASS] testRequestDrawsExactlyThePriceAndKeepsNothing() (gas: 1028228)\n[PASS] testWeekClosedStates() (gas: 1940695)\n[PASS] testWeekWithoutEligibleThesesCannotBeRequested() (gas: 244665)\n[PASS] testZeroAndExcessiveOraclePricesAreRefused() (gas: 1345941)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 82.31ms (22.76ms CPU time)\n\nRan 13 tests for test/LaunchBinding.t.sol:LaunchBindingTest\n[PASS] testCompanionsAreThePinnedImmutableMinimalProxies() (gas: 30808)\n[PASS] testConstructorWorksWithoutCompanionOrManagerCode() (gas: 55770839)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyOne() (gas: 43889505)\n[PASS] testExactFeeAccountingWhenImdIsCurrencyZero() (gas: 43889289)\n[PASS] testHookAndTokenHaveNoCommonAdminOrWithdrawalSurface() (gas: 533587)\n[PASS] testLiquidityFeesAndFullWithdrawalRemainAvailable() (gas: 753870)\n[PASS] testNativeAndCodelessPairsAreRefused() (gas: 18225230)\n[PASS] testNotedBuyOnFreshManagerSeededOnlyWithMarg() (gas: 42352497)\n[PASS] testOnlyTheSuppliedFactoryCanInitializeAndFailureDoesNotConsumeBinding() (gas: 18369312)\n[PASS] testPermissionsEnableOnlyTheFiveRequiredFlags() (gas: 14213)\n[PASS] testPoolCannotBeReadOrSwappedBeforeBinding() (gas: 18152854)\n[PASS] testPoolMustContainTheConstructorToken() (gas: 18155503)\n[PASS] testWrongFeeIsRefusedBeforeCorrectFeeBinds() (gas: 18338704)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 92.19ms (151.81ms CPU time)\n\nRan 14 tests for test/Pages.t.sol:PagesTest\n[PASS] testAbandonAfterDeadlineAndRecycleWaitsForPendingClaims() (gas: 2452282)\n[PASS] testAnnexLegIsOffWhenUnset() (gas: 3766905)\n[PASS] testBogusClaimCostsOnlyTheClaimantAndIsRetriable() (gas: 2465970)\n[PASS] testBuyGateWhitelistMargOrNotes() (gas: 1940925)\n[PASS] testBuyPaysTheIssuerBurnsMargAndFundsThePools() (gas: 562298)\n[PASS] testCurveIsLinearThenCapped() (gas: 102501)\n[PASS] testEscrowThenOracleAttestedClaim() (gas: 3916900)\n[PASS] testHandleIsLowerCasedAndValidated() (gas: 64412)\n[PASS] testOnlyThePoolManagerMayCallBack() (gas: 37620)\n[PASS] testPerWalletLimitAndTheCap() (gas: 9378754)\n[PASS] testPriceGuardAndAddressSubjectsNeedNoClaim() (gas: 170949)\n[PASS] testRejectedAnswersDoNotCloseTheClaim() (gas: 2213842)\n[PASS] testSellReturnsTheCurveLessFeeAndPagesAreNotTransferable() (gas: 1020264)\n[PASS] testSmallEscrowIsPaidWithoutReimbursement() (gas: 1721659)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 102.21ms (28.71ms CPU time)\n\nRan 10 tests for test/RevisionFindings.t.sol:RevisionFindingsTest\n[PASS] testABuyBackNoLongerVoidsASellCallItSettlesOnPrice() (gas: 1599565)\n[PASS] testADustPricedV4VenueCannotBePostedOn() (gas: 1574208)\n[PASS] testARevertingBalanceOfVoidsTheCallAsSoldNotAsNoData() (gas: 2592032)\n[PASS] testAStrangersDustTransferDoesNotVoidASellCall() (gas: 1564471)\n[PASS] testAnAttestationAboutAnotherChainIsRefused() (gas: 2243391)\n[PASS] testAnEmptyCanonicalV3PoolIsRefusedAsAVenue() (gas: 567810)\n[PASS] testHonestObserverOverwritesAPumpObserveUnwindInTheNextBlock() (gas: 3639686)\n[PASS] testPricerRefusesAPriceThatRoundsToZeroInBothOrientations() (gas: 58756)\n[PASS] testSweepNeedsTheStaleRequestAbandonedAndALateAnswerIsThenRefused() (gas: 2379400)\n[PASS] testTheHundredAndTwentyFirstThesisOfAWeekIsRefusedBeforePayment() (gas: 68883218)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 113.70ms (75.99ms CPU time)\n\nRan 29 tests for test/AnnexAdversarial.t.sol:AnnexAdversarialTest\n[PASS] testAdmissionListRulesAndPrice() (gas: 2592651)\n[PASS] testAnEmptyAnswerIsStoredNotReverted() (gas: 1165039)\n[PASS] testAnLpPullCannotTurnAWrongCallIntoARefund() (gas: 1826114)\n[PASS] testAttestationEdgesAreRefusedOneByOne() (gas: 1594187)\n[PASS] testBaselineBoundIsInclusiveAtTheBaselineAndOffAtZero() (gas: 3640042)\n[PASS] testBaselineBoundReadsTheSidesOwnBaseline() (gas: 2452540)\n[PASS] testCallbackGasAtTheFullListStaysUnderTheStipend() (gas: 2110451)\n[PASS] testCheckpointWindowAgesAndExpiresLikeTheRouter() (gas: 4984262)\n[PASS] testConstructorStoresFourValuesWithoutReadingTheChain() (gas: 51698)\n[PASS] testCountersRefuseClosedParentsAndTheses() (gas: 5716846)\n[PASS] testFewerThanThreeStandingReadingsAreStillNoData() (gas: 1584176)\n[PASS] testHoldRuleGiftsCountAsHeldAndAReadFailureAsBroken() (gas: 4206416)\n[PASS] testLifecycleRefusalsOnUnknownClosedAndForeignNotes() (gas: 1869727)\n[PASS] testMoreAdverseReadingReplacesTheLastInTheSameBlock() (gas: 1808241)\n[PASS] testOneOracleUuidServesOneRequestOnly() (gas: 1423863)\n[PASS] testPostBoundariesExactly() (gas: 2254356)\n[PASS] testProtocolVectorDigestSelectorAndSignature() (gas: 1184381)\n[PASS] testScoreIsDifficultyWeightedAndRetractIsHalf() (gas: 4699329)\n[PASS] testSellCallSettlesRightAndMaySellThroughTheHorizon() (gas: 1544132)\n[PASS] testSellCallWrongWhenThePriceRises() (gas: 1597641)\n[PASS] testSettlementTakesTheMostAdverseReading() (gas: 1764967)\n[PASS] testSixteenReadingsAtMostAndTheLastSlotWaitsForTheHour() (gas: 4679743)\n[PASS] testSlippageAndUnfundedAuthorsTakeNothing() (gas: 1560244)\n[PASS] testSoldOutSellCallReturnsItsBond() (gas: 3296468)\n[PASS] testSplitIsExactAndNothingStaysInTheAnnex() (gas: 634423)\n[PASS] testStandingReadingsKeepPriceOrderingAndHoldBreachPriority() (gas: 5443760)\n[PASS] testThreeReadingsInsideAnHourAreNoData() (gas: 1494972)\n[PASS] testUnlockCallbackAcceptsOnlyThePoolManager() (gas: 630742)\n[PASS] testVenueQuoteRule() (gas: 1230415)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 116.21ms (52.31ms CPU time)\n\nRan 31 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAttestedClassCannotBeSelfDeclared() (gas: 294892)\n[PASS] testCallbackSelectorPinned() (gas: 3383)\n[PASS] testCounterCallDuel() (gas: 3589375)\n[PASS] testCounterThesisEntersTheJudgedSet() (gas: 2688706)\n[PASS] testFakeVenueIsRefused() (gas: 382766)\n[PASS] testFlagsAndBinding() (gas: 56048)\n[PASS] testForfeitsAreImdAndNeedNoConversion() (gas: 861195)\n[PASS] testNoDataRefunds() (gas: 880570)\n[PASS] testNoteTooSmall() (gas: 1644543)\n[PASS] testNotedBuyTakesStampAndDeposit() (gas: 729443)\n[PASS] testNotedSellPaysOnePercentPlusStamp() (gas: 988516)\n[PASS] testObservationsMustSpanAnHour() (gas: 1384019)\n[PASS] testPlainBuyTakesNothing() (gas: 211688)\n[PASS] testQuietSellPaysThreePercent() (gas: 295440)\n[PASS] testQuietThesisPoolSweeps() (gas: 300271)\n[PASS] testRetract() (gas: 866644)\n[PASS] testRightCallReturnsDeposit() (gas: 1623568)\n[PASS] testScoreIsReputationAndAccrualsSplitSeventyThirty() (gas: 2887924)\n[PASS] testSealedBuyMustKeepItsPositionFromTheSeal() (gas: 2165657)\n[PASS] testSealedNoteRevealsAgainstTheSealBaseline() (gas: 1770762)\n[PASS] testSellingEarlyBreaksTheCall() (gas: 1678252)\n[PASS] testThesisParentChild() (gas: 1362912)\n[PASS] testThesisWithoutChildForfeits() (gas: 828214)\n[PASS] testTreasuryDrip() (gas: 320866)\n[PASS] testTwoBlockPumpObserveUnwindSettlesWrong() (gas: 1692826)\n[PASS] testUnansweredWeekCanBeRetried() (gas: 2356119)\n[PASS] testUnrevealedSealIsNotAFreeOptionAndLapses() (gas: 1361008)\n[PASS] testUpOnlyIsRefused() (gas: 291916)\n[PASS] testWeeklyThesisJudging() (gas: 3728190)\n[PASS] testWriterRefundCappedAtStamp() (gas: 1589580)\n[PASS] testWrongCallForfeitsWithKeeperReward() (gas: 1511685)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 120.29ms (25.34ms CPU time)\n\nRan 18 tests for test/HookReview.t.sol:HookReviewTest\n[PASS] testBuyCallOnImdRefusedBeforeTakingBond() (gas: 695548)\n[PASS] testBuySettlementUsesSameObservationForBothLegs() (gas: 2194208)\n[PASS] testChildAtExactlyGraceDeadlineReleasesThesis() (gas: 1501471)\n[PASS] testDustReplacementsCannotMonopolizeObservationWindow() (gas: 30914015)\n[PASS] testJudgingWaitsForEveryThesisChildGrace() (gas: 3710252)\n[PASS] testLateChildCannotRescueThesis() (gas: 1480370)\n[PASS] testOneAuthorCannotFillTheWeeklyThesisSet() (gas: 43417988)\n[PASS] testOneHostileReadingRemainsAdverseAfterPriceRecovers() (gas: 2182461)\n[PASS] testReplacementCannotLeaveAFullSeriesShortOfOneHour() (gas: 4017959)\n[PASS] testReplacementDoesNotRestartTwentyBlockGap() (gas: 1296953)\n[PASS] testSealOnImdRefusedBeforeTakingStamp() (gas: 389434)\n[PASS] testSellCallOnImdRefusedBeforeTakingBond() (gas: 695149)\n[PASS] testSellSettlementUsesSameObservationForBothLegs() (gas: 2196149)\n[PASS] testSingleSidedLiquidityExitPaysNoHookSwapFee() (gas: 1189966)\n[PASS] testV2AliasPostRefused() (gas: 2486105)\n[PASS] testV2AliasSealRefused() (gas: 2230883)\n[PASS] testV3AliasPostRefused() (gas: 2323854)\n[PASS] testV3AliasSealRefused() (gas: 2067752)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 120.20ms (78.72ms CPU time)\n\nRan 7 tests for test/Pricer.t.sol:PricerTest\n[PASS] testQuoteLegIsAdverseEvenUnderAV3Twap() (gas: 28455)\n[PASS] testTwapRefusesZeroSpanAndV4() (gas: 17708)\n[PASS] testV2TwapFromWrappingCumulative() (gas: 9503)\n[PASS] testV3TwapOfAConstantTickIsThatTick() (gas: 15459)\n[PASS] testV3TwapRoundsNegativeMeansDown() (gas: 14848)\n[PASS] testV3TwapWeightsByTime() (gas: 14715)\n[PASS] testV4SettlesOnTheAdverseExtreme() (gas: 26636)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 120.31ms (531.51µs CPU time)\n\nRan 10 tests for test/Round3Findings.t.sol:Round3FindingsTest\n[PASS] testABuyCallStillBreaksWhenTheAuthorSells() (gas: 1669522)\n[PASS] testAGiftOfAnySizeDoesNotVoidACorrectSellCall() (gas: 1584170)\n[PASS] testAGiftWorthTheDepositDoesNotVoidACorrectSellCall() (gas: 1663423)\n[PASS] testALaunchPoolCallScoresTheSameWay() (gas: 1417891)\n[PASS] testASelfPricedVenueBooksReputationOnlyAndNoPoolPaysForIt() (gas: 3007470)\n[PASS] testAWrongCallOnAnotherVenueStillForfeitsAndBooksANegativeScore() (gas: 2707061)\n[PASS] testAWrongSellCallStillForfeits() (gas: 1395988)\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 256, μ: 23057, ~: 20760)\n[PASS] testRetractingACallOnAnotherVenueBooksHalfAWrong() (gas: 1945010)\n[PASS] testSqrtFloorsSmallInputs() (gas: 9204563)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 120.27ms (32.93ms CPU time)\n\nRan 27 tests for test/HookBoundaries.t.sol:HookBoundariesTest\n[PASS] testAfterSwapRejectsZeroOrWrongSignedOutput() (gas: 120869)\n[PASS] testCallCannotBeAChildOfItsOwnCallOrAClosedThesis() (gas: 2942983)\n[PASS] testChildAtTheSevenDayDeadlineCanReleaseTheThesis() (gas: 1486425)\n[PASS] testChildlessThesisForfeitureBoundaryAndKeeperPayment() (gas: 862151)\n[PASS] testEmptyCallAndThesisTextAreRejectedAtomically() (gas: 841850)\n[PASS] testEveryEnabledCallbackRejectsAStranger() (gas: 130741)\n[PASS] testExactOutputPlainBuyHasNoHookDelta() (gas: 54500)\n[PASS] testExactOutputQuietSellsAndNotedTradesAreRejected() (gas: 120205)\n[PASS] testFactoryCannotBindASecondPool() (gas: 73530)\n[PASS] testForeignPoolRejectedByBothSwapCallbacks() (gas: 85794)\n[PASS] testForgedNoteAndExemptionAreRejected() (gas: 153341)\n[PASS] testFuzzBondRoundTripReturnsOnlyTheBond(uint256) (runs: 1000, μ: 838169, ~: 838176)\nLogs:\n  Bound result 8887869247676377021\n\n[PASS] testFuzzNotedInputLeavesExactlyQuarterImdForThePool(uint256) (runs: 1000, μ: 58962, ~: 58968)\nLogs:\n  Bound result 8887869247676377021\n\n[PASS] testHorizonEdgesAndTargetEdges() (gas: 2708698)\n[PASS] testManagerCannotInventAnUnlockOutsideAnActiveOperation() (gas: 43865)\n[PASS] testMissingParentAndSameSideCounterAreRejectedAtomically() (gas: 2534248)\n[PASS] testNoDataBondCannotBeStolenOrClaimedTwice() (gas: 901173)\n[PASS] testObservationAndSettlementWindowExactEdges() (gas: 1479155)\n[PASS] testOnlyJudgeCanDrawOrPayAndZeroFundingIsRefused() (gas: 79405)\n[PASS] testRefundRequiresNextDayAuthorAndSingleUse() (gas: 841825)\n[PASS] testRetractAtHorizonIsTooLateAndBeforeItIsFinal() (gas: 1344006)\n[PASS] testSealMaximumAgeUsesSealedPriceDespiteExpiredPostingCheckpoint() (gas: 1102590)\n[PASS] testSealMinimumAgeIsInclusiveAndFailedRevealPreservesCommitment() (gas: 1553352)\n[PASS] testSealRejectsZeroHashAndDuplicateWithoutTakingAnotherStamp() (gas: 481566)\n[PASS] testSweepBoundaryMovesClaimsWithoutWithdrawingThem() (gas: 308016)\n[PASS] testTextLimitIsInclusiveForBothForms() (gas: 2027590)\n[PASS] testUnknownNotesFailEveryLifecycleEntry() (gas: 164079)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 120.28ms (186.78ms CPU time)\n\nRan 9 tests for test/CompanionFailures.t.sol:TreasuryFailuresTest\n[PASS] testDripFailsWhenTheHookCannotTakeTheFunds() (gas: 673929)\n[PASS] testDripIsPermissionlessAndCompounds() (gas: 518661)\n[PASS] testDripOfDustRoundsToZeroAndReverts() (gas: 258318)\n[PASS] testDripWithNothingHeldReverts() (gas: 54033)\n[PASS] testInitOnlyByTheNamedHookAndOnlyOnce() (gas: 623926)\n[PASS] testInitRefusesTheZeroHook() (gas: 556415)\n[PASS] testNoWithdrawOrAdminSurface() (gas: 274868)\n[PASS] testSecondDripOnTheSameDayRevertsAndTheNextDayWorks() (gas: 372660)\n[PASS] testTreasuryRefusesEth() (gas: 71164)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 120.69ms (1.42ms CPU time)\n\nRan 31 tests for test/PricerProperties.t.sol:PricerPropertiesTest\n[PASS] testDifficultyAnchors() (gas: 56436)\n[PASS] testDifficultyRefusesAZeroHorizon() (gas: 10063)\n[PASS] testDifficultyTiersStepExactlyAtTheThresholds() (gas: 79314)\n[PASS] testEmptyPoolsAreRefusedOnBothLegs() (gas: 161813)\n[PASS] testEthQuoteIsOnlyPriceableOnMainnet() (gas: 40894)\n[PASS] testFromSqrtRefusesAnEmptyOrUnpriceableReading() (gas: 53891)\n[PASS] testFromSqrtZeroThresholdIsSharpInBothOrientations() (gas: 1024182)\n[PASS] testFuzzAppendingAnObservationNeverHelpsTheCall(uint256[16],uint256[16],uint8) (runs: 1000, μ: 129778, ~: 114127)\nLogs:\n  Bound result 15\n  Bound result 999999999999999999999000001861\n  Bound result 1050000000000000000\n  Bound result 5000000000000000000\n  Bound result 527230684233762713427565495775\n  Bound result 800000000000000000\n  Bound result 999999999999999999999000005182\n  Bound result 1000000000000000001\n  Bound result 999999999999999999999011155112\n  Bound result 999999999999999999999000009870\n  Bound result 514264337593623178497920771838\n  Bound result 900000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 999999999999999999999000006932\n  Bound result 999999999999999999999020000001\n  Bound result 550000000000000000\n  Bound result 999999999999999999999000008701\n  Bound result 999999999999999999999000000867\n  Bound result 569362300363645817537087292623\n  Bound result 999999999999999999999000005639\n  Bound result 1800000000000000000\n  Bound result 1349999999999999999\n  Bound result 999999999999999999999000010693\n  Bound result 999999999999999999999000002004\n  Bound result 999999999999999999999000003071\n  Bound result 999999999999999999999000004097\n  Bound result 999999999999999999999000017600\n  Bound result 999999999999999999999000004097\n  Bound result 10000000000000000\n  Bound result 999999999999999999999000000051\n  Bound result 999999999999999999999000000045\n\n[PASS] testFuzzBuyDifficultyGrowsWithTheTarget(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36956, ~: 37035)\nLogs:\n  Bound result 8744591\n  Bound result 9989046\n  Bound result 89\n  Bound result 895886065782743286425730016173\n\n[PASS] testFuzzCheckpointKeepsStartAndWidensExtremes(uint160,uint160,uint256) (runs: 512, μ: 141511, ~: 141856)\nLogs:\n  Bound result 1266412660188944021222667689921\n  Bound result 1267201505824096256287622075370\n  Bound result 13298\n\n[PASS] testFuzzDifficultyFallsWithTheHorizon(uint32,uint16,uint16,uint256) (runs: 1000, μ: 36747, ~: 36869)\nLogs:\n  Bound result 832583\n  Bound result 13\n  Bound result 89\n  Bound result 895886065782743286425730016173\n\n[PASS] testFuzzFromSqrtIsMonotoneAndInverts(uint160,uint160) (runs: 1000, μ: 23170, ~: 21255)\nLogs:\n  Bound result 9951796178932335329316503790068058186205670\n  Bound result 100000000000000000000\n\n[PASS] testFuzzLog2IsBracketedAndMonotone(uint256,uint256) (runs: 1000, μ: 39606, ~: 39290)\nLogs:\n  Bound result 12830\n  Bound result 9999999999999999999999999999999999996582\n\n[PASS] testFuzzLog2IsExactAtPowersOfTwo(uint8) (runs: 512, μ: 16399, ~: 14684)\nLogs:\n  Bound result 64\n\n[PASS] testFuzzPostPriceWindowBoundaries(uint256,bool) (runs: 512, μ: 53845, ~: 51987)\nLogs:\n  Bound result 22376\n\n[PASS] testFuzzSellDifficultyGrowsAsTheTargetFalls(uint32,uint32,uint16,uint256) (runs: 1000, μ: 36436, ~: 36421)\nLogs:\n  Bound result 48\n  Bound result 4830\n  Bound result 39\n  Bound result 216993054449011892149096971366\n\n[PASS] testFuzzSqrtIsTheIntegerFloor(uint256) (runs: 1000, μ: 19295, ~: 17101)\n[PASS] testFuzzV2TwapOfAConstantRatioIsThatRatio(uint112,uint112,uint32,bool) (runs: 512, μ: 21350, ~: 21299)\nLogs:\n  Bound result 33299979435\n  Bound result 5335037734397652726161\n  Bound result 2350359\n\n[PASS] testFuzzV3SettlementIgnoresMiddleReadings(int24,uint256[16],uint8,bool) (runs: 512, μ: 63695, ~: 60592)\nLogs:\n  Bound result 16286\n  Bound result 14\n\n[PASS] testFuzzV4SettlesOnTheExtremeOfEveryObservation(uint256[16],uint256[16],uint8) (runs: 1000, μ: 99556, ~: 92450)\nLogs:\n  Bound result 15\n  Bound result 1860\n  Bound result 1050000000000000000\n  Bound result 5000000000000000000\n  Bound result 931333092506154428405244755968\n  Bound result 800000000000000000\n  Bound result 5181\n  Bound result 1000000000000000001\n  Bound result 11155111\n  Bound result 9869\n  Bound result 514264337593543950336000000000\n  Bound result 900000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 6931\n  Bound result 20000000\n  Bound result 550000000000000000\n  Bound result 8700\n  Bound result 866\n  Bound result 806583589928461891782872549115\n  Bound result 5638\n  Bound result 1800000000000000000\n  Bound result 1349999999999999999\n  Bound result 10692\n  Bound result 2003\n  Bound result 3070\n  Bound result 4096\n  Bound result 17599\n  Bound result 4096\n  Bound result 10000000000000000\n  Bound result 50\n  Bound result 44\n\n[PASS] testObserveRefusesUnknownVenuesAndUnpriceableQuotes() (gas: 150448)\n[PASS] testPostPriceRefusesAnEmptyWindow() (gas: 15317)\n[PASS] testPostPriceWhoseProductRoundsToZeroIsRefused() (gas: 293627)\n[PASS] testSellDifficultyRefusesAZeroTarget() (gas: 9518)\n[PASS] testSettlementRefusesAnEmptyOrUnspannedSeries() (gas: 39083)\n[PASS] testSqrtIsExactOnEveryHorizonDifficultyUses() (gas: 903275)\n[PASS] testSqrtPins() (gas: 123131)\n[PASS] testTwapRefusesTimeRunningBackwards() (gas: 9132)\n[PASS] testV2TwapAndSpotOfADustRatioAreRefused() (gas: 220677)\n[PASS] testV3TwapRefusesAMeanTickOutsideTheRange() (gas: 27255)\n[PASS] testV4SeriesWithADustExtremeIsRefusedNotSettledAtZero() (gas: 33519)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 120.79ms (1.19s CPU time)\n\nRan 1 test for test/RouterInvariant.t.sol:RouterInvariantTest\n[PASS]\nRouterInvariantTest invariants:\n[PASS] invariant_bindingsPinned\n[PASS] invariant_everyNoteCameThroughTheRouter\n[PASS] invariant_managerBacksTheHooksClaims\n[PASS] invariant_routerKeepsNothing\n RouterInvariantTest invariants (runs: 48, calls: 1920, reverts: 4)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| RouterHandler | advance        | 218   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | checkpoint     | 222   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteBuy        | 450   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | noteSell       | 197   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainBuy       | 202   | 4       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | plainSell      | 216   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | strayCallbacks | 211   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| RouterHandler | thesis         | 204   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 17337\n  Bound result 50196\n  Bound result 8\n  Bound result 2\n  Bound result 2000000000000000000000\n  Bound result 57479\n  Bound result 11\n  Bound result 3225\n  Bound result 2\n  Bound result 4096\n  Bound result 2\n  Bound result 16710\n  Bound result 54304\n  Bound result 72\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 63974889182495246\n  Bound result 2\n  Bound result 1\n  Bound result 109593401159525030340\n  Bound result 2\n  Bound result 1\n  Bound result 2251799813685249\n  Bound result 54499\n  Bound result 18\n  Bound result 2\n  Bound result 1549114469061251627748\n  Bound result 19587\n  Bound result 93\n  Bound result 3027972016\n  Bound result 2\n  Bound result 5398\n  Bound result 0\n  Bound result 1608733928026741225818\n  Bound result 31816\n  Bound result 56\n  Bound result 2\n  Bound result 2000000000000000000000\n  Bound result 52049\n  Bound result 2\n  Bound result 0\n  Bound result 2400\n  Bound result 52360\n  Bound result 15\n  Bound result 1\n  Bound result 3031000710\n  Bound result 0\n  Bound result 2\n  Bound result 800000000000000000\n  Bound result 50485\n  Bound result 40\n  Bound result 1\n  Bound result 126082752773113604668\n  Bound result 1\n  Bound result 10951\n  Bound result 64\n  Bound result 22\n  Bound result 1\n  Bound result 2\n  Bound result 736617302249910371012\n  Bound result 31397\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 757764418\n  Bound result 54097\n  Bound result 73\n  Bound result 1\n  Bound result 47863428643384343514970\n  Bound result 0\n  Bound result 19183\n  Bound result 58193\n  Bound result 18\n  Bound result 1\n  Bound result 2\n  Bound result 0\n  Bound result 1999999999999999999999\n  Bound result 10868\n  Bound result 43\n  Bound result 1\n  Bound result 1999999999999999995903\n  Bound result 50473\n  Bound result 95\n  Bound result 1\n  Bound result 0\n  Bound result 5335\n  Bound result 50011\n  Bound result 88\n  Bound result 1\n  Bound result 2\n  Bound result 11216\n  Bound result 210\n  Bound result 5\n  Bound result 2\n  Bound result 11478\n  Bound result 12716\n  Bound result 19\n  Bound result 2\n  Bound result 954953452\n  Bound result 1\n  Bound result 172800\n  Bound result 1478\n  Bound result 68\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 468.01ms (453.65ms CPU time)\n\nRan 1 test for test/TreasuryInvariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_balanceIsGiftsMinusDrips\n[PASS] invariant_dripNeverExceedsTwoPercent\n[PASS] invariant_holdsNoEth\n[PASS] invariant_hookHoldsExactlyTheDrips\n[PASS] invariant_hookIsPinned\n[PASS] invariant_lastDripDayMatchesTheLastSuccessfulDrip\n TreasuryInvariantTest invariants (runs: 256, calls: 12288, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TreasuryHandler | advance   | 2496  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | drip      | 2506  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | gift      | 2499  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | initAgain | 2342  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TreasuryHandler | sendEth   | 2445  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 254\n  Bound result 1947\n  Bound result 10000000000000000000\n  Bound result 623904094144329964056090\n  Bound result 79228162514264337593543950334\n  Bound result 7220240414996585661\n  Bound result 5929\n  Bound result 997\n  Bound result 3700\n  Bound result 66068\n  Bound result 621\n  Bound result 5739708011224891504\n  Bound result 6727\n  Bound result 391\n  Bound result 850\n  Bound result 2445417099506974841\n  Bound result 2855\n  Bound result 422\n  Bound result 235\n  Bound result 3525\n  Bound result 7584007913129639829\n  Bound result 7547302080429651581\n  Bound result 360\n  Bound result 48879\n  Bound result 3600\n  Bound result 1000000000000000000000000000000\n  Bound result 133\n  Bound result 1\n  Bound result 802\n  Bound result 150362\n  Bound result 7237\n  Bound result 5846\n  Bound result 999999999999999999999951\n  Bound result 110\n  Bound result 530928402780972177754\n  Bound result 6283019655932542975\n  Bound result 206990\n  Bound result 7763\n  Bound result 3792478064\n  Bound result 152823\n  Bound result 5949\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.15s (1.15s CPU time)\n\nRan 3 tests for test/AnnexInvariant.t.sol:AnnexInvariantTest\n[PASS]\nAnnexInvariantTest invariants:\n[PASS] invariant_admissionIsPermanent\n[PASS] invariant_bondsConserved\n[PASS] invariant_imdHeldEqualsBondsOwed\n[PASS] invariant_noMargRetained\n[PASS] invariant_recordsCountOutcomes\n[PASS] invariant_statusesAreFinalAndDepositsMatch\n AnnexInvariantTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| AnnexHandler | admission         | 345   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | claim             | 342   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | moveX             | 328   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | observe           | 296   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | observeSeries     | 299   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | post              | 345   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | pullOrRefillVenue | 329   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | pushEmptyPrice    | 319   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | retract           | 338   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | settle            | 327   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | strangerClaim     | 299   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | tradeMarg         | 329   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | tradeX            | 359   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| AnnexHandler | warp              | 353   | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 299999000000000000000120\n  Bound result 2\n  Bound result 8562\n  Bound result 32\n  Bound result 3644952053080496622\n  Bound result 294\n  Bound result 99999000000000000007463\n  Bound result 49097206052680665633654\n  Bound result 92323\n  Bound result 3223\n  Bound result 1\n  Bound result 9750000000000238213\n  Bound result 3000\n  Bound result 299999000000000000000018\n  Bound result 4\n  Bound result 2000000000000000000000\n  Bound result 300\n  Bound result 3483\n  Bound result 99999000000000000006650\n  Bound result 14983\n  Bound result 12539\n  Bound result -4577\n  Bound result 7584007913129639829\n  posts 1 settles 1\n  claimed 9750000000000238213 forfeited to pools 0\n  keeper paid 0 admitted hooks 2\n  bounded posts 1 standing readings 1\n\n[PASS] testHandlerPulledPoolDistinguishesWrongFromMissingObservations() (gas: 4694853)\nLogs:\n  Bound result 12000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 8000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 1800\n\n[PASS] testHandlerStandingPricesCanReturnARightBond() (gas: 2680161)\nLogs:\n  Bound result 12000\n  Bound result 1\n  Bound result 10000000000000000000\n  Bound result 3000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.18s (2.18s CPU time)\n\nRan 5 tests for test/HookAccountingInvariant.t.sol:HookAccountingInvariantTest\n[PASS] invariant_everyImdClaimHasExactlyOneObligation() (runs: 128, calls: 10240, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| HookAccountingHandler | abandonJudging    | 474   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | advance           | 540   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | answerJudging     | 514   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | child             | 557   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimDeposit      | 488   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | claimRefund       | 464   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | fund              | 521   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | giftAndDrip       | 491   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | notedSell         | 490   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | observeSeries     | 542   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | payJudging        | 456   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | post              | 1075  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | requestJudging    | 536   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | retract           | 504   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | seal              | 505   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | settle            | 533   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | sweep             | 512   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | trade             | 494   | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| HookAccountingHandler | unauthorizedClaim | 544   | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 14064716093743497687\n  Bound result 2\n  Bound result 53\n  Bound result 3\n  Bound result 1\n  Bound result 98000000000000010108\n  Bound result 4\n  Bound result 5\n  Bound result 32254\n  Bound result 9750000000000005545\n  Bound result 99999000000000100000001\n  Bound result 5\n  Bound result 2\n  Bound result 2\n  Bound result 650000000000000000\n  Bound result 1\n  Bound result 6\n  Bound result 99999000000000000002990\n  Bound result 4\n  Bound result 6\n  Bound result 9750000000000000005\n  Bound result 1499999999999846154\n  Bound result 9750000000000000010\n  Bound result 1\n  Bound result 7\n  Bound result 49152\n  Bound result 9\n  Bound result 4\n  Bound result 7\n  Bound result 99999000000000000006183\n  Bound result 21126263746836874040860\n  Bound result 18277\n  Bound result 1350000000000000000\n  Bound result 2\n  Bound result 10\n  Bound result 22173693443322509749246\n  Bound result 8\n  Bound result 8\n  Bound result 99999000000000154318477\n  Bound result 9750000000016777217\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 92650941119459463342\n  Bound result 76716339750029690665\n  Bound result 9750000000000000282\n  Bound result 99999000000000041184400\n  Bound result 12\n  Bound result 700000000000000000\n  Bound result 5\n  Bound result 3\n  Bound result 11\n  Bound result 9750000000000017163\n  Bound result 13\n  Bound result 14\n  Bound result 4\n  Bound result 3063\n  Bound result 20345\n  Bound result 7\n  Bound result 3\n  Bound result 4000000000000000000\n\n[PASS] testAccountingHandlerChecksGraceThenAllowsPaidRetry() (gas: 2362804)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n\n[PASS] testAccountingHandlerExercisesPayoutsForfeitsSealsDripsAndSweeps() (gas: 5432494)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 4000000000000000000\n  Bound result 5\n  Bound result 50000000000000000000\n\n[PASS] testAccountingHandlerModelsThesisCapAcrossClosureAndWeekRollover() (gas: 4227583)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 4\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\n[PASS] testAccountingHandlerRefusesChildWhoseCheckpointMaturesAfterGrace() (gas: 2660729)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 3000000000000000000\n  Bound result 3\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000\n  Bound result 5\n  Bound result 5\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.49s (7.49s CPU time)\n\nRan 25 test suites in 7.50s (12.84s CPU time): 324 tests passed, 0 failed, 1 skipped (325 total tests)\n","passed":true},{"durationMs":170,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Marginalia.approve(address,uint256)\",\"Marginalia.transfer(address,uint256)\",\"Marginalia.transferFrom(address,address,uint256)\",\"MarginaliaAnnex.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaAnnex.claimDeposit(bytes32)\",\"MarginaliaAnnex.observe(bytes32)\",\"MarginaliaAnnex.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaAnnex.post((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256,uint256)\",\"MarginaliaAnnex.requestAdmission(address[])\",\"MarginaliaAnnex.retract(bytes32,string)\",\"MarginaliaAnnex.settle(bytes32)\",\"MarginaliaAnnex.unlockCallback(bytes)\",\"MarginaliaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"MarginaliaHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"MarginaliaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"MarginaliaHook.claimDeposit(bytes32)\",\"MarginaliaHook.claimRefund(bytes32)\",\"MarginaliaHook.drawForJudging(uint32,uint256,bool)\",\"MarginaliaHook.fundPot(uint256)\",\"MarginaliaHook.observe(bytes32)\",\"MarginaliaHook.payJudged(uint32,bytes32[3])\",\"MarginaliaHook.retract(bytes32,string)\",\"MarginaliaHook.seal(address,(uint8,bytes32,address,bool),bytes32)\",\"MarginaliaHook.settle(bytes32)\",\"MarginaliaHook.settleThesis(bytes32)\",\"MarginaliaHook.sweep(uint8,uint32)\",\"MarginaliaHook.unlockCallback(bytes)\",\"MarginaliaJudge.abandonRequest(uint32)\",\"MarginaliaJudge.convertForfeits()\",\"MarginaliaJudge.init(address,address,bytes32,address)\",\"MarginaliaJudge.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaJudge.payJudged(uint32)\",\"MarginaliaJudge.requestJudging(uint32)\",\"MarginaliaPages.abandonClaim(bytes32)\",\"MarginaliaPages.buy(bytes32,uint256,uint256)\",\"MarginaliaPages.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"MarginaliaPages.recycle(bytes32)\",\"MarginaliaPages.requestClaim(string,uint256)\",\"MarginaliaPages.sell(bytes32,uint256,uint256)\",\"MarginaliaPages.unlockCallback(bytes)\",\"MarginaliaRouter.checkpointVenue((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address))\",\"MarginaliaRouter.init(address,address)\",\"MarginaliaRouter.note((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.sellWithNote((address,(uint8,bytes32,address,bool),uint8,uint32,uint16,bytes32,uint8,string),(address,address,uint24,int24,address),uint256,uint256,uint256)\",\"MarginaliaRouter.uniswapV3SwapCallback(int256,int256,bytes)\",\"MarginaliaRouter.unlockCallback(bytes)\",\"MarginaliaTreasury.drip()\",\"MarginaliaTreasury.init(address)\"],\"files\":{\".gitignore\":14,\"ADAPTATION.md\":611,\"AGENTS.md\":126,\"README.md\":247,\"SPEC.md\":296,\"app/app.js\":286,\"app/index.html\":126,\"app/style.css\":57,\"brand/banner-ledger-1500x500.png\":5801,\"brand/pfp-manicule-400.png\":1390,\"brand/pfp-manicule-800.png\":5292,\"dependencies.json\":28,\"drafts/thesis-imd.md\":34,\"drafts/thesis-infer.md\":31,\"drafts/thesis-zto.md\":28,\"foundry.toml\":21,\"helper/.gitignore\":3,\"helper/package-lock.json\":737,\"helper/package.json\":20,\"helper/public/index.html\":94,\"helper/server.js\":90,\"helper/src/app.js\":257,\"jobs/launch-1-hook.json\":43,\"jobs/launch-2-contracts.json\":38,\"jobs/launch-A-implementations.json\":47,\"jobs/launch-A2-implementations.json\":99,\"jobs/launch-B-hook.json\":98,\"jobs/launch-C-pages.json\":36,\"jobs/launch-D-annex.json\":36,\"jobs/launch-E-pages-v2.json\":36,\"jobs/launch-hook-v3.json\":43,\"jobs/oracle-claim-probe.json\":34,\"jobs/site-A-swarm.json\":27,\"jobs/site-B-v2.json\":27,\"jobs/site-C-v3.json\":26,\"keeper/.env.example\":27,\"keeper/.nvmrc\":1,\"keeper/.railwayignore\":3,\"keeper/README.md\":24,\"keeper/abi/erc20.json\":1,\"keeper/abi/factory.json\":1,\"keeper/abi/hook.json\":1,\"keeper/abi/judge.json\":1,\"keeper/abi/router.json\":1,\"keeper/package-lock.json\":222,\"keeper/package.json\":16,\"keeper/railway.json\":11,\"keeper/src/chain.js\":104,\"keeper/src/config.js\":53,\"keeper/src/db.js\":76,\"keeper/src/index.js\":89,\"keeper/src/sync.js\":90,\"keeper/src/tasks.js\":194,\"llms.txt\":25,\"remappings.txt\":4,\"src/HookFlags.sol\":33,\"src/Marginalia.sol\":12,\"src/MarginaliaAnnex.sol\":695,\"src/MarginaliaHook.sol\":975,\"src/MarginaliaImpls.sol\":15,\"src/MarginaliaJudge.sol\":290,\"src/MarginaliaPages.sol\":461,\"src/MarginaliaPricer.sol\":305,\"src/MarginaliaRouter.sol\":446,\"src/MarginaliaTreasury.sol\":53,\"src/MarginaliaTypes.sol\":127,\"src/OracleAttestation.sol\":221,\"src/interfaces/IIntake.sol\":15,\"src/interfaces/ILaunchFactory.sol\":49,\"test/ADVERSARIAL_COVERAGE.md\":59,\"test/Annex.t.sol\":1053,\"test/AnnexAdversarial.t.sol\":1322,\"test/AnnexInvariant.t.sol\":775,\"test/AuditFindings.t.sol\":156,\"test/CompanionFailures.t.sol\":941,\"test/HoldRule.t.sol\":259,\"test/HookAccountingInvariant.t.sol\":776,\"test/HookBoundaries.t.sol\":475,\"test/HookReview.t.sol\":432,\"test/Implementations.t.sol\":96,\"test/JudgeOracle.t.sol\":270,\"test/LaunchAuditFindings.t.sol\":230,\"test/LaunchBinding.t.sol\":305,\"test/Lifecycle.t.sol\":696,\"test/Pages.t.sol\":527,\"test/PriceHistory.t.sol\":233,\"test/Pricer.t.sol\":88,\"test/PricerProperties.t.sol\":569,\"test/RevisionFindings.t.sol\":324,\"test/Round3Findings.t.sol\":218,\"test/RouterInvariant.t.sol\":248,\"test/TreasuryInvariant.t.sol\":167,\"test/fork/MainnetLaunch.t.sol\":374,\"test/helpers/Fixture.sol\":286,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fbcf15f9978f0faf1f61a7219a5b0de5728575ac31ab3d146317a2e992480623","verifiedTreeHash":"51ef53726aa98d406001c5688a5219079d58dd3d","verifierVersion":"0.1.0+fb8278c5"}]}