{"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":"a0a5fc7b-eae1-4e67-b562-e2034a18c2a1","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":"Build and autonomously launch a token called IMD FLYWHEEL ($FLYWHEEL) using the standard IMD swarm launch workflow and infrastructure.\n\nFIRST inspect current IMD token-launch examples/infrastructure and reuse the existing launch/factory/manifest/deployment system wherever possible. The primary market MUST be FLYWHEEL/IMD on Uniswap v4, not FLYWHEEL/ETH.\n\nTOKEN:\n- Name: IMD FLYWHEEL\n- Symbol: FLYWHEEL\n- Fixed ERC-20 supply\n- No minting after launch\n- No staking, reflections, burns, buybacks, jackpot, lottery, holding rewards, inflation or extra tokenomics.\n\nLIQUIDITY:\nUse the normal IMD swarm launch liquidity mechanism. Creator provides NO separate liquidity and NO reward-pool funding.\nInitial Reward Pool = 0 IMD.\n\nSELL:\nWhen FLYWHEEL is sold for IMD:\n- Seller receives 90% of the normal IMD output.\n- 10% of the normal IMD output goes to an IMD Reward Pool.\nThis is the only sell-side mechanism.\n\nBUY:\nWhen buying FLYWHEEL with IMD, provide a dynamic IMD-funded bonus:\n- Maximum = 5%\n- Empty Reward Pool = 0%\n- Bonus increases as Reward Pool health improves.\n- Base bonus should use smoothed recent buy demand, conceptually:\n  5% × min(1, RewardPool / (3 × smoothedBuyDemand))\n- Large buys must receive a lower percentage bonus so one whale cannot drain the pool.\n- Also enforce a hard maximum reward of 0.25% of the current Reward Pool per transaction.\n- Never pay more IMD than actually exists in the Reward Pool.\n- Larger buys may receive larger absolute rewards, but never disproportionate rewards.\n\nECONOMICS:\nAt 5% bonus, 10% sell contribution means theoretical sustainability when:\nSell Volume >= 50% of Buy Volume.\n\nThe design must make immediate buy→sell farming negative because the maximum buy benefit is 5% while sells contribute 10%.\n\nSECURITY/TESTING:\nUse Foundry and the swarm's normal testing/audit workflow.\nTest/fuzz/invariant-test:\n- whale buys\n- split whale buys\n- buy/sell loops\n- wash trading\n- flash-loan manipulation\n- Reward Pool depletion/recovery\n- volume/EMA manipulation\n- rounding/dust attacks\n- reentrancy\n- Uniswap v4 hook/accounting attacks\n- exact-input and exact-output swaps.\n\nRequired invariants:\n- FLYWHEEL total supply never changes.\n- Bonus <= 5%.\n- Reward Pool never goes negative.\n- Rewards never exceed available IMD.\n- Seller receives 90% of normal IMD output.\n- 10% goes to Reward Pool.\n- No unauthorized Reward Pool withdrawal.\n- No critical security vulnerability.\n\nCreate the token, Reward Vault, Uniswap v4 hook, pool configuration, deployment scripts, tests, launch manifest and required documentation using the existing IMD swarm conventions.\n\nAUTONOMOUS EXECUTION:\nDo NOT wait for human approval between swarm stages.\nRun the normal IMD workflow: build → integrate → test → audit/review → manifest → verify → publish → deploy/onchain.\n\nIf all required security/verification gates pass, deploy automatically.\nIf a critical vulnerability or infrastructure blocker remains, do not deploy; report the exact blocker.\n\nAfter deployment report:\n- FLYWHEEL address\n- Reward Vault address\n- Hook address\n- FLYWHEEL/IMD Pool ID\n- chain\n- total supply\n- initial liquidity\n- initial Reward Pool\n- pool configuration\n- final reward parameters\n- deployment/onchain transaction hashes\n- test/audit results.\n\nDo not add any mechanics beyond this specification.","parentJobId":null,"planHash":"34efac535967e41b3b3f71d51d097885746fe83cb5e90bc8938586b41114cae3","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a0a5fc7b-eae1-4e67-b562-e2034a18c2a1","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-764-build-autonomously-launch-token"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51518","feedbackHash":"60a8cb6f5a1858ead2db851f6ee7f069728f9a1ad85b13db68570734113b4053","nodeKey":"build_contract_project","submissionHash":"2e87393461c54e90a76a15d102712614b328cbfcfaf0e15de260227f72c77192","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"50968","feedbackHash":"ea2187fa02595f31985d48c0a104c6b6121467449c7eca23effefc01b94a0539","nodeKey":"build_contract_project","submissionHash":"82efc373461349609c8c9aeafe288e65712723e8e5d71ebd60e9c75bef8c0c8f","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"f0fc43f761baf8eeca45310f5ac0453c3209e6eae59d146b3fdfa4689a9fc4b1","state":"blocked","submissions":[{"artifacts":[],"attempt":3,"bundleHash":"c0c6ff3d99ebaacbd474c72aa0702da4585bca13f28645018bfeae9be6a4b1e2","device":"12fbd676b2122512","findings":[],"hash":"2e87393461c54e90a76a15d102712614b328cbfcfaf0e15de260227f72c77192","nodeId":"fa03b1b9-9671-4d06-b33e-a9dce49ae703","outcome":"completed","summary":"Implemented the token, Reward Vault, FLYWHEEL/IMD hook, corrected launch manifest, deployment helpers, tests, and documentation.\n\nValidation passed: `forge build`, `forge test`, `forge fmt --check`; 49 unit/fuzz tests and four invariants covering 3,072 stateful actions.\n\n**Not deployed.** Missing chain configuration, swarm factory/publishing/broadcast infrastructure, liquidity parameters, and independent review/fork attestations block launch. No deployment addresses or transaction hashes exist.\n\nDetails: [deployment report](docs/DEPLOYMENT.md), [security review](docs/SECURITY_REVIEW.md), [launch manifest](launch.json).","treeHash":"77cf203be8e4cd9489c7bbce10c42aa412de9665","usage":{"cachedInputTokens":2559616,"inputTokens":126320,"model":"gpt-6-astra","outputTokens":39810,"runtime":"codex","turns":7,"wallClockMs":945961}},{"artifacts":[],"attempt":2,"bundleHash":"c7041900846bb70f847875ba12bb5ae6294023253e6374d630b6f2b497b7da1c","device":"228636b860e0212c","findings":[],"hash":"82efc373461349609c8c9aeafe288e65712723e8e5d71ebd60e9c75bef8c0c8f","nodeId":"fa03b1b9-9671-4d06-b33e-a9dce49ae703","outcome":"completed","summary":"Implemented the fixed-supply FLYWHEEL token, Reward Vault, Uniswap v4 hook, deployment tooling, manifest, documentation, and vendored dependencies.\n\n- Supply: **1 billion FLYWHEEL**\n- Initial Reward Pool: **0 IMD**\n- `forge build --force --offline`: passed\n- `forge test`: **85 passed**\n- Invariants: **8,192 calls, zero reverts**\n- `forge fmt --check`: passed\n\n**Production deployment is blocked.** The checkout lacks the IMD factory/API, verified chain configuration, normal liquidity parameters, and publishing/transaction route. Factory compatibility, independent review, and production fork verification remain unresolved. No production addresses or transaction hashes exist.\n\nSee [README](</home/imd/.identitymd/work/a0a5fc7b-eae1-4e67-b562-e2034a18c2a1/fa03b1b9-9671-4d06-b33e-a9dce49ae703/README.md>) and [deployment report](</home/imd/.identitymd/work/a0a5fc7b-eae1-4e67-b562-e2034a18c2a1/fa03b1b9-9671-4d06-b33e-a9dce49ae703/docs/DEPLOYMENT.md>).","treeHash":"6bc0dc461631cbd4875f1e24a33444e9152404bc","usage":{"cachedInputTokens":2756352,"inputTokens":132911,"model":"gpt-6-astra","outputTokens":51274,"runtime":"codex","turns":7,"wallClockMs":1359272}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"917650ddc12d10fe","findings":[],"hash":"d73841ff0cbcbe7e1c511bd28bc46a4780d9dbc0bea134c93b62811650d05e9a","nodeId":"fa03b1b9-9671-4d06-b33e-a9dce49ae703","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Execution is blocked: the tool runner failed twice with:\n\n```text\nfailed to spawn code-mode host /home/ubuntu/.local/bin/codex-code-mode-host:\nNo such file or directory (os error 2)\n```\n\nThis prevents repository inspection, implementation, and running `forge build`, `forge test`, or `forge fmt --check`.\n\nNo files were changed and no deployment was attempted. There are no deployment addresses or transaction hashes to report. The execution host must be restored before this assignment can proceed.","treeHash":null,"usage":{"cachedInputTokens":56192,"inputTokens":11927,"model":"gpt-6-astra","outputTokens":585,"runtime":"codex","turns":2,"wallClockMs":21988}}],"verification":[{"checks":[{"durationMs":3369,"exitCode":0,"name":"build","output":"Compiling 97 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.21s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/RewardVault.sol:21:17\n   │\n21 │     constructor(address manager) {\n   │                 ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/FlywheelHook.sol:51:39\n   │\n51 │     constructor(IPoolManager manager, address launchToken) {\n   │                                       ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/RewardVault.sol:41:61\n   │\n41 │     function payToManager(uint256 amount) external onlyHook nonReentrant {\n   │                                                             ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardVault.sol:46:48\n   │\n46 │         if (available() != balance - amount || imd.balanceOf(poolManager) != beforeManager + amount) {\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/RewardCurve.sol:32:13\n   │\n32 │         if (current <= demandEpoch) return;\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/RewardCurve.sol:37:13\n   │\n37 │         if (elapsed > 2048) {\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/RewardCurve.sol:39:20\n   │\n39 │         } else if (elapsed > 1) {\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/RewardCurve.sol:44:20\n   │\n44 │             while (n != 0) {\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/RewardCurve.sol:45:21\n   │\n45 │                 if (n & 1 != 0) factor = Math.mulDiv(factor, base, scale);\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/FlywheelHook.sol:93:9\n   │\n93 │         emit PoolBound(PoolId.unwrap(poolId), pair, address(rewardVault));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:123:30\n    │\n123 │             uint256 normal = uint256(-params.amountSpecified);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:125:35\n    │\n125 │             if (normal + reward > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:125:43\n    │\n125 │             if (normal + reward > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:128:27\n    │\n128 │             adjustment = -int128(uint128(reward));\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/FlywheelHook.sol:128:34\n    │\n128 │             adjustment = -int128(uint128(reward));\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/FlywheelHook.sol:131:27\n    │\n131 │             uint256 net = uint256(params.amountSpecified);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:135:31\n    │\n135 │             if (expectedImd > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:135:39\n    │\n135 │             if (expectedImd > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:137:26\n    │\n137 │             adjustment = 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/FlywheelHook.sol:137:33\n    │\n137 │             adjustment = 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[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:184:17\n    │\n184 │                 poolManager.take(imd, address(rewardVault), fee);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:196:9\n    │\n196 │         poolManager.sync(imd);\n    │         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:197:9\n    │\n197 │         rewardVault.payToManager(reward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:198:13\n    │\n198 │         if (poolManager.settle() != reward) revert UnbackedSettlement();\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/FlywheelHook.sol:169:13\n    │\n169 │             emit BuyReward(normal, reward, exactInput);\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/FlywheelHook.sol:188:13\n    │\n188 │             emit SellContribution(gross, gross - fee, fee);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:156:30\n    │\n156 │             uint256 normal = uint256(-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/FlywheelHook.sol:165:31\n    │\n165 │                 adjustment = -int128(uint128(reward));\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/FlywheelHook.sol:165:38\n    │\n165 │                 adjustment = -int128(uint128(reward));\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/FlywheelHook.sol:172:29\n    │\n172 │             uint256 gross = 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/FlywheelHook.sol:172:37\n    │\n172 │             uint256 gross = 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/FlywheelHook.sol:177:30\n    │\n177 │                 adjustment = 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/FlywheelHook.sol:177:37\n    │\n177 │                 adjustment = 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\n","passed":true},{"durationMs":1412,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/Adversarial.t.sol:MaliciousCurrencyTest\n[PASS] test_failedRewardTransferRollsBackAllAccounting() (gas: 870589)\n[PASS] test_shortRewardTransferRejected() (gas: 409682)\n[PASS] test_shortSellContributionRejected() (gas: 240371)\n[PASS] test_tokenCallbackCannotReenterManagerSwap() (gas: 862555)\n[PASS] test_tokenCallbackCannotWithdrawFromVault() (gas: 628845)\n[PASS] test_vaultCannotRebindAndCannotOverdraw() (gas: 112663)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.03ms (1.85ms CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_transferConserves(uint256) (runs: 256, μ: 86020, ~: 86767)\nLogs:\n  Bound result 354192153623207775546252\n\n[PASS] test_allowanceAndFailures() (gas: 191073)\n[PASS] test_metadataAndFactorySupply() (gas: 52557)\n[PASS] test_noAdminMintBurnOrUpgrade() (gas: 152305)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.33ms (7.62ms CPU time)\n\nRan 1 test for test/Hook.t.sol:FreshManagerTest\n[PASS] test_firstBuyTokenOnlyLiquidityZeroImd() (gas: 9586536)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.15ms (12.49ms CPU time)\n\nRan 2 tests for test/Adversarial.t.sol:BothCurrencyOrdersTest\n[PASS] test_imdCurrencyOne() (gas: 41094521)\n[PASS] test_imdCurrencyZero() (gas: 41111957)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 45.98ms (90.59ms CPU time)\n\nRan 10 tests for test/RewardCurve.t.sol:RewardCurveTest\n[PASS] testFuzz_capsIncludingDust(uint128,uint128) (runs: 256, μ: 201735, ~: 217862)\n[PASS] testFuzz_emptyReserveAlwaysZero(uint128) (runs: 256, μ: 155940, ~: 157470)\n[PASS] testFuzz_splitCannotImproveReward(uint96,uint96,uint8) (runs: 256, μ: 991445, ~: 910891)\nLogs:\n  Bound result 9999999999999999999021462\n  Bound result 88680117347428\n  Bound result 2\n\n[PASS] testFuzz_whalePercentageFalls(uint96,uint96) (runs: 256, μ: 440075, ~: 440248)\nLogs:\n  Bound result 999008521430532617163\n  Bound result 9999999000000000000000026\n\n[PASS] test_dustAndMaximumVolumesDoNotOverflow() (gas: 468905)\n[PASS] test_emaUsesTimeAndVolumeNotTradeCount() (gas: 1022612)\n[PASS] test_idleDecayAndSameBlockFreeze() (gas: 457353)\n[PASS] test_longIdleLargeDemandRetainsPrecision() (gas: 318358)\n[PASS] test_poolHealthImprovesRateAndEmptyIsZero() (gas: 354660)\n[PASS] test_sameBlockDonationCannotRaiseBudget() (gas: 304897)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 56.37ms (68.49ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_invalidDeploymentPlanRejected() (gas: 3266462)\n[PASS] test_noRuntimeEscapeHatches() (gas: 6372992)\n[PASS] test_preparationMatchesActualCreate2AndPool() (gas: 17670208)\n[PASS] test_verifierRejectsWrongChainAndPair() (gas: 934037)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 63.99ms (68.89ms CPU time)\n\nRan 22 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_exactOutputBuySellLoopLoses(uint96) (runs: 256, μ: 676938, ~: 677317)\nLogs:\n  Bound result 1022864268\n\n[PASS] testFuzz_exactOutputSellRounding(uint96) (runs: 256, μ: 292060, ~: 291880)\nLogs:\n  Bound result 1235\n\n[PASS] testFuzz_flashAccountingBuySellLoses(uint96) (runs: 256, μ: 544325, ~: 544835)\nLogs:\n  Bound result 1022864268\n\n[PASS] testFuzz_sellerSplitAndConservation(uint128) (runs: 256, μ: 252448, ~: 252230)\nLogs:\n  Bound result 103635\n\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 130206)\n[PASS] test_depletionRecoveryAndLiquidityUnwind() (gas: 7743582)\n[PASS] test_emptyPoolBuyHasNoBonus() (gas: 350186)\n[PASS] test_exactInputBonusFundsAdditionalExecution() (gas: 550399)\n[PASS] test_exactOutputBuyDiscountsImdInput() (gas: 481829)\n[PASS] test_exactOutputSellReceivesRequestedNet() (gas: 290355)\n[PASS] test_initializerRestriction() (gas: 15098598)\n[PASS] test_noOpCannotGetBonus() (gas: 145961)\n[PASS] test_otherPoolsAndDoubleInitializeRejected() (gas: 135011)\n[PASS] test_partialExactInputBuyRevertsAndRollsBackReward() (gas: 892412)\n[PASS] test_partialExactInputSellChargesActualOutput() (gas: 245478)\n[PASS] test_partialExactOutputBuyRewardsOnlyActualInput() (gas: 475189)\n[PASS] test_partialExactOutputSellRevertsAndRollsBack() (gas: 182448)\n[PASS] test_permissionsAndRuntimeSize() (gas: 24250)\n[PASS] test_reentrantBeforeSwapRejected() (gas: 237121)\n[PASS] test_sellFundsExactlyNinetyTen() (gas: 274454)\n[PASS] test_washTradingCannotProfitOrDrainVault() (gas: 5029613)\n[PASS] test_whaleAndSplitWhaleSameBlockBound() (gas: 2907167)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 83.40ms (246.36ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:FlywheelInvariantTest\n[PASS]\nFlywheelInvariantTest invariants:\n[PASS] invariant_blockCapsAndRate\n[PASS] invariant_noUnsettledHookOrRouterDelta\n[PASS] invariant_rewardPoolConservation\n[PASS] invariant_supplyNeverChanges\n FlywheelInvariantTest invariants (runs: 64, calls: 3072, reverts: 0)\n\n╭-------------+-----------+-------+---------+----------╮\n| Contract    | Selector  | Calls | Reverts | Discards |\n+======================================================+\n| SwapHandler | flashLoop | 1578  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| SwapHandler | trade     | 1494  | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 99999999999999004823\n  Bound result 6326491372\n  Bound result 99999999999999009947\n  Bound result 361691453\n  Bound result 82891262282849232378\n  Bound result 99999999999999007127\n  Bound result 99999999999999018158\n  Bound result 99999999999999000490\n  Bound result 99999999999999000078\n  Bound result 99999999999999017582\n  Bound result 99999999999999000517\n  Bound result 99999999999999001724\n  Bound result 99999999999999001143\n  Bound result 99999999999999005427\n  Bound result 99999999999999007382\n  Bound result 99999999999999015530\n  Bound result 15511827233009548411\n  Bound result 99999999999999008768\n  Bound result 99999999999999019255\n  Bound result 99999999999999001011\n  Bound result 99999999999999004643\n  Bound result 99999999999999001138\n  Bound result 99999999999999380280\n  Bound result 99999999999999001165\n  Bound result 1725540767\n  Bound result 99999999999999000607\n  Bound result 99999999999999004397\n  Bound result 35661513462345087166\n  Bound result 99999999999999007825\n  Bound result 99999999999999009192\n  Bound result 99999999999999006873\n  Bound result 99999999999999000376\n  Bound result 99999999999999000793\n  Bound result 99999999999999006989\n  Bound result 99999999999999017721\n  Bound result 99999999999999007175\n  Bound result 99999999999999000159\n  Bound result 99999999999999006239\n  Bound result 76331266005840904761\n  Bound result 7634975566839034289\n  Bound result 29256853716383863436\n  Bound result 86277039\n  Bound result 137601204210672\n  Bound result 89789402524442295129\n  Bound result 99999999999999000607\n  Bound result 1000003\n  Bound result 99999999999999019580\n  Bound result 99999999999999019619\n  Bound result 99999999999999007961\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.30s (1.27s CPU time)\n\nRan 8 test suites in 1.30s (1.57s CPU time): 50 tests passed, 0 failed, 0 skipped (50 total tests)\n","passed":true},{"durationMs":70,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FlywheelHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FlywheelHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"FlywheelHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"FlywheelToken.approve(address,uint256)\",\"FlywheelToken.transfer(address,uint256)\",\"FlywheelToken.transferFrom(address,address,uint256)\",\"RewardVault.bind(address)\",\"RewardVault.payToManager(uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.json\":26,\"LICENSE\":23,\"README.md\":70,\"docs/DEPLOYMENT.md\":77,\"docs/SECURITY_REVIEW.md\":81,\"foundry.toml\":20,\"launch.json\":26,\"release/foundry-results.txt\":111,\"release/launch-bundle.json\":1677,\"release/status.json\":36,\"remappings.txt\":4,\"script/PrepareLaunch.s.sol\":68,\"script/VerifyDeployment.s.sol\":44,\"src/FlywheelHook.sol\":200,\"src/FlywheelToken.sol\":11,\"src/HookFlags.sol\":28,\"src/RewardCurve.sol\":81,\"src/RewardVault.sol\":50,\"test/Adversarial.t.sol\":154,\"test/Deployment.t.sol\":71,\"test/Hook.t.sol\":266,\"test/Invariants.t.sol\":107,\"test/RewardCurve.t.sol\":133,\"test/Token.t.sol\":59,\"test/helpers/Fixture.sol\":89,\"test/helpers/PoolRouter.sol\":68,\"test/mocks/MockERC20.sol\":9,\"tools/check_manifest.py\":28,\"tools/package_launch.py\":24},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2154,"exitCode":0,"name":"slither","output":"[medium/medium] reentrancy-no-eth at src/FlywheelHook.sol:142: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#142-192):\n[low/medium] missing-zero-check at src/RewardVault.sol:21: RewardVault.constructor(address).manager (src/RewardVault.sol#21) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/FlywheelHook.sol:142: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#142-192):\n[low/medium] reentrancy-benign at src/FlywheelHook.sol:73: Reentrancy in FlywheelHook.beforeInitialize(address,PoolKey,uint160) (src/FlywheelHook.sol#73-95):\n[low/medium] reentrancy-benign at src/FlywheelHook.sol:142: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#142-192):\n[low/medium] reentrancy-events at src/FlywheelHook.sol:142: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#142-192):\n[low/medium] reentrancy-events at src/FlywheelHook.sol:73: Reentrancy in FlywheelHook.beforeInitialize(address,PoolKey,uint160) (src/FlywheelHook.sol#73-95):\n[low/medium] reentrancy-events at src/FlywheelHook.sol:142: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#142-192):\n[low/medium] timestamp at src/RewardCurve.sol:30: RewardCurve._rollDemand() (src/RewardCurve.sol#30-53) uses timestamp for comparisons","passed":true},{"durationMs":560,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/FlywheelHook.sol:85: Reentrancy: State change after external call (7 places)\n[low] internal-function-used-once at src/HookFlags.sol:21: Internal Function Used Only Once\n[low] large-numeric-literal at src/FlywheelToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/FlywheelHook.sol:92: Literal Instead of Constant (10 places)\n[low] non-reentrant-not-first at src/RewardVault.sol:41: `nonReentrant` is Not the First Modifier\n[low] state-change-without-event at src/FlywheelHook.sol:105: State Change Without Event (3 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: kind: Invalid discriminator value. Expected 'univ4_hook' | 'evm_project' | 'custom_token' | 'evm_contracts'","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"2e87393461c54e90a76a15d102712614b328cbfcfaf0e15de260227f72c77192","verifiedTreeHash":"77cf203be8e4cd9489c7bbce10c42aa412de9665","verifierVersion":"0.1.0+f8d984f2"},{"checks":[{"durationMs":6764,"exitCode":0,"name":"build","output":"Compiling 105 files with Solc 0.8.26\nSolc 0.8.26 finished in 6.57s\nCompiler run successful!\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/launch/FlywheelLaunch.sol:26:16\n   │\n26 │         return abi.encodePacked(type(FlywheelHook).creationCode, abi.encode(manager, token, imd));\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/launch/FlywheelLaunch.sol:61:9\n   │\n61 │         manager.initialize(key, sqrtPriceX96);\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/RewardVault.sol:51:48\n   │\n51 │         if (available() != balance - reward || imd.balanceOf(recipient) != recipientBefore + reward) {\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/RewardVault.sol:61:29\n   │\n61 │         amount = abi.decode(poolManager.unlock(\"\"), (uint256));\n   │                             ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/FlywheelHook.sol:60:40\n   │\n60 │     constructor(IPoolManager manager_, address token_, IERC20Metadata imd_) {\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/RewardVault.sol:74:9\n   │\n74 │         emit ClaimsRedeemed(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:147:27\n    │\n147 │             uint256 net = uint256(params.amountSpecified);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:149:25\n    │\n149 │             if (gross > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:149:33\n    │\n149 │             if (gross > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:152:19\n    │\n152 │             fee = int128(int256(gross - net));\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/FlywheelHook.sol:152:26\n    │\n152 │             fee = int128(int256(gross - net));\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-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:221:26\n    │\n221 │         if (reward != 0) rewardVault.payReward(recipient, buy, reward);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:228:13\n    │\n228 │             poolManager.mint(address(rewardVault), uint256(uint160(address(imd))), fee);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `swapping` is updated\n    ╭▸ src/FlywheelHook.sol:231:13\n    │\n231 │             poolManager.take(Currency.wrap(address(imd)), address(rewardVault), fee);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FlywheelHook.sol:181:60\n    │\n181 │             emit SellContribution(gross, gross - fee, fee, deferred);\n    │                                                            ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FlywheelHook.sol:181:13\n    │\n181 │             emit SellContribution(gross, gross - fee, fee, deferred);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:169:40\n    │\n169 │             _buy(_recipient(hookData), uint256(-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/FlywheelHook.sol:172:29\n    │\n172 │             uint256 gross = 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/FlywheelHook.sol:172:37\n    │\n172 │             uint256 gross = 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/FlywheelHook.sol:174:79\n    │\n174 │                 params.amountSpecified > 0 && gross != RewardMath.grossForNet(uint256(params.amountSpecified))\n    │                                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:182:59\n    │\n182 │             if (params.amountSpecified < 0) returnedFee = 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/FlywheelHook.sol:182:66\n    │\n182 │             if (params.amountSpecified < 0) returnedFee = 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/FlywheelHook.sol:193:26\n    │\n193 │         uint256 volume = elapsed == 0 ? epochBuyVolume : 0;\n    │                          ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FlywheelHook.sol:190:19\n    │\n190 │         if (buy > uint256(uint128(type(int128).max))) revert InvalidAmount();\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/FlywheelHook.sol:190:27\n    │\n190 │         if (buy > uint256(uint128(type(int128).max))) revert InvalidAmount();\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FlywheelHook.sol:202:13\n    │\n202 │         if (currentEpoch != epoch) {\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/FlywheelHook.sol:207:13\n    │\n207 │             emit DemandUpdated(epoch, smoothedBuyDemand);\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/FlywheelHook.sol:222:9\n    │\n222 │         emit BuyBonus(recipient, buy, reward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n   ╭▸ test/helpers/FlywheelFixture.sol:99:17\n   │\n99 │         vm.roll(block.number + 1);\n   │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockNumber()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Flywheel.t.sol:223:21\n    │\n223 │             vm.roll(block.number + 1);\n    │             ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ test/Flywheel.t.sol:269:17\n    │\n269 │         vm.roll(block.number + 1);\n    │         ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Flywheel.t.sol:285:17\n    │\n285 │         vm.warp(block.timestamp + 1 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":4524,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_transferAndAllowancePreserveSupply(uint256) (runs: 256, μ: 162235, ~: 162966)\nLogs:\n  Bound result 895217405562732148910038646\n\n[PASS] test_noMintBurnOrAdministrativeSelectors() (gas: 621852)\n[PASS] test_policySupplyAndMetadata() (gas: 59943)\n[PASS] test_unauthorizedTransferAndZeroAddressRevert() (gas: 56781)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 9.35ms (10.35ms CPU time)\n\nRan 6 tests for test/RewardMath.t.sol:RewardMathTest\n[PASS] testFuzz_exactOutputRoundingMatchesNet(uint128) (runs: 256, μ: 4932, ~: 4932)\n[PASS] testFuzz_healthImprovesReward(uint96,uint96) (runs: 256, μ: 5765, ~: 5786)\n[PASS] testFuzz_largerBuysNeverDisproportionate(uint96,uint96) (runs: 256, μ: 6605, ~: 6605)\n[PASS] testFuzz_rewardBounds(uint128,uint128,uint128,uint128) (runs: 256, μ: 5996, ~: 6025)\n[PASS] test_healthyBaseRateApproachesFivePercent() (gas: 5393)\n[PASS] test_splitVolumeCannotResetCurve() (gas: 1461251)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 9.69ms (31.08ms CPU time)\n\nRan 1 test for test/Adversarial.t.sol:FreshLaunchTest\n[PASS] test_tokenOnlyLaunchFirstBuyAndSellWorksOnEmptyManager() (gas: 577115)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.39ms (921.66µs CPU time)\n\nRan 4 tests for test/Adversarial.t.sol:ReentrancyTest\n[PASS] test_feeOnTransferContributionRefusesAndRollsBack() (gas: 299436)\n[PASS] test_feeOnTransferRewardRefusesAndRollsBack() (gas: 604327)\n[PASS] test_reentrantSwapDuringRewardTransferRefused() (gas: 973311)\n[PASS] test_reentrantVaultRedemptionRefused() (gas: 623119)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 27.72ms (3.50ms CPU time)\n\nRan 7 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_beforeDeltaOnlyGrossesUpExactOutputSells() (gas: 225923)\n[PASS] test_creationArgumentsAndSaltFailClosed() (gas: 8314)\n[PASS] test_initializationRejectsWrongPairAndFeeBeforeBinding() (gas: 472671)\n[PASS] test_offlineAdmissionCanInstantiateButCannotInitializeMissingIMD() (gas: 19851404)\n[PASS] test_prepareScriptAndRealCreate2Deployment() (gas: 19150969)\n[PASS] test_unboundedSpecifiedAmountsRefuseBeforeCasting() (gas: 97590)\n[PASS] test_unsupportedIMDDecimalsCannotInitialize() (gas: 7235190)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 60.78ms (90.35ms CPU time)\n\nRan 19 tests for test/Flywheel.t.sol:FlywheelTest\n[PASS] testFuzz_buysPaySeparateCappedIMD(uint128,bool) (runs: 256, μ: 610443, ~: 612268)\nLogs:\n  Bound result 20755\n\n[PASS] testFuzz_sellsConserveOutput(uint128,bool) (runs: 256, μ: 293312, ~: 295109)\nLogs:\n  Bound result 4102309907\n\n[PASS] test_depletionDustAndSellRecovery() (gas: 1373139)\n[PASS] test_emaCannotBeDilutedByDustTradeCount() (gas: 3670470)\n[PASS] test_emptyVaultBuyBothModesAndNoExtraTokenomics() (gas: 493728)\n[PASS] test_exactOutputSellGrossesUpAndDeliversExactNet() (gas: 2238772)\n[PASS] test_explicitRecipientCannotClaimWithoutSwap() (gas: 592466)\n[PASS] test_idleEpochDecayAndRecoveryBounded() (gas: 592565)\n[PASS] test_initialStateAndPermissions() (gas: 93972)\n[PASS] test_missingOrForbiddenRewardRecipientRefusesEvenEmptyVault() (gas: 242735)\n[PASS] test_noEscapeOpcodesInFinalContracts() (gas: 4976405)\n[PASS] test_partialExactInputBuyUsesActualDemand() (gas: 581234)\n[PASS] test_roundTripAndSplitWashTradingLoseMoney() (gas: 4212803)\n[PASS] test_selfLiquidityRewardFarmingRefused() (gas: 1537442)\n[PASS] test_sellMatchesUnhookedNormalOutput() (gas: 2235405)\n[PASS] test_splitWhaleAcrossRecipientsAndRoutersSharesBlockLimit() (gas: 8648164)\n[PASS] test_unauthorizedCallbacksAllRefuse() (gas: 116226)\n[PASS] test_unfilledExactOutputSellRevertsAtomically() (gas: 170201)\n[PASS] test_wrongPoolAndReinitializationRefuse() (gas: 107985)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 97.09ms (202.43ms CPU time)\n\nRan 20 tests for test/Ordering.t.sol:ImdCurrencyOneTest\n[PASS] testFuzz_buysPaySeparateCappedIMD(uint128,bool) (runs: 256, μ: 617347, ~: 619234)\nLogs:\n  Bound result 20059\n\n[PASS] testFuzz_sellsConserveOutput(uint128,bool) (runs: 256, μ: 298978, ~: 299894)\nLogs:\n  Bound result 799359957404092896699\n\n[PASS] test_depletionDustAndSellRecovery() (gas: 1378650)\n[PASS] test_emaCannotBeDilutedByDustTradeCount() (gas: 3681154)\n[PASS] test_emptyVaultBuyBothModesAndNoExtraTokenomics() (gas: 488357)\n[PASS] test_exactOutputSellGrossesUpAndDeliversExactNet() (gas: 2248866)\n[PASS] test_explicitRecipientCannotClaimWithoutSwap() (gas: 598187)\n[PASS] test_idleEpochDecayAndRecoveryBounded() (gas: 586739)\n[PASS] test_initialStateAndPermissions() (gas: 93917)\n[PASS] test_missingOrForbiddenRewardRecipientRefusesEvenEmptyVault() (gas: 243366)\n[PASS] test_noEscapeOpcodesInFinalContracts() (gas: 5039016)\n[PASS] test_orderingIsOne() (gas: 5230)\n[PASS] test_partialExactInputBuyUsesActualDemand() (gas: 587572)\n[PASS] test_roundTripAndSplitWashTradingLoseMoney() (gas: 4219121)\n[PASS] test_selfLiquidityRewardFarmingRefused() (gas: 1537476)\n[PASS] test_sellMatchesUnhookedNormalOutput() (gas: 2248076)\n[PASS] test_splitWhaleAcrossRecipientsAndRoutersSharesBlockLimit() (gas: 8645315)\n[PASS] test_unauthorizedCallbacksAllRefuse() (gas: 116238)\n[PASS] test_unfilledExactOutputSellRevertsAtomically() (gas: 176261)\n[PASS] test_wrongPoolAndReinitializationRefuse() (gas: 108009)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 97.72ms (192.44ms CPU time)\n\nRan 20 tests for test/Ordering.t.sol:ImdCurrencyZeroTest\n[PASS] testFuzz_buysPaySeparateCappedIMD(uint128,bool) (runs: 256, μ: 609842, ~: 611836)\nLogs:\n  Bound result 799359957404092896699\n\n[PASS] testFuzz_sellsConserveOutput(uint128,bool) (runs: 256, μ: 293026, ~: 294826)\nLogs:\n  Bound result 799359957404092896699\n\n[PASS] test_depletionDustAndSellRecovery() (gas: 1372145)\n[PASS] test_emaCannotBeDilutedByDustTradeCount() (gas: 3665524)\n[PASS] test_emptyVaultBuyBothModesAndNoExtraTokenomics() (gas: 493318)\n[PASS] test_exactOutputSellGrossesUpAndDeliversExactNet() (gas: 2237807)\n[PASS] test_explicitRecipientCannotClaimWithoutSwap() (gas: 592056)\n[PASS] test_idleEpochDecayAndRecoveryBounded() (gas: 591939)\n[PASS] test_initialStateAndPermissions() (gas: 93906)\n[PASS] test_missingOrForbiddenRewardRecipientRefusesEvenEmptyVault() (gas: 242109)\n[PASS] test_noEscapeOpcodesInFinalContracts() (gas: 4976338)\n[PASS] test_orderingIsZero() (gas: 5297)\n[PASS] test_partialExactInputBuyUsesActualDemand() (gas: 580824)\n[PASS] test_roundTripAndSplitWashTradingLoseMoney() (gas: 4208289)\n[PASS] test_selfLiquidityRewardFarmingRefused() (gas: 1537248)\n[PASS] test_sellMatchesUnhookedNormalOutput() (gas: 2234527)\n[PASS] test_splitWhaleAcrossRecipientsAndRoutersSharesBlockLimit() (gas: 8641490)\n[PASS] test_unauthorizedCallbacksAllRefuse() (gas: 115578)\n[PASS] test_unfilledExactOutputSellRevertsAtomically() (gas: 170007)\n[PASS] test_wrongPoolAndReinitializationRefuse() (gas: 107270)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 193.73ms (184.90ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:FlashTest\n[PASS] testFuzz_flashSplitWashTradingLosesAndDeferredFeesRedeem(uint8) (runs: 256, μ: 2364422, ~: 2236606)\nLogs:\n  Bound result 17\n\n[PASS] test_exactOutputSellAlsoDefersContribution() (gas: 1476480)\n[PASS] test_flashBorrowCannotRepayUsingRoundTripRewards() (gas: 1522562)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 242.39ms (231.94ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:FlywheelInvariantTest\n[PASS]\nFlywheelInvariantTest invariants:\n[PASS] invariant_rewardPoolConservesIMDAndCannotOverdraw\n[PASS] invariant_sharedBlockCapAndManagerSettlement\n[PASS] invariant_supplyNeverChangesAndTokensConserved\n FlywheelInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------+------------------------+-------+---------+----------╮\n| Contract      | Selector               | Calls | Reverts | Discards |\n+=====================================================================+\n| MarketHandler | advance                | 1615  | 0       | 0        |\n|---------------+------------------------+-------+---------+----------|\n| MarketHandler | buy                    | 1663  | 0       | 0        |\n|---------------+------------------------+-------+---------+----------|\n| MarketHandler | flashWash              | 1586  | 0       | 0        |\n|---------------+------------------------+-------+---------+----------|\n| MarketHandler | sell                   | 1683  | 0       | 0        |\n|---------------+------------------------+-------+---------+----------|\n| MarketHandler | unauthorizedWithdrawal | 1645  | 0       | 0        |\n╰---------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 27\n  Bound result 8\n  Bound result 12906\n  Bound result 7\n  Bound result 1\n  Bound result 2\n  Bound result 444370381\n  Bound result 3\n  Bound result 18\n  Bound result 2\n  Bound result 3\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4598\n  Bound result 16\n  Bound result 3\n  Bound result 7156\n  Bound result 15\n  Bound result 908\n  Bound result 4264\n  Bound result 876281281145568259942\n  Bound result 864\n  Bound result 4\n  Bound result 1\n  Bound result 14\n  Bound result 14\n  Bound result 1601\n  Bound result 1\n  Bound result 2\n  Bound result 7\n  Bound result 383779999\n  Bound result 12\n  Bound result 1\n  Bound result 1\n  Bound result 2059932\n  Bound result 3\n  Bound result 499390659\n  Bound result 18\n  Bound result 13\n  Bound result 1\n  Bound result 1\n  Bound result 248\n  Bound result 4\n  Bound result 503615005\n  Bound result 1\n  Bound result 504275007553606842980\n  Bound result 4\n  Bound result 5\n  Bound result 15777\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.37s (4.35s CPU time)\n\nRan 10 test suites in 4.37s (5.12s CPU time): 85 tests passed, 0 failed, 0 skipped (85 total tests)\n","passed":true},{"durationMs":135,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FlywheelHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FlywheelHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"FlywheelHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"FlywheelToken.approve(address,uint256)\",\"FlywheelToken.transfer(address,uint256)\",\"FlywheelToken.transferFrom(address,address,uint256)\",\"RewardVault.payReward(address,uint256,uint256)\",\"RewardVault.redeemClaims()\",\"RewardVault.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"LICENSE\":23,\"README.md\":81,\"docs/DEPLOYMENT.md\":50,\"docs/SECURITY_REVIEW.md\":56,\"docs/VALIDATION.md\":37,\"foundry.toml\":29,\"launch.json\":100,\"release/build-fingerprint.json\":67,\"release/check-results.json\":26,\"release/foundry-test.txt\":138,\"release/gas-smoke.txt\":120,\"script/PrepareLaunch.s.sol\":45,\"src/FlywheelHook.sol\":252,\"src/FlywheelToken.sol\":11,\"src/HookFlags.sol\":29,\"src/RewardMath.sol\":52,\"src/RewardVault.sol\":77,\"src/launch/FlywheelLaunch.sol\":63,\"test/Adversarial.t.sol\":130,\"test/Deployment.t.sol\":137,\"test/Flywheel.t.sol\":322,\"test/Invariant.t.sol\":161,\"test/Ordering.t.sol\":29,\"test/RewardMath.t.sol\":57,\"test/Token.t.sol\":66,\"test/helpers/FlashActor.sol\":68,\"test/helpers/FlywheelFixture.sol\":112,\"test/helpers/LaunchHarness.sol\":67,\"test/mocks/AdversarialIMD.sol\":36,\"test/mocks/MockIMD.sol\":9,\"tools/build_fingerprint.py\":24,\"tools/verify_launch.py\":71},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2358,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] reentrancy-balance at src/RewardVault.sol:65: Reentrancy in RewardVault.unlockCallback(bytes) (src/RewardVault.sol#65-76):\n[high/medium] reentrancy-balance at src/RewardVault.sol:65: Reentrancy in RewardVault.unlockCallback(bytes) (src/RewardVault.sol#65-76):\n[high/medium] reentrancy-balance at src/RewardVault.sol:65: Reentrancy in RewardVault.unlockCallback(bytes) (src/RewardVault.sol#65-76):\n[high/medium] reentrancy-balance at src/RewardVault.sol:65: Reentrancy in RewardVault.unlockCallback(bytes) (src/RewardVault.sol#65-76):\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:248: Math.invMod(uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#248-296) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin-contracts/contracts/utils/math/Math.sol:144: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin-contracts/contracts/utils/math/Math.sol#144-223) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/FlywheelHook.sol:188: FlywheelHook.previewReward(uint256) (src/FlywheelHook.sol#188-198) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FlywheelHook.sol:188: FlywheelHook.previewReward(uint256) (src/FlywheelHook.sol#188-198) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/FlywheelHook.sol:157: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#157-186):\n[medium/medium] uninitialized-local at src/FlywheelHook.sol:179: FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).deferred (src/FlywheelHook.sol#179) is a local variable never initialized\n[medium/medium] unused-return at src/launch/FlywheelLaunch.sol:52: FlywheelLaunch.deployAndInitialize(IPoolManager,address,IERC20Metadata,bytes32,uint160) (src/launch/FlywheelLaunch.sol#52-62) ignores return value by manager.initialize(key,sqrtPriceX96) (src/launch/FlywheelLaunch.sol#61)\n[low/medium] reentrancy-benign at src/RewardVault.sol:59: Reentrancy in RewardVault.redeemClaims() (src/RewardVault.sol#59-63):\n[low/medium] reentrancy-events at src/FlywheelHook.sol:157: Reentrancy in FlywheelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/FlywheelHook.sol#157-186):\n[low/medium] reentrancy-events at src/FlywheelHook.sol:200: Reentrancy in FlywheelHook._buy(address,uint256) (src/FlywheelHook.sol#200-223):\n[low/medium] reentrancy-events at src/RewardVault.sol:65: Reentrancy in RewardVault.unlockCallback(bytes) (src/RewardVault.sol#65-76):\n[low/medium] timestamp at src/FlywheelHook.sol:200: FlywheelHook._buy(address,uint256) (src/FlywheelHook.sol#200-223) uses timestamp for comparisons\n[low/medium] timestamp at src/FlywheelHook.sol:188: FlywheelHook.previewReward(uint256) (src/FlywheelHook.sol#188-198) uses timestamp for comparisons","passed":true},{"durationMs":638,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/launch/FlywheelLaunch.sol:26: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/FlywheelHook.sol:107: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/HookFlags.sol:22: Internal Function Used Only Once (3 places)\n[low] large-numeric-literal at src/FlywheelToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/FlywheelHook.sol:196: Literal Instead of Constant (10 places)\n[low] state-change-without-event at src/FlywheelHook.sol:131: State Change Without Event (2 places)\n[low] unchecked-return at src/FlywheelHook.sol:145: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/launch/FlywheelLaunch.sol:38: Uninitialized Local Variable\n[low] unused-import at src/launch/FlywheelLaunch.sol:4: Unused Import","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.contract: expected a contract name; 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":"82efc373461349609c8c9aeafe288e65712723e8e5d71ebd60e9c75bef8c0c8f","verifiedTreeHash":"6bc0dc461631cbd4875f1e24a33444e9152404bc","verifierVersion":"0.1.0+f8d984f2"}]}