{"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":"e08ee63b-044e-4e84-b605-c14bd09f08ba","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"waiting"}],"objective":"Swarm Fund ($SF): univ4_hook on Ethereum mainnet, paired with IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7).\n\nToken: name \"Swarm Fund\", symbol SF, 1e9 supply, 18 decimals, plain ERC20, fixed, no owner/mint/pause/upgrade. Factory split 10% swarm / 90% launcher. Seed pool with poolBps 9000 of launcher share; remainder to paying wallet.\n\nHook (beforeSwap + afterSwap): ADD an extra 2.0% fee on every buy and sell, taken in IMD, on top of the factory 1.25% pool fee. Send 100% of that 2% hook fee to SwarmFundTreasury in the same path. Hook fee goes to treasury only — not to LPs, not to SF stakers, not to team. Do not route the factory 1% launcher fee into the treasury.\n\nTreasury (non-upgradeable): holds IMD + bought project tokens. No EOA withdraw. Only (1) daily buys from a verified EIP-712 IMD ranking, (2) graduation sells when MCAP ceiling hit, (3) receive fees/sale proceeds. Recycling: sale proceeds return to treasury for new launches. If no signed list that day, hold.\n\nDaily buys : IMD schedule/oracle v4-volume-rank style; anyone submits signed list; treasury verifies freshness (<=36h) and executes TWAP chunks over ~24h. Buckets of day's IMD fee budget: Leaders 40% (top 5 by 28d median volume), Risers 35% (under MCAP ceiling by growth, per-project cap), New launches 25% (IMD launches 14–42 days old, equal). Filters: IMD-launched + admission passed; IMD-paired; >=14d old; min liquidity; not on deny list; exclude projects launched by the $SF launching wallet.\n\nGraduation: permissionless slow sell over weeks when ceiling met; proceeds to treasury (prefer New bucket). Gaming: 28d median, buy size capped vs pool liquidity, multi-day TWAP.\n\nGovernance: SF stakers vote only within hard-coded caps on bucket shares, MCAP ceiling, deny-list adds. Owner (paying wallet): deny-list behind >=24h delay; set fee/buckets within caps; pause new buys. Cannot withdraw treasury, mint SF, buy outside rules, or pay holders.\n\nHolders get: votes + future app perks (out of scope stub OK). Holders do NOT get: profit share, redemption, buyback/burn from treasury. Do not market as investment.\n\nDeliver: Forge project, tests, audit panel, launch.json, mainnet deploy via IMD, hosted public dashboard (ipfs label swarm-fund) showing holdings, buys/sells, last ranking, rules. No upgradeable proxies. README notes Spain/EU counsel recommended before marketing.","parentJobId":null,"planHash":"f98562d5ee95b3f347af6f7ee71722fe4f414cc5433d2455c7e40bc477f78c79","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e08ee63b-044e-4e84-b605-c14bd09f08ba","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-932-swarm-fund-sf-univ4-hook"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51437","feedbackHash":"950fb40b85c5b0e65462954660d3ae80c9475b551bbf24e8f1ec311dbf3af883","nodeKey":"build_contract_project","submissionHash":"fcd8632ba278c3a21112e15bb2f7aec67a35d3f71dfda2558d19996a2ff9eba0","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51329","feedbackHash":"f5333bf983889ceae69ffc47ac66b33b549b28d703b2db811bad7dd67d2bb143","nodeKey":"build_contract_project","submissionHash":"6d6c96e90bb4c8f4a80d3e03027080da286b315d315a95d2d2685b9d127df9f6","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51328","feedbackHash":"0f7f751c22348d7931ac4ce3c6fc1e9121d4a68cabf21e7b530945a296c61176","nodeKey":"build_contract_project","submissionHash":"a359ff4563f5ab2511eb2077252f14c9e0a2d1d6c37b00f493d8adc96df002ff","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"52d4ec29b3947d5716970da28a9f5910cd198f7b42fcd815edb03ff68e7b5c7f","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"51e51212d67d77deb053ad2f9ff94b242ac0fdc0ec5e98d7f6215210066989c2","device":"8d3c5d45c10bda24","findings":[],"hash":"6d6c96e90bb4c8f4a80d3e03027080da286b315d315a95d2d2685b9d127df9f6","nodeId":"ff3f41c4-a47d-468b-9a7d-a17de7eeb11f","outcome":"completed","summary":"Implemented the contracts, treasury/governance, dashboard, audit panel, and corrected manifest fields.\n\nValidation passed: Forge build, format check, 41 project tests, 10 supplied checks, and 6 JavaScript checks.\n\nMainnet deployment and public IPFS hosting remain pending missing operator configuration and service access. See [README.md](/home/seat/.identitymd/work/e08ee63b-044e-4e84-b605-c14bd09f08ba/ff3f41c4-a47d-468b-9a7d-a17de7eeb11f/README.md) for the handoff.","treeHash":"612407e4cd4171afa2bb5988919b4028c13bf6c7","usage":{"cachedInputTokens":3982208,"inputTokens":150675,"model":"gpt-6-astra","outputTokens":72357,"runtime":"codex","turns":11,"wallClockMs":3019170}},{"artifacts":[],"attempt":3,"bundleHash":"bc82c00365501c03d55275d8bf3186b0bd685523fb7f1be0034069d1e387933e","device":"fc6af3255ecf3684","findings":[],"hash":"a359ff4563f5ab2511eb2077252f14c9e0a2d1d6c37b00f493d8adc96df002ff","nodeId":"ff3f41c4-a47d-468b-9a7d-a17de7eeb11f","outcome":"completed","summary":"Implemented the contracts, launch manifest, audit panel, dashboard, and IPFS archive.\n\n- `forge build`, all **48 tests**, and `forge fmt --check` pass.\n- Slither reports **zero high-severity findings**.\n- Router callbacks cannot spend arbitrary wallet approvals.\n\n**Mainnet deployment and public IPFS hosting remain pending**: verified payer/signer configuration and deployment/pinning access were unavailable; RPC verification returned HTTP 403.\n\nDeployment instructions and remaining responsibilities are documented in [README.md](/home/seat/.identitymd/work/e08ee63b-044e-4e84-b605-c14bd09f08ba/ff3f41c4-a47d-468b-9a7d-a17de7eeb11f/README.md).","treeHash":"5a9b1a87c784b8248ebfa40c4e8fea9541039995","usage":{"cachedInputTokens":4153344,"inputTokens":150441,"model":"gpt-6-astra","outputTokens":72059,"runtime":"codex","turns":8,"wallClockMs":2967632}},{"artifacts":[],"attempt":1,"bundleHash":"b62c1456c1878000a69737a2fac3f81f6742e514b856d7892a601a058b8d5996","device":"810692103659803b","findings":[],"hash":"fcd8632ba278c3a21112e15bb2f7aec67a35d3f71dfda2558d19996a2ff9eba0","nodeId":"ff3f41c4-a47d-468b-9a7d-a17de7eeb11f","outcome":"completed","summary":"Implemented the contracts, tests, ranking tools, dashboard, IPFS artifact, launch manifest, and audit documentation. See [README](./README.md).\n\nValidation passed: `forge build`, `forge test` (38 tests), `forge fmt --check`, plus 9 JavaScript/Python checks.\n\n**Mainnet deployment and public hosting remain pending** production IMD parameters, signer/deployment access, and IPFS pinning. Independent security review is also documented as outstanding.","treeHash":"135595e87c5ee576e53488000e89204ab8f616d6","usage":{"cachedInputTokens":2724480,"inputTokens":137882,"model":"gpt-6-astra","outputTokens":59665,"runtime":"codex","turns":8,"wallClockMs":3159612}}],"verification":[{"checks":[{"durationMs":46308,"exitCode":0,"name":"build","output":"Compiling 108 files with Solc 0.8.26\nSolc 0.8.26 finished in 46.15s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> src/SwarmFundHook.sol:109:30:\n    |\n109 |             (uint256 amount, uint256 fee) = _specifiedFee(params);\n    |                              ^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> src/SwarmFundHook.sol:115:9:\n    |\n115 |         uint256 fee = Math.mulDiv(actual, treasury.feeBps(), 10000);\n    |         ^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/Treasury.t.sol:70:5:\n   |\n70 |     function _sign(bytes32 digest) internal returns (bytes memory) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-events-access-control]: `lockedUntil` is changed without an event but is used for access control\n    ╭▸ src/SwarmGovernance.sol:100:45\n    │\n100 │         if (lock > lockedUntil[msg.sender]) lockedUntil[msg.sender] = lock;\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `expectingUnlock` is changed without an event but is used for access control\n   ╭▸ src/SwarmSwapRouter.sol:46:9\n   │\n46 │         expectingUnlock = false;\n   │         ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/SwarmFundHook.sol:33:39\n   │\n33 │     constructor(IPoolManager manager, address sf, IERC20 pair, address payingWallet, address rankingSigner) {\n   │                                       ━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmSwapRouter.sol:39:29\n   │\n39 │         result = abi.decode(manager.unlock(abi.encode(msg.sender, pool, params, maxInput, minOutput)), (BalanceDelta));\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmSwapRouter.sol:41:94\n   │\n41 │         if (manager.balanceOf(address(hook), Currency.wrap(address(hook.imd())).toId()) > 0) hook.redeemFees();\n   │                                                                                              ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:73:31\n   │\n73 │         require(amount > 0 && block.timestamp >= lockedUntil[msg.sender], \"stake locked\");\n   │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmSwapRouter.sol:36:17\n   │\n36 │         require(block.timestamp <= deadline && minOutput > 0 && maxInput > 0, \"bounds/deadline\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:81:61\n   │\n81 │         require(staked[msg.sender] >= PROPOSAL_THRESHOLD && block.timestamp >= maturedAt[msg.sender], \"proposer\");\n   │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n   ╭▸ src/SwarmSwapRouter.sol:58:9\n   │\n58 │         IERC20(Currency.unwrap(inCurrency)).safeTransferFrom(payer, address(manager), uint256(-int256(input)));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:91:17\n   │\n91 │         require(p.ends > block.timestamp && !voted[id][msg.sender], \"vote closed\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:92:17\n   │\n92 │         require(block.timestamp >= maturedAt[msg.sender], \"immature\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:110:13\n    │\n110 │             treasury.setBuckets(SafeCast.toUint16(p.a), SafeCast.toUint16(p.b), SafeCast.toUint16(p.c));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:112:13\n    │\n112 │             treasury.setCeiling(p.a);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:114:13\n    │\n114 │             treasury.queueDeny(p.project);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmGovernance.sol:106:32\n    │\n106 │         require(p.ends != 0 && block.timestamp >= uint256(p.ends) + EXECUTION_DELAY, \"delay\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmGovernance.sol:116:9\n    │\n116 │         emit Executed(id);\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `expectingUnlock` is changed without an event but is used for access control\n    ╭▸ src/SwarmFundTreasury.sol:379:9\n    │\n379 │         expectingUnlock = false;\n    │         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwarmFundTreasury.sol:111:52\n    │\n111 │     constructor(IPoolManager manager, IERC20 pair, address token, address payer, address signer)\n    │                                                    ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:53:40\n   │\n53 │             input < 0 && output > 0 && uint256(-int256(input)) <= maxIn && uint256(int256(output)) >= minOut, \"slippage\"\n   │                                        ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:53:76\n   │\n53 │             input < 0 && output > 0 && uint256(-int256(input)) <= maxIn && uint256(int256(output)) >= minOut, \"slippage\"\n   │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:58:87\n   │\n58 │         IERC20(Currency.unwrap(inCurrency)).safeTransferFrom(payer, address(manager), uint256(-int256(input)));\n   │                                                                                       ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:59:37\n   │\n59 │         require(manager.settle() == uint256(-int256(input)), \"nonstandard input\");\n   │                                     ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:60:42\n   │\n60 │         manager.take(outCurrency, payer, uint256(int256(output)));\n   │                                          ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:78:18\n   │\n78 │         amount = uint256(params.amountSpecified < 0 ? -params.amountSpecified : params.amountSpecified);\n   │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:79:27\n   │\n79 │         require(amount <= uint256(uint128(type(int128).max)), \"amount range\");\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:79:35\n   │\n79 │         require(amount <= uint256(uint128(type(int128).max)), \"amount range\");\n   │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:84:33\n   │\n84 │         require(amount + fee <= uint256(uint128(type(int128).max)), \"amount plus fee range\");\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:84:41\n   │\n84 │         require(amount + fee <= uint256(uint128(type(int128).max)), \"amount plus fee range\");\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundHook.sol:127:9\n    │\n127 │         emit HookFee(amount, deferred);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:97:63\n   │\n97 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                               ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:97:70\n   │\n97 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                      ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:107:26\n    │\n107 │         uint256 actual = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:116:24\n    │\n116 │         require(fee <= uint256(uint128(type(int128).max)), \"fee range\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:116:32\n    │\n116 │         require(fee <= uint256(uint128(type(int128).max)), \"fee range\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:118:44\n    │\n118 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:118:51\n    │\n118 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwarmFundHook.sol:134:9\n    │\n134 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundHook.sol:146:9\n    │\n146 │         emit FeesRedeemed(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:167:28\n    │\n167 │         denyAfter[token] = uint64(block.timestamp + 1 days);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:172:42\n    │\n172 │         require(denyAfter[token] != 0 && block.timestamp >= denyAfter[token], \"deny delay\");\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:214:17\n    │\n214 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= MAX_AGE, \"stale/future\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:214:48\n    │\n214 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= MAX_AGE, \"stale/future\");\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:230:17\n    │\n230 │         require(p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"age\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:230:52\n    │\n230 │         require(p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"age\");\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:233:48\n    │\n233 │                 && (denyAfter[p.token] == 0 || block.timestamp < denyAfter[p.token]),\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:238:36\n    │\n238 │         if (p.bucket == 2) require(block.timestamp - p.launchedAt <= 42 days, \"new age\");\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:245:32\n    │\n245 │         require(!buysPaused && day == block.timestamp / 1 days && day > lastRankingDay, \"day/paused\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:246:38\n    │\n246 │         require(epochStarted == 0 || block.timestamp >= uint256(epochStarted) + 1 days, \"active day\");\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:278:9\n    │\n278 │         emit RankingAccepted(day, digest, issuedAt, feeBudget, recycledImd);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:287:13\n    │\n287 │             emit OrderScheduled(day, i, p.token, p.bucket, allocation);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:220:9\n    │\n220 │         require(c0 < c1 && ((c0 == address(imd) && c1 == p.token) || (c1 == address(imd) && c0 == p.token)), \"IMD pair\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:221:9\n    │\n221 │         require(p.pool.fee == 12500 && p.pool.tickSpacing > 0 && p.pool.tickSpacing <= 32767, \"pool policy\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:222:9\n    │\n222 │         require(p.token.code.length > 0 && p.token != sf, \"project token\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:223:9\n    │\n223 │         require(p.priceImdX18 > 0 && p.liquidityImd >= minLiquidityImd, \"price/liquidity\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:224:9\n    │\n224 │         require(poolManager.getLiquidity(p.pool.toId()) > 0, \"inactive pool\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:229:9\n    │\n229 │         require(p.imdLaunched && p.admitted && p.launcher != owner && p.launcher != address(0), \"admission/launcher\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:230:9\n    │\n230 │         require(p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"age\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:231:9\n    │\n231 │ ┏         require(\n232 │ ┃             !denied[p.token] && !graduated[p.token]\n233 │ ┃                 && (denyAfter[p.token] == 0 || block.timestamp < denyAfter[p.token]),\n234 │ ┃             \"excluded\"\n235 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:236:9\n    │\n236 │         require(p.bucket < 3, \"bucket\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:237:28\n    │\n237 │         if (p.bucket == 1) require(p.marketCapUsd < mcapCeiling && p.growthBps > 0, \"riser\");\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:238:28\n    │\n238 │         if (p.bucket == 2) require(block.timestamp - p.launchedAt <= 42 days, \"new age\");\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:258:17\n    │\n258 │                 require(projects[j].token != p.token, \"duplicate project\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:260:24\n    │\n260 │             if (i > 0) require(p.bucket >= projects[i - 1].bucket, \"bucket order\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:262:17\n    │\n262 │                 require(p.medianVolume28d > 0 && p.medianVolume28d <= lastMedian, \"median order\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:266:17\n    │\n266 │                 require(p.growthBps <= lastGrowth, \"growth order\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:276:24\n    │\n276 │         epochStarted = uint64(block.timestamp);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:286:49\n    │\n286 │             orders.push(Order(p, allocation, 0, uint64(block.timestamp), 0));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmFundTreasury.sol:373:31\n    │\n373 │         received = abi.decode(poolManager.unlock(abi.encode(pool, input, amount, minOut)), (uint256));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:301:49\n    │\n301 │             !buysPaused && epochStarted != 0 && block.timestamp < uint256(epochStarted) + 1 days, \"buys unavailable\"\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:305:17\n    │\n305 │         require(block.timestamp >= o.nextAt && o.chunks < 24, \"chunk time\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:322:9\n    │\n322 │         emit Bought(lastRankingDay, o.project.token, o.project.bucket, amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:311:20\n    │\n311 │         o.nextAt = uint64(block.timestamp + 1 hours);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:345:9\n    │\n345 │         emit GraduationStarted(p.token, inventory, dailyAmount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:344:82\n    │\n344 │         graduations[p.token] = Graduation(p.pool.toId(), inventory, dailyAmount, uint64(block.timestamp + 1 days));\n    │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:355:39\n    │\n355 │         require(graduated[p.token] && block.timestamp >= g.nextAt, \"sell time\");\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:364:9\n    │\n364 │         emit Sold(p.token, amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:360:20\n    │\n360 │         g.nextAt = uint64(block.timestamp + 1 days);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:371:27\n    │\n371 │         require(amount <= uint256(uint128(type(int128).max)) && minOut > 0, \"trade size\");\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:371:35\n    │\n371 │         require(amount <= uint256(uint128(type(int128).max)) && minOut > 0, \"trade size\");\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:386:30\n    │\n386 │                 zeroForOne, -int256(amount), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                              ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:392:32\n    │\n392 │         require(inDelta < 0 && uint256(-int256(inDelta)) == amount && outDelta > 0, \"partial/invalid fill\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:393:28\n    │\n393 │         uint256 received = uint256(int256(outDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwarmFundTreasury.sol:402:13\n    │\n402 │             IERC20(Currency.unwrap(output)).balanceOf(address(this)) - beforeBalance == received, \"nonstandard output\"\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\n","passed":true},{"durationMs":670,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Adversarial.t.sol:TreasuryAdversarialTest\n[PASS] test_expiredDenyQueueBlocksWithoutApplyTransaction() (gas: 228816)\n[PASS] test_outputTokenCannotReenterBuy() (gas: 2660273)\n[PASS] test_taxedOutputRevertsEntireTrade() (gas: 2606265)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.62ms (3.54ms CPU time)\n\nRan 4 tests for test/Treasury.t.sol:GovernanceTest\n[PASS] test_flashStakeAndPostSnapshotVotesFail() (gas: 718495)\n[PASS] test_majorityCannotExceedHardCapsOrSkipDenyDelay() (gas: 767883)\n[PASS] test_quorumAndNoArbitraryActions() (gas: 477219)\n[PASS] test_stakeVoteBoundedPolicyAndReturnOnlyOwnSF() (gas: 695255)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.23ms (1.44ms CPU time)\n\nRan 15 tests for test/Treasury.t.sol:TreasuryTest\n[PASS] test_allAdmissionFilters() (gas: 971444)\n[PASS] test_crossTreasuryReplayRejected() (gas: 235432)\n[PASS] test_dailyBucketsHourlyChunksAndHoldRemainder() (gas: 14455958)\n[PASS] test_delayedDenyPauseAndCaps() (gas: 1863391)\n[PASS] test_duplicatesAndRankingOrderRejected() (gas: 752881)\n[PASS] test_graduationNeedsHoldingCeilingAndFreshSignature() (gas: 1847423)\n[PASS] test_graduationOverWeeksAndRecyclingOnlyToNew() (gas: 8412470)\n[PASS] test_invalidSignaturesDomainsFreshnessAndReplay() (gas: 1708879)\n[PASS] test_liquidityCapAndEqualNewAllocation() (gas: 911212)\n[PASS] test_noWithdrawalApprovalOrForgedUnlock() (gas: 173242)\n[PASS] test_offchainEip712GoldenVector() (gas: 38486)\n[PASS] test_signatureFreshAtSubmissionCanExpireDuringExecution() (gas: 1431709)\n[PASS] test_slippageRollsBackChunkAndFunds() (gas: 1369060)\n[PASS] test_snapshotDoesNotSpendFutureFeesAndCannotCatchUp() (gas: 1489266)\n[PASS] test_topFiveLimit() (gas: 5843117)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 27.20ms (36.85ms CPU time)\n\nRan 5 tests for test/Token.t.sol:TokenTest\n[PASS] invariant_fixedSupply() (runs: 64, calls: 2048, reverts: 1400)\n\n╭----------------+--------------+-------+---------+----------╮\n| Contract       | Selector     | Calls | Reverts | Discards |\n+============================================================+\n| SwarmFundToken | approve      | 647   | 8       | 0        |\n|----------------+--------------+-------+---------+----------|\n| SwarmFundToken | transfer     | 702   | 699     | 0        |\n|----------------+--------------+-------+---------+----------|\n| SwarmFundToken | transferFrom | 699   | 693     | 0        |\n╰----------------+--------------+-------+---------+----------╯\n\n[PASS] testFuzz_transferAndAllowance(uint96) (runs: 256, μ: 132382, ~: 132934)\nLogs:\n  Bound result 886502\n\n[PASS] test_failuresAndAbsentAdmin() (gas: 223436)\n[PASS] test_metadataSupplyAndFactorySplit() (gas: 228862)\n[PASS] test_runtimeHasNoEscapeOpcodes() (gas: 833096)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 28.60ms (58.60ms CPU time)\n\nRan 13 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_feeConservation(uint96,bool,bool) (runs: 256, μ: 318290, ~: 317535)\nLogs:\n  Bound result 999999999990002970825\n\n[PASS] test_admissionConstructionAndGuardedInitialization() (gas: 14782655)\n[PASS] test_allFourSwapModes() (gas: 1172069)\n[PASS] test_callbacksRejectNonManagerAndWrongPool() (gas: 184167)\n[PASS] test_freshManagerReverseOrder() (gas: 13353669)\n[PASS] test_freshManagerSingleSidedSameTransactionFee() (gas: 24406046)\n[PASS] test_genericRouterClaimsRedeemOnlyToTreasury() (gas: 25619654)\n[PASS] test_initializationGuardAndFlags() (gas: 59029)\n[PASS] test_liquidityCanBeRemoved() (gas: 146542)\n[PASS] test_ownerCanOnlyReduceFeeWithinCap() (gas: 306476)\n[PASS] test_partialFillAndSlippageFailAtomically() (gas: 414447)\n[PASS] test_reverseCurrencyOrderAllModes() (gas: 14202709)\n[PASS] test_runtimeHasNoEscapeOpcodes() (gas: 3025112)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 29.63ms (89.52ms CPU time)\n\nRan 1 test for test/HookInvariant.t.sol:HookInvariantTest\n[PASS] invariant_feesConservedAndAllDeltasSettled() (runs: 64, calls: 2048, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| SwapHandler | trade    | 2048  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 556.63ms (549.34ms CPU time)\n\nRan 6 test suites in 558.13ms (649.90ms CPU time): 41 tests passed, 0 failed, 0 skipped (41 total tests)\n","passed":true},{"durationMs":9920,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/SwarmSwapRouter.sol:44: SwarmSwapRouter.unlockCallback(bytes) (src/SwarmSwapRouter.sol#44-62) uses arbitrary from in transferFrom: IERC20(Currency.unwrap(inCurrency)).safeTransferFrom(payer,address(manager),uint256(- int256(input))) (src/SwarmSwapRouter.sol#58)\n[high/medium] reentrancy-balance at src/SwarmFundTreasury.sol:377: Reentrancy in SwarmFundTreasury.unlockCallback(bytes) (src/SwarmFundTreasury.sol#377-405):\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:241: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes) (src/SwarmFundTreasury.sol#241-289) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:377: SwarmFundTreasury.unlockCallback(bytes) (src/SwarmFundTreasury.sol#377-405) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:299: SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#299-323) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:299: SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#299-323) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/SwarmFundTreasury.sol:251: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes).counts (src/SwarmFundTreasury.sol#251) is a local variable never initialized\n[medium/medium] unused-return at src/SwarmGovernance.sol:72: SwarmGovernance.unstake(uint256) (src/SwarmGovernance.sol#72-78) ignores return value by checkpoints[msg.sender].push(SafeCast.toUint48(block.number),SafeCast.toUint208(staked[msg.sender])) (src/SwarmGovernance.sol#75)\n[medium/medium] unused-return at src/SwarmGovernance.sol:63: SwarmGovernance.stake(uint256) (src/SwarmGovernance.sol#63-70) ignores return value by checkpoints[msg.sender].push(SafeCast.toUint48(block.number),SafeCast.toUint208(staked[msg.sender])) (src/SwarmGovernance.sol#68)\n[medium/medium] unused-return at src/SwarmFundHook.sol:131: SwarmFundHook.redeemFees() (src/SwarmFundHook.sol#131-136) ignores return value by poolManager.unlock() (src/SwarmFundHook.sol#134)\n[low/medium] missing-zero-check at src/SwarmFundHook.sol:33: SwarmFundHook.constructor(IPoolManager,address,IERC20,address,address).sf (src/SwarmFundHook.sol#33) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:348: Reentrancy in SwarmFundTreasury.executeSell(SwarmFundTreasury.Project,uint64,uint256,bytes) (src/SwarmFundTreasury.sol#348-365):\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:299: Reentrancy in SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#299-323):\n[low/medium] reentrancy-events at src/SwarmFundHook.sol:138: Reentrancy in SwarmFundHook.unlockCallback(bytes) (src/SwarmFundHook.sol#138-148):\n[low/medium] reentrancy-events at src/SwarmFundHook.sol:121: Reentrancy in SwarmFundHook._collect(uint256) (src/SwarmFundHook.sol#121-128):\n[low/medium] timestamp at src/SwarmFundTreasury.sol:227: SwarmFundTreasury._eligible(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#227-239) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:89: SwarmGovernance.vote(uint256,bool) (src/SwarmGovernance.sol#89-102) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmSwapRouter.sol:29: SwarmSwapRouter.swap(PoolKey,SwapParams,uint256,uint256,uint256) (src/SwarmSwapRouter.sol#29-42) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:367: SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#367-375) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:80: SwarmGovernance.propose(SwarmGovernance.Action,uint256,uint256,uint256,address) (src/SwarmGovernance.sol#80-87) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:171: SwarmFundTreasury.applyDeny(address) (src/SwarmFundTreasury.sol#171-176) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:213: SwarmFundTreasury._fresh(uint64) (src/SwarmFundTreasury.sol#213-215) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:104: SwarmGovernance.execute(uint256) (src/SwarmGovernance.sol#104-117) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:299: SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#299-323) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:348: SwarmFundTreasury.executeSell(SwarmFundTreasury.Project,uint64,uint256,bytes) (src/SwarmFundTreasury.sol#348-365) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:241: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes) (src/SwarmFundTreasury.sol#241-289) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:325: SwarmFundTreasury._verifySale(SwarmFundTreasury.Project,uint64,uint256,bytes) (src/SwarmFundTreasury.sol#325-332) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:165: SwarmFundTreasury.queueDeny(address) (src/SwarmFundTreasury.sol#165-169) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:72: SwarmGovernance.unstake(uint256) (src/SwarmGovernance.sol#72-78) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/SwarmSwapRouter.sol:44: SwarmSwapRouter.unlockCallback(bytes) (src/SwarmSwapRouter.sol#44-62) uses arbitrary from in transferFrom: IERC20(Currency.unwrap(inCurrency)).safeTransferFrom(payer,address(manager),uint256(- int256(input))) (src/SwarmSwapRouter.sol#58)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"6d6c96e90bb4c8f4a80d3e03027080da286b315d315a95d2d2685b9d127df9f6","verifiedTreeHash":"612407e4cd4171afa2bb5988919b4028c13bf6c7","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":37892,"exitCode":0,"name":"build","output":"Compiling 100 files with Solc 0.8.26\nSolc 0.8.26 finished in 37.72s\nCompiler run successful!\nwarning[missing-events-access-control]: `expectedCallback` is changed without an event but is used for access control\n   ╭▸ src/SwarmSwapRouter.sol:66:16\n   │\n66 │         delete expectedCallback;\n   │                ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `unlockAt` is changed without an event but is used for access control\n    ╭▸ src/SwarmGovernance.sol:142:9\n    │\n142 │         unlockAt[msg.sender] = block.timestamp + 8 days;\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmSwapRouter.sol:50:31\n   │\n50 │         bytes memory result = manager.unlock(data);\n   │                               ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmSwapRouter.sol:53:28\n   │\n53 │         uint256 redeemed = IFeeRedeemer(hook).redeemFees();\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmSwapRouter.sol:40:17\n   │\n40 │         require(block.timestamp <= deadline && maxInput > 0 && minOutput > 0, \"invalid limits\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/SwarmSwapRouter.sol:54:9\n   │\n54 │         emit Swapped(msg.sender, spent, received, redeemed);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:73:25\n   │\n73 │         uint256 spent = uint256(-int256(input));\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:74:28\n   │\n74 │         uint256 received = uint256(uint128(output));\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmSwapRouter.sol:74:36\n   │\n74 │         uint256 received = uint256(uint128(output));\n   │                                    ━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `expectedCallback` is changed without an event but is used for access control\n    ╭▸ src/SwarmFundTreasury.sol:421:16\n    │\n421 │         delete expectedCallback; // One callback, bound to a checked trade; no payer supplied by calldata.\n    │                ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:105:15\n    │\n105 │             ? uint256(-params.amountSpecified) * bps / 10_000\n    │               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:106:27\n    │\n106 │             : Math.mulDiv(uint256(params.amountSpecified), bps, 10_000 - bps, Math.Rounding.Ceil);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmGovernance.sol:102:17\n    │\n102 │         require(block.timestamp >= unlockAt[msg.sender] && amount > 0, \"stake locked\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmGovernance.sol:137:46\n    │\n137 │             id > 0 && id <= proposalCount && block.timestamp < p.end && !voted[id][msg.sender], \"vote closed\"\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:157:41\n    │\n157 │         if (p.action == Action.Buckets) treasury.setBuckets(uint16(p.a), uint16(p.b), uint16(p.c));\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:158:46\n    │\n158 │         else if (p.action == Action.Ceiling) treasury.setCeiling(p.a);\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmGovernance.sol:159:14\n    │\n159 │         else treasury.queueDeny(p.token);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmGovernance.sol:151:61\n    │\n151 │             id > 0 && id <= proposalCount && !p.executed && block.timestamp >= p.end + 1 days\n    │                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmGovernance.sol:152:20\n    │\n152 │                 && block.timestamp <= p.end + 4 days && p.yes > p.no && p.yes >= p.quorum,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmGovernance.sol:157:61\n    │\n157 │         if (p.action == Action.Buckets) treasury.setBuckets(uint16(p.a), uint16(p.b), uint16(p.c));\n    │                                                             ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmGovernance.sol:157:74\n    │\n157 │         if (p.action == Action.Buckets) treasury.setBuckets(uint16(p.a), uint16(p.b), uint16(p.c));\n    │                                                                          ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmGovernance.sol:157:87\n    │\n157 │         if (p.action == Action.Buckets) treasury.setBuckets(uint16(p.a), uint16(p.b), uint16(p.c));\n    │                                                                                       ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/SwarmFundHook.sol:112:9\n    │\n112 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundHook.sol:147:9\n    │\n147 │         emit HookFee(fee, deferred);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:117:24\n    │\n117 │         require(fee <= uint256(uint128(type(int128).max)), \"fee overflow\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:117:32\n    │\n117 │         require(fee <= uint256(uint128(type(int128).max)), \"fee overflow\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:119:63\n    │\n119 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(uint128(fee)), 0), 0);\n    │                                                               ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:119:70\n    │\n119 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(uint128(fee)), 0), 0);\n    │                                                                      ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/SwarmFundHook.sol:128:28\n    │\n128 │     ) external onlyManager nonReentrant returns (bytes4, int128) {\n    │                            ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:133:56\n    │\n133 │             int256 expected = params.amountSpecified + int256(_specifiedFee(params));\n    │                                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:137:44\n    │\n137 │         uint256 magnitude = imdDelta < 0 ? uint256(-int256(imdDelta)) : uint256(uint128(imdDelta));\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:137:73\n    │\n137 │         uint256 magnitude = imdDelta < 0 ? uint256(-int256(imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:137:81\n    │\n137 │         uint256 magnitude = imdDelta < 0 ? uint256(-int256(imdDelta)) : uint256(uint128(imdDelta));\n    │                                                                                 ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:140:44\n    │\n140 │         return (IHooks.afterSwap.selector, int128(uint128(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:140:51\n    │\n140 │         return (IHooks.afterSwap.selector, int128(uint128(fee)));\n    │                                                   ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/SwarmFundTreasury.sol:148:96\n    │\n148 │     function setBuckets(uint16 leaders, uint16 risers, uint16 newLaunches) external onlyPolicy nonReentrant {\n    │                                                                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmFundHook.sol:155:31\n    │\n155 │         bytes memory result = poolManager.unlock(\"\");\n    │                               ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/SwarmFundTreasury.sol:177:59\n    │\n177 │     function queueDeny(address token) external onlyPolicy nonReentrant {\n    │                                                           ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:185:38\n    │\n185 │         require(denyAt[token] > 0 && block.timestamp >= denyAt[token], \"deny delay\");\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:227:17\n    │\n227 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= FRESHNESS, \"stale oracle\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:227:48\n    │\n227 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= FRESHNESS, \"stale oracle\");\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:246:13\n    │\n246 │             p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"project too young\"\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:246:48\n    │\n246 │             p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"project too young\"\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:254:36\n    │\n254 │         if (p.bucket == 2) require(block.timestamp - p.launchedAt <= 42 days, \"new launch age\");\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:276:32\n    │\n276 │         require(!buysPaused && block.timestamp >= rankingEnd, \"ranking active or paused\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:278:30\n    │\n278 │             day > lastDay && block.timestamp >= uint256(day) * 1 days\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:279:20\n    │\n279 │                 && block.timestamp < (uint256(day) + 1) * 1 days && issuedAt / 1 days <= day,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:235:28\n    │\n235 │         return Math.mulDiv(IERC20(p.token).totalSupply(), p.priceX96, Q96);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:341:9\n    │\n341 │         emit RankingAccepted(day, digest, reserved, rankingStart, rankingEnd);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:239:9\n    │\n239 │ ┏         require(\n240 │ ┃             p.token != address(0) && p.token != sf && p.token != address(imd) && p.token.code.length > 0\n241 │ ┃                 && p.launcher != address(0) && p.launcher != owner && p.imdLaunched && p.admitted\n242 │ ┃                 && !denied[p.token] && !graduated[p.token],\n243 │ ┃             \"ineligible project\"\n244 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:245:9\n    │\n245 │ ┏         require(\n246 │ ┃             p.launchedAt <= block.timestamp && block.timestamp - p.launchedAt >= 14 days, \"project too young\"\n247 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:248:9\n    │\n248 │ ┏         require(\n249 │ ┃             p.bucket < 3 && p.priceX96 > 0 && p.liquidityImd >= minLiquidity && p.fee == 12500\n250 │ ┃                 && p.tickSpacing > 0 && p.tickSpacing <= 32767,\n251 │ ┃             \"invalid market\"\n252 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:253:9\n    │\n253 │         require(marketCap(p) < ceiling, \"ceiling reached\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:254:28\n    │\n254 │         if (p.bucket == 2) require(block.timestamp - p.launchedAt <= 42 days, \"new launch age\");\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:255:33\n    │\n255 │         else if (p.bucket == 0) require(p.medianVolume > 0, \"no median volume\");\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:256:14\n    │\n256 │         else require(p.growth > 0, \"no growth\");\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:292:17\n    │\n292 │                 require(projects[j].token != p.token, \"duplicate project\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:296:17\n    │\n296 │                 require(p.bucket >= prev.bucket, \"bucket order\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:298:21\n    │\n298 │                     require(p.medianVolume <= prev.medianVolume, \"leader order\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:301:21\n    │\n301 │                     require(p.growth <= prev.growth, \"riser order\");\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:264:9\n    │\n264 │         require(price > 0, \"pool not initialized\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:325:13\n    │\n325 │             require(liveDepth >= minLiquidity, \"thin liquidity\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmFundTreasury.sol:410:31\n    │\n410 │         bytes memory result = manager.unlock(data);\n    │                               ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:345:32\n    │\n345 │         require(!buysPaused && block.timestamp < rankingEnd, \"buys closed\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:349:38\n    │\n349 │         require(o.chunks < CHUNKS && block.timestamp >= o.nextAt, \"chunk not due\");\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:366:9\n    │\n366 │         emit Bought(lastDay, o.project.token, amount, received, o.chunks);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:392:17\n    │\n392 │         require(block.timestamp >= sale.nextAt && sale.remaining > 0, \"sale not due\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:390:13\n    │\n390 │             emit GraduationStarted(p.token, balance, sale.tranche);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:403:9\n    │\n403 │         emit Sold(p.token, amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:407:33\n    │\n407 │         require(trade.amount <= uint256(uint128(type(int128).max)), \"amount overflow\");\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:407:41\n    │\n407 │         require(trade.amount <= uint256(uint128(type(int128).max)), \"amount overflow\");\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:428:18\n    │\n428 │                 -int256(trade.amount),\n    │                  ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:436:24\n    │\n436 │         uint256 owed = uint256(-int256(input));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:437:28\n    │\n437 │         uint256 received = uint256(uint128(output));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:437:36\n    │\n437 │         uint256 received = uint256(uint128(output));\n    │                                    ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Treasury.t.sol:167:29\n    │\n167 │         uint64 day = uint64(block.timestamp / 1 days);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n179 │         vm.warp(vm.getBlockTimestamp() + 1 days);\n    │         ──────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":1341,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/GovernanceToken.t.sol:GovernanceTokenTest\n[PASS] testCannotFlashStakeAndCannotExceedPolicyCaps() (gas: 688186)\n[PASS] testFuzzStakingConservesPrincipal(uint96) (runs: 256, μ: 389793, ~: 389731)\nLogs:\n  Bound result 32076252056486882144220\n\n[PASS] testGovernanceDenyHasAdditional24HourDelay() (gas: 740579)\n[PASS] testQuorumDefeatAndExpiry() (gas: 1136667)\n[PASS] testTokenAllowanceAndInsufficientBalances() (gas: 177868)\n[PASS] testTokenFixedSupplyMetadataTransfersAndNoAdmin() (gas: 272033)\n[PASS] testVotesSnapshotAndTimeDelayThenBoundedExecution() (gas: 1140742)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 8.54ms (10.55ms CPU time)\n\nRan 2 tests for test/LaunchPlan.t.sol:LaunchPlanTest\n[PASS] testConfigurationExplicitAndSaltReproducible() (gas: 62775681)\n[PASS] testExactFactoryAllocationConservesBillionSupply() (gas: 4823)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 35.06ms (34.98ms CPU time)\n\nRan 18 tests for test/Treasury.t.sol:TreasuryTest\n[PASS] testCannotSellBeforeCeilingOrUnknownHoldings() (gas: 975377)\n[PASS] testDefaultSharesWhenAllBucketsHaveEnoughProjects() (gas: 17721759)\n[PASS] testDenyDelayPauseAndAlreadyScheduledBuys() (gas: 1218852)\n[PASS] testDuplicatesSortingAndTopFive() (gas: 6593900)\n[PASS] testFiltersCannotBeBypassedBySignedList() (gas: 690035)\n[PASS] testFreshnessBoundaryThenExecutionExpires() (gas: 748306)\n[PASS] testFuzzBudgetNeverExceedsCash(uint96) (runs: 256, μ: 708737, ~: 710570)\nLogs:\n  Bound result 9494\n\n[PASS] testGraduationSellsOverWeeksAndRecyclesToNewBucket() (gas: 7405604)\n[PASS] testMissingKeeperDoesNotCatchUpAndExpiredFundsCarry() (gas: 1041328)\n[PASS] testNoRankingNoSpendAndNoWithdrawSelectors() (gas: 100127)\n[PASS] testOnlyBoundedAdministrativeActions() (gas: 187568)\n[PASS] testProjectTokenCallbackCannotReenterSpending() (gas: 1877401)\n[PASS] testRemovedLiquidityAndBadQuoteRevertAtomically() (gas: 736523)\n[PASS] testRiserPerProjectCapAndEqualNewAllocations() (gas: 3711691)\n[PASS] testSignatureTamperWrongSignerAndDomainRejected() (gas: 188126)\n[PASS] testSignedRankingAnyoneExecutesHourlyWithConservation() (gas: 7472546)\n[PASS] testSlippageFailureDoesNotConsumeBudgetOrChunk() (gas: 729224)\n[PASS] testStaleFutureAndReplayedRankingsRejected() (gas: 637597)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 45.12ms (128.35ms CPU time)\n\nRan 10 tests for test/Hook.t.sol:HookOtherOrderTest\n[PASS] testAllFourSwapModesConserveAndKeepLPFee() (gas: 1668561)\n[PASS] testDeployedCodeHasNoUpgradeOrDestructionOpcodes() (gas: 16769637)\n[PASS] testFeeCapsAndNoUnauthorizedAdmin() (gas: 628732)\n[PASS] testFreshManagerGenericRouterDefersThenAnyoneRedeems() (gas: 551244)\n[PASS] testFreshTokenOnlyManagerPaysTreasuryInSameRouterPath() (gas: 575943)\n[PASS] testFuzzFeeAndConservation(uint96,bool,bool) (runs: 256, μ: 601087, ~: 602306)\nLogs:\n  Bound result 378375278249\n\n[PASS] testInitializationBoundToFactoryPairFeeAndSpacing() (gas: 15070041)\n[PASS] testPermissionsAndUnauthorizedCallbacks() (gas: 155494)\n[PASS] testPriceLimitPartialFillRevertsWithoutTakingFee() (gas: 522059)\n[PASS] testRouterCannotStealAnotherWalletAllowance() (gas: 475929)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 54.30ms (80.84ms CPU time)\n\nRan 10 tests for test/Hook.t.sol:HookTest\n[PASS] testAllFourSwapModesConserveAndKeepLPFee() (gas: 1668355)\n[PASS] testDeployedCodeHasNoUpgradeOrDestructionOpcodes() (gas: 16769637)\n[PASS] testFeeCapsAndNoUnauthorizedAdmin() (gas: 624411)\n[PASS] testFreshManagerGenericRouterDefersThenAnyoneRedeems() (gas: 539802)\n[PASS] testFreshTokenOnlyManagerPaysTreasuryInSameRouterPath() (gas: 565722)\n[PASS] testFuzzFeeAndConservation(uint96,bool,bool) (runs: 256, μ: 600625, ~: 599907)\nLogs:\n  Bound result 100000000\n\n[PASS] testInitializationBoundToFactoryPairFeeAndSpacing() (gas: 117938496)\n[PASS] testPermissionsAndUnauthorizedCallbacks() (gas: 155494)\n[PASS] testPriceLimitPartialFillRevertsWithoutTakingFee() (gas: 516779)\n[PASS] testRouterCannotStealAnotherWalletAllowance() (gas: 476134)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 79.28ms (121.28ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:AccountingInvariantTest\n[PASS] invariantConservationAndNoUnsettledDelta() (runs: 64, calls: 3072, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| SwapHandler | trade    | 3072  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 999999999999900003425\n  Bound result 999999999999900000134\n  Bound result 999999999999911532125\n  Bound result 3568114942485\n  Bound result 8565623815572\n  Bound result 999999999999900006887\n  Bound result 999999999999900820191\n  Bound result 228047019700304002001\n  Bound result 898055628716998993485\n  Bound result 999999999999900012642\n  Bound result 914816931782827154819\n  Bound result 1298301867\n  Bound result 285130420539847\n  Bound result 999999999999900007592\n  Bound result 999999999999900003002\n  Bound result 100000000\n  Bound result 999999999999900007641\n  Bound result 999999999999900000581\n  Bound result 999999999999900004484\n  Bound result 999999999999909583440\n  Bound result 269747978049488328747\n  Bound result 999999999999900004902\n  Bound result 258158516\n  Bound result 999999999999900007395\n  Bound result 999999999999900001494\n  Bound result 999999999999900003883\n  Bound result 999999999999900002854\n  Bound result 999999999999900003797\n  Bound result 999999999999900016466\n  Bound result 999999999999981008941\n  Bound result 18142438630435113039\n  Bound result 999999999999900005657\n  Bound result 999999999999900001268\n  Bound result 3858947844\n  Bound result 999999999999900000638\n  Bound result 999999999999900014714\n  Bound result 3386014462\n  Bound result 999999999999900003110\n  Bound result 999999999999900011100\n  Bound result 999999999999900003502\n  Bound result 4131778271\n  Bound result 2090626703\n  Bound result 577759402769567529708\n  Bound result 999999999999900000206\n  Bound result 999999999999900011536\n  Bound result 999999999999900008379\n  Bound result 171312476311\n  Bound result 999999999999900003435\n  Bound result 999999999999900001110\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.23s (1.20s CPU time)\n\nRan 6 test suites in 1.23s (1.45s CPU time): 48 tests passed, 0 failed, 0 skipped (48 total tests)\n","passed":true},{"durationMs":10317,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:344: SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#344-367) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:406: SwarmFundTreasury._trade(SwarmFundTreasury.Trade) (src/SwarmFundTreasury.sol#406-413) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:370: SwarmFundTreasury.executeSell(SwarmFundTreasury.Project,uint64,bytes) (src/SwarmFundTreasury.sol#370-404) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmGovernance.sol:66: SwarmGovernance._checkpoint(SwarmGovernance.Checkpoint[],uint256) (src/SwarmGovernance.sol#66-72) uses a dangerous strict equality:\n[medium/medium] unused-return at src/SwarmFundTreasury.sol:261: SwarmFundTreasury.depth(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#261-270) ignores return value by (price,None,None,None) = manager.getSlot0(key.toId()) (src/SwarmFundTreasury.sol#263)\n[low/medium] calls-loop at src/SwarmFundTreasury.sol:234: SwarmFundTreasury.marketCap(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#234-236) has external calls inside a loop: Math.mulDiv(IERC20(p.token).totalSupply(),p.priceX96,Q96) (src/SwarmFundTreasury.sol#235)\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:370: Reentrancy in SwarmFundTreasury.executeSell(SwarmFundTreasury.Project,uint64,bytes) (src/SwarmFundTreasury.sol#370-404):\n[low/medium] timestamp at src/SwarmSwapRouter.sol:32: SwarmSwapRouter.swap(PoolKey,SwapParams,uint256,uint256,uint256) (src/SwarmSwapRouter.sol#32-58) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:370: SwarmFundTreasury.executeSell(SwarmFundTreasury.Project,uint64,bytes) (src/SwarmFundTreasury.sol#370-404) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:134: SwarmGovernance.vote(uint256,bool) (src/SwarmGovernance.sol#134-146) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:272: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes) (src/SwarmFundTreasury.sol#272-342) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:226: SwarmFundTreasury._fresh(uint64) (src/SwarmFundTreasury.sol#226-228) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:415: SwarmFundTreasury.unlockCallback(bytes) (src/SwarmFundTreasury.sol#415-447) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:238: SwarmFundTreasury._eligible(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#238-257) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:148: SwarmGovernance.execute(uint256) (src/SwarmGovernance.sol#148-160) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:184: SwarmFundTreasury.applyDeny(address) (src/SwarmFundTreasury.sol#184-189) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:406: SwarmFundTreasury._trade(SwarmFundTreasury.Trade) (src/SwarmFundTreasury.sol#406-413) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:261: SwarmFundTreasury.depth(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#261-270) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:101: SwarmGovernance.unstake(uint256) (src/SwarmGovernance.sol#101-109) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:199: SwarmFundTreasury.poolKey(SwarmFundTreasury.Project) (src/SwarmFundTreasury.sol#199-202) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:344: SwarmFundTreasury.executeBuy(uint256) (src/SwarmFundTreasury.sol#344-367) uses timestamp for comparisons","passed":true},{"durationMs":753,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SwarmFundTreasury.sol:306: Reentrancy: State change after external call (2 places)\n[high] storage-array-memory-edit at src/SwarmFundTreasury.sol:348: Storage Array Edited with Memory (3 places)\n[high] unsafe-casting at src/SwarmFundHook.sol:140: Unsafe Casting of integers\n[low] costly-loop at src/SwarmFundTreasury.sol:322: Costly operations inside loop\n[low] large-numeric-literal at src/SwarmFundHook.sol:105: Large Numeric Literal (18 places)\n[low] literal-instead-of-constant at src/SwarmFundHook.sol:105: Literal Instead of Constant (29 places)\n[low] non-reentrant-not-first at src/SwarmFundHook.sol:112: `nonReentrant` is Not the First Modifier (4 places)\n[low] require-revert-in-loop at src/SwarmFundTreasury.sol:287: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/SwarmFundHook.sol:67: State Change Without Event (4 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.constructorArgs.5: Invalid input: expected string, received number; pool.pairedCurrency: expected a lowercase EVM address; pool.initialPrice: expected a decimal uint256; pool.initialPrice: uint256 overflow","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"a359ff4563f5ab2511eb2077252f14c9e0a2d1d6c37b00f493d8adc96df002ff","verifiedTreeHash":"5a9b1a87c784b8248ebfa40c4e8fea9541039995","verifierVersion":"0.1.0+a2d9a899"},{"checks":[{"durationMs":34698,"exitCode":0,"name":"build","output":"Compiling 103 files with Solc 0.8.26\nSolc 0.8.26 finished in 34.55s\nCompiler run successful!\nwarning[missing-events-access-control]: `stakeOf` is changed without an event but is used for access control\n   ╭▸ src/SwarmGovernance.sol:59:9\n   │\n59 │         stakeOf[msg.sender] -= amount;\n   │         ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/SwarmFundHook.sol:29:9\n   │\n29 │         address launchToken,\n   │         ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:52:13\n   │\n52 │         if (until > unlockAt[msg.sender]) unlockAt[msg.sender] = until;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:58:17\n   │\n58 │         require(block.timestamp >= unlockAt[msg.sender] && amount != 0, \"locked\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmGovernance.sol:71:22\n   │\n71 │             Proposal(uint64(block.timestamp + 3 days), 0, 0, false, denyToken, leaders, risers, launches, ceiling);\n   │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:77:17\n   │\n77 │         require(p.end > block.timestamp && !voted[id][msg.sender], \"closed or voted\");\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmGovernance.sol:93:40\n   │\n93 │         if (p.denyToken != address(0)) treasury.governanceDeny(p.denyToken);\n   │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/SwarmGovernance.sol:94:14\n   │\n94 │         else treasury.governancePolicy(p.leaders, p.risers, p.launches, p.ceiling);\n   │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SwarmGovernance.sol:90:31\n   │\n90 │         require(p.end != 0 && block.timestamp >= uint256(p.end) + 1 days && !p.executed, \"not executable\");\n   │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/SwarmGovernance.sol:95:9\n   │\n95 │         emit Executed(id);\n   │         ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `inUnlock` is changed without an event but is used for access control\n    ╭▸ src/SwarmFundTreasury.sol:458:9\n    │\n458 │         inUnlock = false;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SwarmFundTreasury.sol:114:9\n    │\n114 │         address token,\n    │         ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:77:28\n   │\n77 │         uint256 absolute = uint256(amount < 0 ? -amount : amount);\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:78:29\n   │\n78 │         require(absolute <= uint256(uint128(type(int128).max)) / 2, \"amount too large\");\n   │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:78:37\n   │\n78 │         require(absolute <= uint256(uint128(type(int128).max)) / 2, \"amount too large\");\n   │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:91:63\n   │\n91 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                               ━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmFundHook.sol:91:70\n   │\n91 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n   │                                                                      ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundHook.sol:116:13\n    │\n116 │             emit HookFee(fee, claim);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:101:28\n    │\n101 │         uint256 absolute = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:108:66\n    │\n108 │             require(int256(imdDelta) == params.amountSpecified + int256(fee), \"partial IMD fill\");\n    │                                                                  ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:118:68\n    │\n118 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(fee)));\n    │                                                                    ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundHook.sol:118:75\n    │\n118 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(fee)));\n    │                                                                           ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:193:42\n    │\n193 │         require(denyAfter[token] != 0 && block.timestamp >= denyAfter[token], \"deny delay\");\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:200:59\n    │\n200 │         return denied[token] || (denyAfter[token] != 0 && block.timestamp >= denyAfter[token]);\n    │                                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:240:17\n    │\n240 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= MAX_AGE, \"stale report\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:240:48\n    │\n240 │         require(issuedAt <= block.timestamp && block.timestamp - issuedAt <= MAX_AGE, \"stale report\");\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:250:17\n    │\n250 │         require(uint256(p.launchedAt) + 14 days <= block.timestamp && p.launchedAt != 0, \"project too young\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:272:40\n    │\n272 │             if (p.bucket == 2) require(block.timestamp <= uint256(p.launchedAt) + 42 days, \"new age\");\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SwarmFundTreasury.sol:328:13\n    │\n328 │             added += amount;\n    │             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:280:32\n    │\n280 │         require(!buysPaused && day == block.timestamp / 1 days && !submitted[day], \"day or paused\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:284:17\n    │\n284 │         require(block.timestamp - issuedAt <= 12 hours, \"insufficient freshness for TWAP\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:329:13\n    │\n329 │             emit OrderCreated(day, p.token, p.bucket, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:332:9\n    │\n332 │         emit RankingAccepted(day, digest, issuedAt, available, added);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:248:9\n    │\n248 │         require(p.token.code.length > 0 && p.token != sf && p.token != address(imd), \"bad project\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:249:9\n    │\n249 │         require(p.imdLaunched && p.admitted && p.launcher != address(0) && p.launcher != owner, \"admission or launcher\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:250:9\n    │\n250 │         require(uint256(p.launchedAt) + 14 days <= block.timestamp && p.launchedAt != 0, \"project too young\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:251:9\n    │\n251 │ ┏         require(\n252 │ ┃             p.liquidityImd >= minLiquidityImd && p.liquidityImd <= type(uint128).max && p.twapPriceX96 != 0\n253 │ ┃                 && p.twapPriceX96 <= 1e50,\n254 │ ┃             \"liquidity or price\"\n255 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:258:9\n    │\n258 │ ┏         require(\n259 │ ┃             c0 < c1 && ((c0 == address(imd) && c1 == p.token) || (c1 == address(imd) && c0 == p.token)),\n260 │ ┃             \"IMD pair required\"\n261 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:262:9\n    │\n262 │         require(p.pool.fee == 12500 && p.pool.tickSpacing > 0, \"pool policy\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:264:13\n    │\n264 │ ┏             require(\n265 │ ┃                 !isDenied(p.token) && graduations[p.token].started == 0 && p.mcapUsdE6 < mcapCeiling\n266 │ ┃                     && p.mcapUsdE6 != 0,\n267 │ ┃                 \"buy excluded\"\n268 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:269:13\n    │\n269 │             require(p.bucket <= 2, \"bucket\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:270:32\n    │\n270 │             if (p.bucket == 0) require(p.volumeRank > 0 && p.volumeRank <= 5 && p.medianVolume28d > 0, \"leader rank\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:271:32\n    │\n271 │             if (p.bucket == 1) require(p.growthBps > 0, \"riser growth\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:272:32\n    │\n272 │             if (p.bucket == 2) require(block.timestamp <= uint256(p.launchedAt) + 42 days, \"new age\");\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:294:17\n    │\n294 │                 require(projects[j].token != p.token, \"duplicate project\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:296:24\n    │\n296 │             if (i > 0) require(p.bucket >= projects[i - 1].bucket, \"bucket order\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:299:17\n    │\n299 │                 require(p.volumeRank == counts[0] && p.medianVolume28d <= previousVolume, \"median order\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/SwarmFundTreasury.sol:303:17\n    │\n303 │                 require(p.growthBps <= previousGrowth, \"growth order\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:326:45\n    │\n326 │             orders[day][p.token] = Order(p, uint64(block.timestamp), issuedAt, 0, amount, 0, recycled, false);\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmFundTreasury.sol:440:9\n    │\n440 │         manager.unlock(abi.encode(uint8(1), key, zeroForOne, amount, minimum));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:349:13\n    │\n349 │             block.timestamp >= uint256(o.start) + (uint256(o.chunks) + 1) * 1 hours\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:350:20\n    │\n350 │                 && block.timestamp <= uint256(o.start) + 30 hours,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:353:17\n    │\n353 │         require(block.timestamp >= lastBuyAt[token] + 1 hours, \"buy cooldown\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:355:13\n    │\n355 │         if (block.timestamp >= buyWindowStart[token] + 1 days) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:371:9\n    │\n371 │         emit Bought(day, token, amount, received, o.chunks);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:378:13\n    │\n378 │             block.timestamp > uint256(o.start) + 30 hours || block.timestamp > uint256(o.issuedAt) + MAX_AGE\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:378:62\n    │\n378 │             block.timestamp > uint256(o.start) + 30 hours || block.timestamp > uint256(o.issuedAt) + MAX_AGE\n    │                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:398:9\n    │\n398 │         emit GraduationStarted(p.token, balance, p.mcapUsdE6);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:397:73\n    │\n397 │         graduations[p.token] = Graduation(PoolId.unwrap(p.pool.toId()), uint64(block.timestamp), 0, 0, balance, 0);\n    │                                                                         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:414:13\n    │\n414 │             block.timestamp >= uint256(g.started) + (uint256(g.chunks) + 1) * 1 days\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmFundTreasury.sol:415:20\n    │\n415 │                 && block.timestamp >= uint256(g.lastSell) + 1 days,\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:430:9\n    │\n430 │         emit Sold(p.token, amount, received, g.chunks);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:424:22\n    │\n424 │         g.lastSell = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:434:27\n    │\n434 │         require(amount <= uint256(uint128(type(int128).max)) && minimum > 0, \"trade bounds\");\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:434:35\n    │\n434 │         require(amount <= uint256(uint128(type(int128).max)) && minimum > 0, \"trade bounds\");\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwarmFundTreasury.sol:440:9\n    │\n440 │         manager.unlock(abi.encode(uint8(1), key, zeroForOne, amount, minimum));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SwarmFundTreasury.sol:442:17\n    │\n442 │         require(beforeIn - IERC20(input).balanceOf(address(this)) == amount, \"input mismatch\");\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmFundTreasury.sol:451:9\n    │\n451 │         manager.unlock(abi.encode(uint8(0), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmFundTreasury.sol:453:9\n    │\n453 │         emit ClaimsRedeemed(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwarmFundTreasury.sol:451:9\n    │\n451 │         manager.unlock(abi.encode(uint8(0), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:470:34\n    │\n470 │                     zeroForOne, -int256(amount), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1\n    │                                  ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:477:40\n    │\n477 │                 int256(inputDelta) == -int256(amount) && outputDelta > 0 && uint128(outputDelta) >= minimum,\n    │                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:477:77\n    │\n477 │                 int256(inputDelta) == -int256(amount) && outputDelta > 0 && uint128(outputDelta) >= minimum,\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SwarmFundTreasury.sol:483:13\n    │\n483 │             manager.settle();\n    │             ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmFundTreasury.sol:484:85\n    │\n484 │             manager.take(zeroForOne ? key.currency1 : key.currency0, address(this), uint128(outputDelta));\n    │                                                                                     ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n    ╭▸ test/Treasury.t.sol:161:33\n    │\n161 │         uint256 originalChain = block.chainid;\n    │                                 ━━━━━━━━━━━━━\n162 │         vm.chainId(2);\n    │         ───────────── `vm.chainId` changes this environment here\n    │\n    ├ help: capture it with `vm.getChainId()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":588,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_manipulatedPoolCannotBypassSignedMinimumOutput() (gas: 1815716)\n[PASS] test_offchainProjectHashMatchesPublishedVector() (gas: 12097)\n[PASS] test_outputTokenCannotReenterBuyAndSpendAnotherChunk() (gas: 2201987)\n[PASS] test_rankingAt12HoursAllowsLastChunkAt36Hours() (gas: 6024506)\n[PASS] test_reservedCashCannotBeBudgetedAgainNextDay() (gas: 1924246)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.32ms (13.24ms CPU time)\n\nRan 2 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_configurationCannotSilentlyUseMissingValues() (gas: 421003)\n[PASS] test_prepareAndRealCreate2Initialization() (gas: 16932819)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.83ms (9.53ms CPU time)\n\nRan 18 tests for test/Treasury.t.sol:TreasuryTest\n[PASS] testFuzz_bucketHardCaps(uint16,uint16,uint16) (runs: 256, μ: 31193, ~: 31191)\n[PASS] test_28DayGraduationAndRecyclingOnlyNewBucket() (gas: 12325333)\n[PASS] test_duplicateMisorderedAndFalseLeadersRejected() (gas: 4216162)\n[PASS] test_exact24HourlyBuysAndBudgetConservation() (gas: 6748279)\n[PASS] test_filtersRejectAdmissionLauncherAgeLiquidityPairCeiling() (gas: 1543968)\n[PASS] test_futureAndStaleRankingAndStaleExecution() (gas: 1718729)\n[PASS] test_governanceAndOwnerCannotExceedPowers() (gas: 133397)\n[PASS] test_governanceDenyStillWaits24HoursAndNoQuorumFails() (gas: 686643)\n[PASS] test_governanceStakeVoteDelayCapsAndReturnPrincipalOnly() (gas: 850827)\n[PASS] test_graduationNeedsFreshCeilingProofAndHolding() (gas: 1296133)\n[PASS] test_minimumLiquidityCapsBudgetAndLateCallsCannotBatchChunks() (gas: 1851055)\n[PASS] test_noRankingNoBuysAndNoWithdrawalSelectors() (gas: 179206)\n[PASS] test_ownerDelayAndPermissionlessActivationEnforcedAtExecution() (gas: 2030777)\n[PASS] test_pauseOnlyNewBuysAndReleaseReservations() (gas: 1616395)\n[PASS] test_replayAndWrongDay() (gas: 1543450)\n[PASS] test_signaturesBindDomainChainAndEveryField() (gas: 1122856)\n[PASS] test_signedRankingReservesDefaultBucketsAndCap() (gas: 9122762)\n[PASS] test_slippageFailureRollsBackReservationAndTiming() (gas: 1759829)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 24.81ms (50.34ms CPU time)\n\nRan 12 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_feeConservation(bool,bool,uint96) (runs: 256, μ: 561053, ~: 562330)\nLogs:\n  Bound result 46196807197718776306\n\n[PASS] test_allEnabledCallbacksRejectForgedCalls() (gas: 141346)\n[PASS] test_allFourSwapQuadrantsAndUnwind() (gas: 1409941)\n[PASS] test_constructorRejectsWrongFlags() (gas: 11205)\n[PASS] test_initRefusesWrongFactoryPairFeeAndRepeatedPool() (gas: 5173450)\n[PASS] test_partialSpecifiedFillRevertsWithoutCharging() (gas: 412454)\n[PASS] test_partialUnspecifiedFillChargesActualNotional() (gas: 479391)\n[PASS] test_permissionsAndRuntime() (gas: 11065880)\n[PASS] test_reverseCurrencyOrderAllQuadrants() (gas: 6598711)\n[PASS] test_singleSidedFreshManagerCreditsTreasuryClaimsAndRedeems() (gas: 602664)\n[PASS] test_tokenSupplyTransferAllowanceAndNoAdmin() (gas: 381176)\n[PASS] test_zeroFeeIsBoundedOwnerChoiceAndLPFeeRemains() (gas: 535034)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 30.03ms (55.65ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_cashCoversAllReservedBuys\n[PASS] invariant_noTreasuryValueLeavesExceptBuys\n[PASS] invariant_reservationsEqualOutstandingOrders\n TreasuryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| TreasuryHandler | step     | 2048  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 3598\n  Bound result 1508384136\n  Bound result 6\n  Bound result 4546467194908184932\n  Bound result 512\n  Bound result 1478\n  Bound result 50\n  Bound result 3474\n  Bound result 6906\n  Bound result 2654\n  Bound result 123\n  Bound result 2310\n  Bound result 992\n  Bound result 316\n  Bound result 50\n  Bound result 10654\n  Bound result 5976\n  Bound result 3278\n  Bound result 5823\n  Bound result 469\n  Bound result 5122\n  Bound result 3596016987350223268\n  Bound result 1\n  Bound result 9249063312210432939\n  Bound result 7200\n  Bound result 11602\n  Bound result 200\n  Bound result 2830\n  Bound result 4684\n  Bound result 526231476\n  Bound result 1566\n  Bound result 2896\n  Bound result 4986\n  Bound result 2957397979\n  Bound result 1432\n  Bound result 7391547496503495814\n  Bound result 240\n  Bound result 2811\n  Bound result 2668\n  Bound result 2421167555903685668\n  Bound result 2668\n  Bound result 7302\n  Bound result 1694\n  Bound result 53672404\n  Bound result 1983\n  Bound result 576460752303423488\n  Bound result 781\n  Bound result 668\n  Bound result 6473\n  Bound result 7889\n  Bound result 2320\n  Bound result 955\n  Bound result 300\n  Bound result 534\n  Bound result 32\n  Bound result 11905\n  Bound result 5952\n  Bound result 22817595\n  Bound result 2149\n  Bound result 14687\n  Bound result 5010\n  Bound result 1107\n  Bound result 856\n  Bound result 3223057859686233903\n  Bound result 5952\n  Bound result 7780723304225194222\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 472.79ms (470.79ms CPU time)\n\nRan 5 test suites in 476.39ms (544.79ms CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SwarmFundHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SwarmFundHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"SwarmFundToken.approve(address,uint256)\",\"SwarmFundToken.transfer(address,uint256)\",\"SwarmFundToken.transferFrom(address,address,uint256)\",\"SwarmFundTreasury.activateDeny(address)\",\"SwarmFundTreasury.closeOrder(uint64,address)\",\"SwarmFundTreasury.executeBuy(uint64,address)\",\"SwarmFundTreasury.executeSell(uint64,(address,address,uint64,bool,bool,uint8,uint8,uint256,uint256,uint256,uint256,uint256,(address,address,uint24,int24,address)),bytes)\",\"SwarmFundTreasury.governanceDeny(address)\",\"SwarmFundTreasury.governancePolicy(uint16,uint16,uint16,uint256)\",\"SwarmFundTreasury.pauseBuys(bool)\",\"SwarmFundTreasury.queueDeny(address)\",\"SwarmFundTreasury.redeemClaims()\",\"SwarmFundTreasury.setBuckets(uint16,uint16,uint16)\",\"SwarmFundTreasury.setFee(uint16)\",\"SwarmFundTreasury.startGraduation(uint64,(address,address,uint64,bool,bool,uint8,uint8,uint256,uint256,uint256,uint256,uint256,(address,address,uint24,int24,address)),bytes)\",\"SwarmFundTreasury.submitRanking(uint64,uint64,(address,address,uint64,bool,bool,uint8,uint8,uint256,uint256,uint256,uint256,uint256,(address,address,uint24,int24,address))[],bytes)\",\"SwarmFundTreasury.unlockCallback(bytes)\",\"SwarmGovernance.execute(uint256)\",\"SwarmGovernance.propose(uint16,uint16,uint16,uint256,address)\",\"SwarmGovernance.stake(uint256)\",\"SwarmGovernance.unstake(uint256)\",\"SwarmGovernance.vote(uint256,bool)\"],\"files\":{\".gitignore\":5,\"LICENSE\":21,\"README.md\":94,\"dashboard/app.js\":46,\"dashboard/audit.html\":1,\"dashboard/config.json\":12,\"dashboard/index.html\":22,\"dashboard/style.css\":1,\"dashboard/treasury-abi.json\":1,\"dashboard/vendor/ethers.LICENSE.md\":21,\"dashboard/vendor/ethers.js\":1,\"dependencies.lock.json\":33,\"dist/dashboard-release.json\":8,\"dist/swarm-fund.car\":132,\"docs/AUDIT.md\":51,\"docs/OPERATIONS.md\":84,\"docs/verification.json\":29,\"foundry.toml\":23,\"launch.json\":27,\"package.json\":1,\"script/PrepareLaunch.s.sol\":47,\"src/HookFlags.sol\":30,\"src/SwarmFundHook.sol\":120,\"src/SwarmFundToken.sol\":11,\"src/SwarmFundTreasury.sol\":488,\"src/SwarmGovernance.sol\":97,\"test/Adversarial.t.sol\":99,\"test/Hook.t.sol\":249,\"test/Invariant.t.sol\":75,\"test/Launch.t.sol\":64,\"test/Treasury.t.sol\":427,\"test/mocks/MockERC20.sol\":13,\"test/mocks/PoolActor.sol\":46,\"test/mocks/ReentrantToken.sol\":30,\"tools/build_dashboard.py\":86,\"tools/dashboard.test.mjs\":18,\"tools/mine.mjs\":10,\"tools/ranking.mjs\":58,\"tools/ranking.test.mjs\":17,\"tools/test_dashboard_pack.py\":42},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":10570,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/SwarmFundTreasury.sol:433: Reentrancy in SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#433-445):\n[high/medium] reentrancy-balance at src/SwarmFundTreasury.sol:433: Reentrancy in SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#433-445):\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:186: SwarmFundTreasury._queueDeny(address) (src/SwarmFundTreasury.sol#186-190) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:276: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes) (src/SwarmFundTreasury.sol#276-333) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmFundTreasury.sol:433: SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#433-445) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/SwarmFundTreasury.sol:316: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes).added (src/SwarmFundTreasury.sol#316) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SwarmFundTreasury.sol:287: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes).counts (src/SwarmFundTreasury.sol#287) is a local variable never initialized\n[medium/medium] unused-return at src/SwarmFundTreasury.sol:447: SwarmFundTreasury.redeemClaims() (src/SwarmFundTreasury.sol#447-454) ignores return value by manager.unlock(abi.encode(uint8(0),amount)) (src/SwarmFundTreasury.sol#451)\n[medium/medium] unused-return at src/SwarmFundTreasury.sol:456: SwarmFundTreasury.unlockCallback(bytes) (src/SwarmFundTreasury.sol#456-487) ignores return value by manager.settle() (src/SwarmFundTreasury.sol#483)\n[medium/medium] unused-return at src/SwarmFundTreasury.sol:433: SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#433-445) ignores return value by manager.unlock(abi.encode(uint8(1),key,zeroForOne,amount,minimum)) (src/SwarmFundTreasury.sol#440)\n[low/medium] missing-zero-check at src/SwarmFundHook.sol:29: SwarmFundHook.constructor(IPoolManager,address,IERC20,address,address,uint256).launchToken (src/SwarmFundHook.sol#29) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:447: Reentrancy in SwarmFundTreasury.redeemClaims() (src/SwarmFundTreasury.sol#447-454):\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:401: Reentrancy in SwarmFundTreasury.executeSell(uint64,SwarmFundTreasury.Project,bytes) (src/SwarmFundTreasury.sol#401-431):\n[low/medium] reentrancy-benign at src/SwarmFundTreasury.sol:433: Reentrancy in SwarmFundTreasury._trade(PoolKey,address,uint256,uint256) (src/SwarmFundTreasury.sol#433-445):\n[low/medium] reentrancy-events at src/SwarmFundHook.sol:94: Reentrancy in SwarmFundHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SwarmFundHook.sol#94-119):\n[low/medium] timestamp at src/SwarmFundTreasury.sol:343: SwarmFundTreasury.executeBuy(uint64,address) (src/SwarmFundTreasury.sol#343-372) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:401: SwarmFundTreasury.executeSell(uint64,SwarmFundTreasury.Project,bytes) (src/SwarmFundTreasury.sol#401-431) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:186: SwarmFundTreasury._queueDeny(address) (src/SwarmFundTreasury.sol#186-190) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:247: SwarmFundTreasury._eligible(SwarmFundTreasury.Project,bool) (src/SwarmFundTreasury.sol#247-274) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:390: SwarmFundTreasury.startGraduation(uint64,SwarmFundTreasury.Project,bytes) (src/SwarmFundTreasury.sol#390-399) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:192: SwarmFundTreasury.activateDeny(address) (src/SwarmFundTreasury.sol#192-197) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:75: SwarmGovernance.vote(uint256,bool) (src/SwarmGovernance.sol#75-86) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:199: SwarmFundTreasury.isDenied(address) (src/SwarmFundTreasury.sol#199-201) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:57: SwarmGovernance.unstake(uint256) (src/SwarmGovernance.sol#57-62) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:48: SwarmGovernance.stake(uint256) (src/SwarmGovernance.sol#48-55) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:276: SwarmFundTreasury.submitRanking(uint64,uint64,SwarmFundTreasury.Project[],bytes) (src/SwarmFundTreasury.sol#276-333) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmGovernance.sol:88: SwarmGovernance.execute(uint256) (src/SwarmGovernance.sol#88-96) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:239: SwarmFundTreasury._fresh(uint64) (src/SwarmFundTreasury.sol#239-241) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmFundTreasury.sol:374: SwarmFundTreasury.closeOrder(uint64,address) (src/SwarmFundTreasury.sol#374-388) uses timestamp for comparisons","passed":true},{"durationMs":685,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SwarmFundTreasury.sol:307: Reentrancy: State change after external call (4 places)\n[high] storage-array-memory-edit at src/SwarmFundTreasury.sol:347: Storage Array Edited with Memory (2 places)\n[low] centralization-risk at src/SwarmFundTreasury.sol:144: Centralization Risk (4 places)\n[low] costly-loop at src/SwarmFundTreasury.sol:317: Costly operations inside loop\n[low] internal-function-used-once at src/HookFlags.sol:23: Internal Function Used Only Once\n[low] large-numeric-literal at src/SwarmFundHook.sol:80: Large Numeric Literal (14 places)\n[low] literal-instead-of-constant at src/SwarmFundHook.sol:80: Literal Instead of Constant (22 places)\n[low] require-revert-in-loop at src/SwarmFundTreasury.sol:290: Loop Contains `require`/`revert` (2 places)\n[low] state-change-without-event at src/SwarmFundHook.sol:55: State Change Without Event (2 places)\n[low] unchecked-return at src/SwarmFundTreasury.sol:440: Unchecked Return (3 places)\n[low] uninitialized-local-variable at src/SwarmFundTreasury.sol:287: Uninitialized Local Variable (4 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.contract: expected a contract name; hook.permissions: Invalid input: expected array, received object; token.contract: expected a contract name; pool.pairedCurrency: Invalid input: expected string, received undefined; pool.initialPrice: Invalid input: expected string, received undefined; notes: Invalid input: expected string, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"fcd8632ba278c3a21112e15bb2f7aec67a35d3f71dfda2558d19996a2ff9eba0","verifiedTreeHash":"135595e87c5ee576e53488000e89204ab8f616d6","verifierVersion":"0.1.0+be003835"}]}