{"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":"a7b7b7f4-3a8c-4bd8-b381-7f7c942427d2","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":"A custom token with a \"King of the Hill\" throne game: KING ($KING).\n\nPair: KING/ETH on the chain selected for this launch, using the DEX the launch factory uses (Uniswap v4 hook). Supply 1,000,000,000, 18 decimals, plain ERC-20. No owner powers after launch, no minting, no upgradeability.\n\nTrading fee (in the hook):\n- Every buy and sell pays a fee, always taken in ETH (from the ETH input on buys, from the ETH output on sells), computed on actual settled deltas for exact-input and exact-output swaps.\n- Anti-snipe at launch: the fee starts at 25% and decays linearly to the base fee of 2.5% over 30 minutes.\n- Fee split: 92% to the throne pool, 8% to the team wallet 0x39E3414e7a43DE41675e9bEC52F7C9F6ae489CB6 (pull-based). Nobody can withdraw from the throne pool except through the game rules.\n\nThe throne:\n- The game starts when the anti-snipe period ends. Until then the throne is empty and fees only fill the pool.\n- Taking the throne: a single buy whose ETH amount (fee included) is at least the current throne price makes the buyer the king immediately. Several small buys never add up.\n- Throne price: right after a takeover it is 1.2x the ETH the new king paid, then it decays exponentially (half-life 1 hour) toward a floor of 0.01 ETH. A king who sits long becomes cheap to dethrone. When the throne is empty the price is the floor.\n- The king's income: while someone holds the throne, the pool pays out continuously at 2% of the pool per hour, credited to the king every second. The king can claim it at any time, also after losing the throne.\n- Holding rule: the king must keep at least the KING tokens bought in the takeover. Any sell by the king through the pool dethrones him at once. Because the token is a plain ERC-20, also add a permissionless dethrone() that anyone can call when balanceOf(king) is below that amount (for example after a transfer to another wallet): it stops his income at that moment and empties the throne. Show this on the website so challengers use it.\n- Sells by anyone else never affect the throne.\n- Identify the real buyer robustly: the hook sees the router, not the user. Choose a safe approach (hookData from the router, tx.origin, or another), document the trade-offs and test it. Support a \"must take the throne\" flag in hookData: if set and the buy is below the throne price at execution, the whole swap reverts so the buyer does not pay a fee for nothing.\n- If you see a way for bots to farm the throne (sandwiching the king, block stuffing, sequencer ordering on the selected chain), explain it and add a defence.\n\nWhen the hook acts: on every swap in the KING/ETH pool, to take the fee and run the throne game. It never acts on plain transfers or on liquidity changes.\n\nWho can change it: nobody. All parameters are fixed at deployment: no owner, no admin functions, no upgrades.\n\nWebsite (build it and host it on IPFS, or say clearly if it must be a separate job):\n- Live throne: current king, how long he has reigned, his income so far and per hour, current throne price with a countdown to the next price step, pool size.\n- A buy button that takes the throne correctly (uses the \"must take the throne\" flag), plus normal buy and sell.\n- A \"Dethrone\" button that appears when the king's balance is below the required amount.\n- Claim button for anyone with unclaimed income, and a history of past kings with reign time and earnings.\n- A plain \"how it works\" section and a \"Made by agents. Not audited by humans. Trade at your own risk.\" notice.\n\nRequirements:\n- Foundry tests on a fork of the selected chain: anti-snipe decay, fee always in ETH on both sides and both exact modes, the 92/8 split, takeover at and below the price, the 1.2x jump and the 1-hour half-life decay to the floor, the per-second 2%/hour income, claims after dethroning, the holding rule on sells, dethrone() after a transfer and its refusal while the balance is sufficient, the must-take flag, reentrancy, and pool solvency.\n- An independent review of the economics and every contract.\n- Launch: all of the requester's share goes into liquidity (pool 90%, 0% to the requester), single-sided. Starting market cap 10 ETH.","parentJobId":null,"planHash":"27eb6b7f10721410cc517e9bea2e85c2b699355ee8bc1503efa2b699f040d2cf","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a7b7b7f4-3a8c-4bd8-b381-7f7c942427d2","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-804-custom-token-king-hill"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51433","feedbackHash":"a0e0d252991203284e7a6906fb7a654c2b50c2c25df03ca56d1460c52ea7a562","nodeKey":"build_contract_project","submissionHash":"238fb86b7b1a5c29d22a09e4919b4d42e3db89dee7739419cdf1f749b4515301","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51283","feedbackHash":"31cc5818ede04742b7b1c338ac8997a938f2ef110415bd3a1153fffa9908d87e","nodeKey":"build_contract_project","submissionHash":"d51f66ee1096a33e6aedad45f11bc1f10a529f8c66b2bf30a9ed8fc20f36b994","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51088","feedbackHash":"1407240b100cd4a5807c4ca3fc9ce252b5a588b8c83f43a5d9a62fbd72dfe1e5","nodeKey":"build_contract_project","submissionHash":"be681695396a8d7a38e8a256a9fa11e450bbec897f29ebb7f5f85bd59a5490da","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"9ef2159a073207346aea6db9a1ad26a16b275944d1326a6758a3c766c3ed53ff","state":"blocked","submissions":[{"artifacts":[],"attempt":3,"bundleHash":"ab2b38d1540974f895c43ed0761b931eb4846e1ce001e6250fe73ed362ee554d","device":"9fd410b500e3af05","findings":[],"hash":"238fb86b7b1a5c29d22a09e4919b4d42e3db89dee7739419cdf1f749b4515301","nodeId":"58a403a9-1726-46cb-b101-c978ebf5bade","outcome":"completed","summary":"Implemented the token, hook, throne game, router, website, launch manifest, and independent agent review.\n\n`forge build` and `forge fmt --check` pass. **All 41 delivered tests pass locally and on a Base fork.**\n\nDeployment, factory-schema validation, and IPFS publication remain separate launch steps, documented in [README.md](/home/identitymd/.identitymd/work/a7b7b7f4-3a8c-4bd8-b381-7f7c942427d2/58a403a9-1726-46cb-b101-c978ebf5bade/README.md).","treeHash":"b0821a233239eb533e227f7ee7cc00f39cdb1d42","usage":{"cachedInputTokens":3368064,"inputTokens":169063,"model":"gpt-6-astra","outputTokens":50912,"runtime":"codex","turns":8,"wallClockMs":1917975}},{"artifacts":[],"attempt":2,"bundleHash":"e3d27d6d2a45ad615932c2dd79c00d67c7886af181437697a56c7eb29789056d","device":"f801e761d7a1ec94","findings":[],"hash":"be681695396a8d7a38e8a256a9fa11e450bbec897f29ebb7f5f85bd59a5490da","nodeId":"58a403a9-1726-46cb-b101-c978ebf5bade","outcome":"completed","summary":"Implemented KING’s token, immutable hook/router, website, tests, and independent review. Router token funding is bound to `msg.sender`, removing the rejected arbitrary-source pattern.\n\nPassed:\n- `forge build`, `forge test`, `forge fmt --check`\n- 26 local and 26 Base-fork tests\n- Four website checks\n\n[README](README.md) documents economics, deployment parameters, and responsibilities. Deployment, factory allocation confirmation, and IPFS publication remain separate operational steps.","treeHash":"dd7a4d9057a67a2a336e6cf4e7489c664c3d813d","usage":{"cachedInputTokens":3265408,"inputTokens":121640,"model":"gpt-6-astra","outputTokens":40558,"runtime":"codex","turns":9,"wallClockMs":1661559}},{"artifacts":[],"attempt":1,"bundleHash":"c1064a02ea917eda8d5c07db39b8b0d27478918286c0116f7be3b64be2161f6c","device":"b5ff2623f878600d","findings":[],"hash":"d51f66ee1096a33e6aedad45f11bc1f10a529f8c66b2bf30a9ed8fc20f36b994","nodeId":"58a403a9-1726-46cb-b101-c978ebf5bade","outcome":"completed","summary":"Implemented KING token, throne hook, immutable router, static website, launch parameters, and independent agent review.\n\nVerified clean build, 29 passing tests, formatting, and pinned Base fork tests.\n\nNot deployed or IPFS-hosted. Factory allocation, LP custody, and publication responsibilities are documented in the [README](/home/worker/.identitymd-2/work/a7b7b7f4-3a8c-4bd8-b381-7f7c942427d2/58a403a9-1726-46cb-b101-c978ebf5bade/README.md).","treeHash":"088025d17adb4cf1146bef30fdc3cc02924b6d77","usage":{"cachedInputTokens":5198080,"inputTokens":203701,"model":"gpt-6-astra","outputTokens":45697,"runtime":"codex","turns":8,"wallClockMs":1837105}}],"verification":[{"checks":[{"durationMs":2725,"exitCode":0,"name":"build","output":"Compiling 86 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.58s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Launch.t.sol:40:5:\n   |\n40 |     function testFactoryOwnsSupplyBeforeAllocation() public {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-events-access-control]: `activeOrder` is changed without an event but is used for access control\n   ╭▸ src/KingRouter.sol:82:9\n   │\n82 │         activeOrder = bytes32(0);\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/KingRouter.sol:63:28\n   │\n63 │         if (!order.buy && !token.transferFrom(msg.sender, address(this), budget)) revert TransferFailed();\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/KingRouter.sol:64:38\n   │\n64 │         (input, output) = abi.decode(manager.unlock(abi.encode(order)), (uint256, uint256));\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/KingRouter.sol:70:39\n   │\n70 │         } else if (budget > input && !token.transfer(msg.sender, budget - input)) {\n   │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/KingRouter.sol:131:22\n    │\n131 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[missing-events-arithmetic]: `launchTime` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:102:9\n    │\n102 │         launchTime = block.timestamp;\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/KingRouter.sol:51:54\n   │\n51 │         if (order.amount == 0 || order.limit == 0 || order.deadline < block.timestamp || (!order.buy && order.mustTake))\n   │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-arithmetic]: `lastAccrual` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:103:9\n    │\n103 │         lastAccrual = block.timestamp;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/KingRouter.sol:73:9\n   │\n73 │         emit Trade(msg.sender, order.buy, input, output, hook.swapFee());\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `lastAccrual` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:261:9\n    │\n261 │         lastAccrual = block.timestamp;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:56:22\n   │\n56 │         if (budget > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:56:30\n   │\n56 │         if (budget > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:57:28\n   │\n57 │         if (order.amount > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:57:36\n   │\n57 │         if (order.amount > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:87:37\n   │\n87 │         if (amount == 0 || amount > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:87:45\n   │\n87 │         if (amount == 0 || amount > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:91:55\n   │\n91 │             SwapParams(order.buy, order.exactInput ? -int256(amount) : int256(amount), order.sqrtPriceLimitX96),\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/KingRouter.sol:91:72\n   │\n91 │             SwapParams(order.buy, order.exactInput ? -int256(amount) : int256(amount), order.sqrtPriceLimitX96),\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/KingRouter.sol:99:27\n   │\n99 │             uint256 net = uint256(-int256(delta.amount0()));\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/KingRouter.sol:101:22\n    │\n101 │             output = uint256(uint128(delta.amount1()));\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/KingRouter.sol:101:30\n    │\n101 │             output = uint256(uint128(delta.amount1()));\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/KingRouter.sol:104:13\n    │\n104 │             manager.settle{value: net}();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/KingRouter.sol:105:13\n    │\n105 │             manager.settleFor{value: fee}(address(hook));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingRouter.sol:109:21\n    │\n109 │             input = uint256(-int256(delta.amount1()));\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/KingRouter.sol:110:29\n    │\n110 │             uint256 gross = uint256(uint128(delta.amount0()));\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/KingRouter.sol:110:37\n    │\n110 │             uint256 gross = uint256(uint128(delta.amount0()));\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/KingRouter.sol:115:13\n    │\n115 │             manager.settle();\n    │             ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/KingRouter.sol:118:13\n    │\n118 │             manager.settleFor{value: fee}(address(hook));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/KingHook.sol:115:13\n    │\n115 │         if (elapsed >= ANTI_SNIPE) return BASE_FEE;\n    │             ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/KingRouter.sol:131:22\n    │\n131 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:122:9\n    │\n122 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/KingHook.sol:167:35\n    │\n167 │                 requiredBalance = tokens;\n    │                                   ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:136:28\n    │\n136 │     ) external onlyManager nonReentrant returns (bytes4, int128) {\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/KingHook.sol:162:30\n    │\n162 │             bool qualifies = block.timestamp >= launchTime + ANTI_SNIPE && paid >= thronePrice();\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/KingHook.sol:156:9\n    │\n156 │         emit FeeCollected(trader_, params.zeroForOne, ethAmount, swapFee, team);\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/KingHook.sol:273:9\n    │\n273 │         emit Dethroned(index, king, block.timestamp, reason);\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/KingHook.sol:172:17\n    │\n172 │                 emit ThroneTaken(reigns.length - 1, trader_, paid, tokens, initialThronePrice);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingHook.sol:143:25\n    │\n143 │             ethAmount = uint256(-int256(delta.amount0()));\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/KingHook.sol:144:22\n    │\n144 │             tokens = uint256(uint128(delta.amount1()));\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/KingHook.sol:144:30\n    │\n144 │             tokens = uint256(uint128(delta.amount1()));\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/KingHook.sol:148:25\n    │\n148 │             ethAmount = uint256(uint128(delta.amount0()));\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/KingHook.sol:148:33\n    │\n148 │             ethAmount = uint256(uint128(delta.amount0()));\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 `_status` is updated\n    ╭▸ src/KingHook.sol:246:9\n    │\n246 │         poolManager.unlock(\"\");\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/KingHook.sol:220:9\n    │\n220 │         emit Claimed(msg.sender, recipient, 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/KingHook.sol:229:9\n    │\n229 │         emit Claimed(TEAM, TEAM, 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/KingHook.sol:246:9\n    │\n246 │         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/KingHook.sol:267:9\n    │\n267 │         emit IncomeCredited(king, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/helpers/Fixture.sol:94:78\n   │\n94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n   │                                                                              ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/King.t.sol:71:9\n   │\n71 │         vm.warp(started + 900);\n   │         ────────────────────── `vm.warp` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockTimestamp()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:157:9\n    │\n157 │         vm.warp(block.timestamp + 1 hours);\n    │         ────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:157:17\n    │\n157 │         vm.warp(block.timestamp + 1 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:159:17\n    │\n159 │         vm.warp(block.timestamp + 1 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:169:9\n    │\n169 │         vm.warp(block.timestamp + 1);\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:169:17\n    │\n169 │         vm.warp(block.timestamp + 1);\n    │         ────────━━━━━━━━━━━━━━━───── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:171:17\n    │\n171 │         vm.warp(block.timestamp + 3599);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:216:9\n    │\n216 │         vm.warp(block.timestamp + 100);\n    │         ────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:216:17\n    │\n216 │         vm.warp(block.timestamp + 100);\n    │         ────────━━━━━━━━━━━━━━━─────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    ‡\n110 │         vm.warp(started + 30 minutes);\n    │         ───────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Security.t.sol:118:9\n    │\n118 │         vm.warp(block.timestamp + 100);\n    │         ────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Security.t.sol:118:17\n    │\n118 │         vm.warp(block.timestamp + 100);\n    │         ────────━━━━━━━━━━━━━━━─────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:94:78\n    │\n 94 │         return KingRouter.Order(buy, exact, amount, limit, buy ? LOW : HIGH, block.timestamp + 60, must);\n    │                                                                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Security.t.sol:257:9\n    │\n257 │         vm.warp(block.timestamp + 3600);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Security.t.sol:257:17\n    │\n257 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes 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":454,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 13 tests for test/Security.t.sol:SecurityTest\n[PASS] testCallerCannotSellAnotherUsersAllowance() (gas: 225981)\n[PASS] testClaimDetectsInsufficientHoldingAndStopsReign() (gas: 927074)\n[PASS] testClaimReentrancyCannotSpendTwiceOrReenterGame() (gas: 1316770)\n[PASS] testMustTakeUsesPartialFillPaidNotMaximumBudget() (gas: 496395)\n[PASS] testNewFeeNeverPaysRetroactiveIncome() (gas: 1016253)\n[PASS] testPartialExactOutputRevertsEverything() (gas: 1099999)\n[PASS] testPartialSellRefundAndFeeOnSettledEth() (gas: 1078497)\n[PASS] testRejectingClaimRecipientRollsBackAndCanRetry() (gas: 1179920)\n[PASS] testRejectingTeamCannotHaltTrading() (gas: 933193)\n[PASS] testRepeatedClaimsWithinOneSecondDoNotFarmIncome() (gas: 887165)\n[PASS] testSellPayoutReentrancyCannotReenterSwapOrClaim() (gas: 1498311)\n[PASS] testSmartWalletIdentityUsesCallerNotOrigin() (gas: 1360956)\n[PASS] testThirdPartyUnlockCannotSpendVictimAllowance() (gas: 478952)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 6.25ms (9.99ms CPU time)\n\nRan 4 tests for test/Launch.t.sol:LaunchTest\n[PASS] testAlreadyFundedManagerAlsoSettlesCorrectly() (gas: 960750)\n[PASS] testFactoryOwnsSupplyBeforeAllocation() (gas: 45585)\n[PASS] testSaltPlannerAndInitializationAuthentication() (gas: 6989228)\n[PASS] testUndeployedHookCannotBePreinitialized() (gas: 43215)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 44.26ms (9.25ms CPU time)\n\nRan 4 tests for test/Math.t.sol:KingMathTest\n[PASS] testFuzzExactInputCannotExceedBudget(uint128,uint64) (runs: 256, μ: 4344, ~: 4346)\n[PASS] testFuzzGrossUpExactOutput(uint128,uint64) (runs: 256, μ: 4537, ~: 4537)\n[PASS] testFuzzIncomeConservationAndMonotonicity(uint128,uint32) (runs: 256, μ: 15163, ~: 13560)\n[PASS] testFuzzPriceMonotoneAndBounded(uint128,uint32) (runs: 256, μ: 11725, ~: 12887)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 48.62ms (15.56ms CPU time)\n\nRan 19 tests for test/King.t.sol:KingTest\n[PASS] testAntiSnipeLinearAndEmptyThrone() (gas: 820525)\n[PASS] testAnyKingSellDethronesEvenWithExtraTokens() (gas: 1057752)\n[PASS] testBelowPriceDoesNotAccumulateAndExactPriceTakes() (gas: 1596714)\n[PASS] testFourExactModesAndEthOnlyFee() (gas: 2047056)\n[PASS] testFreshSingleSidedFirstBuyAndSplit() (gas: 499072)\n[PASS] testFuzzSolvencyAndFeeSplit(uint96,uint24) (runs: 256, μ: 1196934, ~: 1360750)\nLogs:\n  Bound result 1999990000000005676\n  Bound result 5479\n\n[PASS] testInitializationFlagsAndUnauthorizedCallbacks() (gas: 190117)\n[PASS] testLiquidityChangesLeaveGameAlone() (gas: 872140)\n[PASS] testMustTakeRevertsAtomicallyBelowAndDuringLaunch() (gas: 846869)\n[PASS] testOtherSellDoesNotDethrone() (gas: 1036184)\n[PASS] testPartialBuyChargesActualNotRequested() (gas: 713485)\n[PASS] testPerSecondIncomeAndClaimsAfterDethroning() (gas: 1326000)\n[PASS] testPriceHalfLifeTowardFloorAndLongIdle() (gas: 600168)\n[PASS] testSandwichCannotCapturePastOrSameTimestampIncome() (gas: 1596895)\n[PASS] testSlippageDeadlineAndOutputRevert() (gas: 521479)\n[PASS] testTeamPullAndRefusalForOthers() (gas: 602840)\n[PASS] testTokenSupplyAndPlainTransfer() (gas: 130549)\n[PASS] testTransferThenPermissionlessDethrone() (gas: 989000)\n[PASS] testWrongPoolAndUntrustedRouterCannotSpoofBuyer() (gas: 96576)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 48.73ms (62.74ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GameInvariantTest\n[PASS]\nGameInvariantTest invariants:\n[PASS] invariantAllLiabilitiesBackedAndSettlementCleared\n[PASS] invariantIncomeHasOneCreditorAndFeesAreConserved\n GameInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-------------+--------------+-------+---------+----------╮\n| Contract    | Selector     | Calls | Reverts | Discards |\n+=========================================================+\n| GameHandler | buy          | 279   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | claim        | 304   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | dethrone     | 275   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | passTime     | 276   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | sell         | 305   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | teamClaim    | 331   | 0       | 0        |\n|-------------+--------------+-------+---------+----------|\n| GameHandler | transferAway | 278   | 0       | 0        |\n╰-------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 249900000000008533\n  Bound result 2599\n  Bound result 18277189144041765297981225\n  Bound result 337\n  Bound result 2229\n  Bound result 71940653120483197\n  Bound result 249900000000000670\n  Bound result 1687\n  Bound result 4501\n  Bound result 1000000000000003471\n  Bound result 26\n  Bound result 12424091462271511908927712\n  Bound result 2360\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 361.79ms (352.87ms CPU time)\n\nRan 5 test suites in 363.02ms (509.65ms CPU time): 41 tests passed, 0 failed, 0 skipped (41 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KingHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KingHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KingHook.claim(address)\",\"KingHook.claimTeam()\",\"KingHook.dethrone()\",\"KingHook.unlockCallback(bytes)\",\"KingRouter.receive()\",\"KingRouter.swap((bool,bool,uint256,uint256,uint160,uint256,bool))\",\"KingRouter.unlockCallback(bytes)\",\"KingToken.approve(address,uint256)\",\"KingToken.transfer(address,uint256)\",\"KingToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":123,\"docs/INDEPENDENT_REVIEW.md\":73,\"docs/VALIDATION.md\":45,\"docs/dependencies.json\":22,\"docs/fork-anchor.json\":7,\"foundry.toml\":17,\"launch.json\":51,\"script/MineHook.s.sol\":23,\"src/HookFlags.sol\":29,\"src/IKingHook.sol\":9,\"src/KingHook.sol\":279,\"src/KingMath.sol\":39,\"src/KingRouter.sol\":138,\"src/KingToken.sol\":11,\"test/Invariant.t.sol\":129,\"test/King.t.sol\":309,\"test/Launch.t.sol\":46,\"test/Math.t.sol\":40,\"test/Security.t.sol\":277,\"test/helpers/Fixture.sol\":127,\"test/mocks/MockERC20.sol\":10,\"web/README.md\":25,\"web/abi.js\":1,\"web/app.js\":190,\"web/config.js\":9,\"web/index.html\":34,\"web/math.js\":31,\"web/math.test.mjs\":24,\"web/package.json\":1,\"web/style.css\":1,\"web/vendor/PROVENANCE.json\":6,\"web/vendor/ethers-LICENSE.md\":21,\"web/vendor/ethers.min.js\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1306,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/KingRouter.sol:129: KingRouter._sendETH(address,uint256) (src/KingRouter.sol#129-133) sends eth to arbitrary user\n[medium/high] incorrect-equality at src/KingHook.sol:259: KingHook._accrue() (src/KingHook.sol#259-268) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/KingHook.sol:140: KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).tokens (src/KingHook.sol#140) is a local variable never initialized\n[medium/medium] unused-return at src/KingRouter.sol:76: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#76-122) ignores return value by manager.settle{value: net}() (src/KingRouter.sol#104)\n[medium/medium] unused-return at src/KingRouter.sol:76: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#76-122) ignores return value by manager.settleFor{value: fee}(address(hook)) (src/KingRouter.sol#118)\n[medium/medium] unused-return at src/KingRouter.sol:76: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#76-122) ignores return value by manager.settleFor{value: fee}(address(hook)) (src/KingRouter.sol#105)\n[medium/medium] unused-return at src/KingRouter.sol:76: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#76-122) ignores return value by manager.settle() (src/KingRouter.sol#115)\n[medium/medium] unused-return at src/KingHook.sol:243: KingHook._pay(address,uint256) (src/KingHook.sol#243-247) ignores return value by poolManager.unlock() (src/KingHook.sol#246)\n[low/medium] missing-zero-check at src/KingHook.sol:138: KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).trader_ (src/KingHook.sol#138) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/KingRouter.sol:50: Reentrancy in KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#50-74):\n[low/medium] reentrancy-benign at src/KingHook.sol:130: Reentrancy in KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/KingHook.sol#130-176):\n[low/medium] timestamp at src/KingRouter.sol:50: KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#50-74) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:259: KingHook._accrue() (src/KingHook.sol#259-268) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:130: KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/KingHook.sol#130-176) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:112: KingHook.feeRate() (src/KingHook.sol#112-117) uses timestamp for comparisons","passed":true},{"durationMs":381,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/KingRouter.sol:50: ETH transferred without address checks\n[high] reentrancy-state-change at src/KingHook.sol:152: Reentrancy: State change after external call (3 places)\n[low] internal-function-used-once at src/HookFlags.sol:22: Internal Function Used Only Once\n[low] large-numeric-literal at src/KingHook.sol:98: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/KingRouter.sol:85: Literal Instead of Constant (2 places)\n[low] non-reentrant-not-first at src/KingHook.sol:122: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/KingMath.sol:14: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/KingHook.sol:93: State Change Without Event (3 places)\n[low] state-no-address-check at src/KingHook.sol:244: Address State Variable Set Without Checks\n[low] unchecked-return at src/KingHook.sol:246: Unchecked Return (2 places)\n[low] unsafe-erc20-operation at src/KingRouter.sol:63: Unsafe ERC20 Operation (3 places)","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":"238fb86b7b1a5c29d22a09e4919b4d42e3db89dee7739419cdf1f749b4515301","verifiedTreeHash":"b0821a233239eb533e227f7ee7cc00f39cdb1d42","verifierVersion":"0.1.0+e6140b7a"},{"checks":[{"durationMs":2281,"exitCode":0,"name":"build","output":"Compiling 80 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.11s\nCompiler run successful!\nwarning[missing-events-access-control]: `awaitingCallback` is changed without an event but is used for access control\n   ╭▸ src/KingRouter.sol:87:9\n   │\n87 │         awaitingCallback = false;\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/KingRouter.sol:67:18\n   │\n67 │             if (!token.transferFrom(msg.sender, address(this), budget)) revert TransferFailed();\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/KingRouter.sol:71:31\n   │\n71 │         bytes memory result = manager.unlock(abi.encode(order));\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/KingRouter.sol:81:36\n   │\n81 │             if (budget > input && !token.transfer(msg.sender, budget - input)) revert TransferFailed();\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-events-arithmetic]: `launchTime` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:110:9\n    │\n110 │         launchTime = block.timestamp;\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/KingRouter.sol:55:13\n   │\n55 │         if (block.timestamp > order.deadline || order.amount < 1 || order.limit < 1 || (!order.buy && order.mustTake)) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:59:22\n   │\n59 │         if (budget > uint256(uint128(type(int128).max)) || order.amount > uint256(uint128(type(int128).max))) {\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/KingRouter.sol:59:30\n   │\n59 │         if (budget > uint256(uint128(type(int128).max)) || order.amount > uint256(uint128(type(int128).max))) {\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/KingRouter.sol:59:75\n   │\n59 │         if (budget > uint256(uint128(type(int128).max)) || order.amount > uint256(uint128(type(int128).max))) {\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/KingRouter.sol:59:83\n   │\n59 │         if (budget > uint256(uint128(type(int128).max)) || order.amount > uint256(uint128(type(int128).max))) {\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-arithmetic]: `lastAccrual` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:111:9\n    │\n111 │         lastAccrual = block.timestamp;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/KingRouter.sol:128:9\n    │\n128 │         emit SwapExecuted(trader, order.buy, order.exactInput, input, output, fee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:95:42\n   │\n95 │         if (specified < 1 || specified > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:95:50\n   │\n95 │         if (specified < 1 || specified > uint256(uint128(type(int128).max))) revert InvalidOrder();\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/KingRouter.sol:99:55\n   │\n99 │             SwapParams(order.buy, order.exactInput ? -int256(specified) : int256(specified), order.sqrtPriceLimitX96),\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/KingRouter.sol:99:75\n   │\n99 │             SwapParams(order.buy, order.exactInput ? -int256(specified) : int256(specified), order.sqrtPriceLimitX96),\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/KingRouter.sol:105:29\n    │\n105 │         uint256 ethAmount = uint256(order.buy ? -int256(d0) : int256(d0));\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/KingRouter.sol:106:26\n    │\n106 │         uint256 tokens = uint256(order.buy ? int256(d1) : -int256(d1));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/KingRouter.sol:138:22\n    │\n138 │         (bool ok,) = msg.sender.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:100:9\n    │\n100 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:129:9\n    │\n129 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:142:28\n    │\n142 │     ) external onlyManager nonReentrant returns (bytes4, int128) {\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/KingHook.sol:154:30\n    │\n154 │             bool qualifies = block.timestamp >= launchTime + ANTI_SNIPE && paid >= price;\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/KingHook.sol:237:13\n    │\n237 │             emit IncomeAccrued(king, 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/KingHook.sol:245:13\n    │\n245 │             emit ThroneEnded(reigns.length - 1, king, block.timestamp, reign.earnings, reason);\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/KingHook.sol:164:17\n    │\n164 │                 emit ThroneTaken(reigns.length - 1, user, paid, requiredBalance, block.timestamp);\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/KingHook.sol:176:9\n    │\n176 │         emit FeeCharged(user, buy, ethAmount, fee, teamShare);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingHook.sol:148:29\n    │\n148 │         uint256 ethAmount = uint256(buy ? -int256(ethDelta) : int256(ethDelta));\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/KingHook.sol:160:35\n    │\n160 │                 requiredBalance = uint256(uint128(tokenDelta));\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/KingHook.sol:160:43\n    │\n160 │                 requiredBalance = uint256(uint128(tokenDelta));\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/KingHook.sol:184:13\n    │\n184 │         if (elapsed >= ANTI_SNIPE) return 25_000;\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/KingHook.sol:209:53\n    │\n209 │         if (king == address(0) || thronePool < 1 || block.timestamp <= lastAccrual) return 0;\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/KingHook.sol:281:31\n    │\n281 │         bytes memory result = poolManager.unlock(abi.encode(amount));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/KingHook.sol:283:22\n    │\n283 │         (bool ok,) = msg.sender.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-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/KingHook.sol:266:9\n    │\n266 │         emit Claimed(msg.sender, amount, false);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Adversarial.t.sol:161:9\n    │\n161 │         vm.warp(block.timestamp + 3600);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:161:17\n    │\n161 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    ‡\n120 │         vm.warp(start + 1800);\n    │         ───────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Adversarial.t.sol:175:21\n    │\n175 │             vm.warp(block.timestamp + seed % 7200);\n    │             ────────━━━━━━━━━━━━━━━─────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/Adversarial.t.sol:175:13\n    │\n175 │             vm.warp(block.timestamp + seed % 7200);\n    │             ────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:92:9\n    │\n 92 │         vm.warp(start + 900);\n    │         ──────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:192:9\n    │\n192 │         vm.warp(block.timestamp + 3600);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:194:17\n    │\n194 │         vm.warp(block.timestamp + 1800);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:204:9\n    │\n204 │         vm.warp(block.timestamp + 1);\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:204:17\n    │\n204 │         vm.warp(block.timestamp + 1);\n    │         ────────━━━━━━━━━━━━━━━───── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:206:17\n    │\n206 │         vm.warp(block.timestamp + 3599);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:229:9\n    │\n229 │         vm.warp(block.timestamp + 15);\n    │         ───────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:229:17\n    │\n229 │         vm.warp(block.timestamp + 15);\n    │         ────────━━━━━━━━━━━━━━━────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/helpers/Fixture.sol:101:13\n    │\n101 │             block.timestamp + 120,\n    │             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/King.t.sol:246:9\n    │\n246 │         vm.warp(block.timestamp + 100);\n    │         ────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:246:17\n    │\n246 │         vm.warp(block.timestamp + 100);\n    │         ────────━━━━━━━━━━━━━━━─────── `vm.warp` changes 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":964,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 19 tests for test/King.t.sol:KingTest\n[PASS] testAllFourModesChargeOnlyETHOnSettledDeltas() (gas: 1583792)\n[PASS] testAllowanceCannotBeSpentByAnotherCaller() (gas: 172017)\n[PASS] testAntiSnipeLinearAndGameBoundary() (gas: 987518)\n[PASS] testBelowAtPriceAndSmallBuysNeverAggregate() (gas: 1512558)\n[PASS] testFreshTokenOnlyManagerFirstBuyAndSplit() (gas: 451862)\n[PASS] testFuzzFeeSplitAndSolvency(uint96,uint16) (runs: 256, μ: 472799, ~: 435187)\nLogs:\n  Bound result 4999999000000123241\n  Bound result 2644\n\n[PASS] testInitializationPermissionsAndAllCallbacksRejectOutsiders() (gas: 193317)\n[PASS] testKingSellAlwaysDethronesOthersNeverDo() (gas: 1555160)\n[PASS] testLiquidityChangesDoNotRunGameAndClaimsRemainSolvent() (gas: 898111)\n[PASS] testMustTakeAndPriceCeilingRollbackEntireTrade() (gas: 902285)\n[PASS] testPartialInputUsesActualAndExactOutputPartialReverts() (gas: 841340)\n[PASS] testPerSecondIncomeAndOldKingClaims() (gas: 1169731)\n[PASS] testPriceHalfLifeAndFloor() (gas: 593030)\n[PASS] testRejectWrongPoolAndSpoofedIdentity() (gas: 140886)\n[PASS] testRuntimeHasNoEscapeHatchesAndFitsSizeLimit() (gas: 7300125)\n[PASS] testSameTimestampTakeoverRoundTripEarnsNothing() (gas: 1161256)\n[PASS] testTeamPullAndNoOtherWithdrawals() (gas: 545316)\n[PASS] testTokenSupplyTransferAndNoMint() (gas: 159883)\n[PASS] testTransferRequiresPermissionlessDetectionAndStopsIncome() (gas: 981217)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 832.57ms (187.74ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] testAllModesDuringAntiSnipeAndPartialSellRefund() (gas: 1231953)\n[PASS] testBadInitializerAndDuplicateInitialization() (gas: 86817)\n[PASS] testClaimReceiverReentryAndFailureRollback() (gas: 1803680)\n[PASS] testDeadlineSlippageAndBudgets() (gas: 698081)\n[PASS] testFuzzMultiActionConservation(uint256) (runs: 256, μ: 6480554, ~: 6509580)\n[PASS] testNoRetroactiveIncomeFromNewFees() (gas: 922158)\n[PASS] testRouterRefundReceiverCannotReenterOrLoseRefund() (gas: 1223221)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 862.35ms (802.98ms CPU time)\n\nRan 2 test suites in 863.08ms (1.69s CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KingHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KingHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KingHook.claim()\",\"KingHook.claimTeam()\",\"KingHook.dethrone()\",\"KingHook.receive()\",\"KingHook.unlockCallback(bytes)\",\"KingRouter.receive()\",\"KingRouter.swap((bool,bool,uint256,uint256,uint160,uint256,bool,uint256))\",\"KingRouter.unlockCallback(bytes)\",\"KingRouter.withdrawETH()\",\"KingToken.approve(address,uint256)\",\"KingToken.transfer(address,uint256)\",\"KingToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":23,\"README.md\":113,\"docs/dependencies.json\":26,\"docs/independent-review.md\":89,\"docs/validation.md\":51,\"foundry.toml\":22,\"launch.json\":13,\"package.json\":1,\"rehearsal/BaseFork.t.sol\":21,\"script/build-web.py\":12,\"script/fork-rehearsal.sh\":9,\"script/mine-salt.mjs\":19,\"src/DecayMath.sol\":25,\"src/HookFlags.sol\":29,\"src/IKingHook.sol\":10,\"src/KingHook.sol\":299,\"src/KingRouter.sol\":145,\"src/KingToken.sol\":11,\"test/Adversarial.t.sol\":194,\"test/King.t.sol\":342,\"test/helpers/Fixture.sol\":131,\"test/web.test.mjs\":39,\"web/abi.js\":4,\"web/app.js\":167,\"web/config.js\":3,\"web/index.html\":16,\"web/style.css\":1,\"web/vendor/ethers-LICENSE.md\":21,\"web/vendor/ethers.min.js\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1580,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/KingHook.sol:279: KingHook._pay(uint256) (src/KingHook.sol#279-285) sends eth to arbitrary user\n[medium/high] write-after-write at src/KingRouter.sol:32: KingRouter.trader (src/KingRouter.sol#32) is written in both\n[low/medium] reentrancy-benign at src/KingRouter.sol:54: Reentrancy in KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#54-83):\n[low/medium] reentrancy-benign at src/KingRouter.sol:54: Reentrancy in KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#54-83):\n[low/medium] reentrancy-events at src/KingRouter.sol:85: Reentrancy in KingRouter.unlockCallback(bytes) (src/KingRouter.sol#85-130):\n[low/medium] timestamp at src/KingHook.sol:208: KingHook.pendingIncome() (src/KingHook.sol#208-211) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:229: KingHook._accrue() (src/KingHook.sol#229-239) uses timestamp for comparisons\n[low/medium] timestamp at src/KingRouter.sol:54: KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#54-83) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:181: KingHook.feePpm() (src/KingHook.sol#181-186) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:202: KingHook.thronePrice() (src/KingHook.sol#202-206) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:287: KingHook.unlockCallback(bytes) (src/KingHook.sol#287-294) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:260: KingHook.claim() (src/KingHook.sol#260-268) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:136: KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/KingHook.sol#136-178) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:279: KingHook._pay(uint256) (src/KingHook.sol#279-285) uses timestamp for comparisons","passed":true},{"durationMs":499,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/KingRouter.sol:132: ETH transferred without address checks\n[high] reentrancy-state-change at src/KingHook.sol:74: Reentrancy: State change after external call (3 places)\n[low] internal-function-used-once at src/DecayMath.sol:13: Internal Function Used Only Once (2 places)\n[low] large-numeric-literal at src/DecayMath.sol:11: Large Numeric Literal (12 places)\n[low] literal-instead-of-constant at src/KingHook.sol:170: Literal Instead of Constant (10 places)\n[low] non-reentrant-not-first at src/KingHook.sol:100: `nonReentrant` is Not the First Modifier (3 places)\n[low] require-revert-in-loop at src/DecayMath.sol:15: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/KingHook.sol:97: State Change Without Event (4 places)\n[low] unchecked-return at src/KingHook.sol:132: Unchecked Return\n[low] unsafe-erc20-operation at src/KingRouter.sol:81: Unsafe ERC20 Operation (2 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":"be681695396a8d7a38e8a256a9fa11e450bbec897f29ebb7f5f85bd59a5490da","verifiedTreeHash":"dd7a4d9057a67a2a336e6cf4e7489c664c3d813d","verifierVersion":"0.1.0+e6140b7a"},{"checks":[{"durationMs":2860,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.71s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchParameters.sol:26:16\n   │\n26 │         return uint128(FullMath.mulDiv(POOL_TOKENS, 1 << 96, width));\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-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/KingRouter.sol:41:58\n   │\n41 │     constructor(IPoolManager manager_, KingToken token_, address hook_) {\n   │                                                          ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-events-arithmetic]: `launchTime` is changed without an event but is used in arithmetic\n   ╭▸ src/KingHook.sol:93:9\n   │\n93 │         launchTime = block.timestamp;\n   │         ━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastAccrued` is changed without an event but is used in arithmetic\n   ╭▸ src/KingHook.sol:94:9\n   │\n94 │         lastAccrued = block.timestamp;\n   │         ━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastAccrued` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:198:9\n    │\n198 │         lastAccrued = block.timestamp;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n   ╭▸ src/KingRouter.sol:61:38\n   │\n61 │         (input, output) = abi.decode(manager.unlock(abi.encode(msg.sender, o)), (uint256, uint256));\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ src/KingRouter.sol:115:22\n    │\n115 │         (bool ok,) = recipient.call{value: value}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[missing-events-arithmetic]: `thronePool` is changed without an event but is used in arithmetic\n    ╭▸ src/KingHook.sol:200:13\n    │\n200 │             thronePool -= income;\n    │             ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/KingRouter.sol:56:20\n   │\n56 │                 || block.timestamp > o.deadline || (!o.buy && o.mustTakeThrone)\n   │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:55:41\n   │\n55 │             o.amount == 0 || o.amount > uint256(uint128(type(int128).max)) || o.limit == 0\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/KingRouter.sol:55:49\n   │\n55 │             o.amount == 0 || o.amount > uint256(uint128(type(int128).max)) || o.limit == 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[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n    ╭▸ src/KingRouter.sol:102:18\n    │\n102 │             if (!token.transferFrom(trader, address(manager), tokens)) revert TransferFailed();\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/KingRouter.sol:110:9\n    │\n110 │         emit Trade(trader, o.buy, input, output, fee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:73:45\n   │\n73 │         if (coreAmount == 0 || coreAmount > uint256(uint128(type(int128).max))) revert InvalidSwap();\n   │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:73:53\n   │\n73 │         if (coreAmount == 0 || coreAmount > uint256(uint128(type(int128).max))) revert InvalidSwap();\n   │                                                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/KingRouter.sol:78:47\n   │\n78 │             SwapParams(o.buy, o.exactInput ? -int256(coreAmount) : int256(coreAmount), priceLimit),\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/KingRouter.sol:78:68\n   │\n78 │             SwapParams(o.buy, o.exactInput ? -int256(coreAmount) : int256(coreAmount), priceLimit),\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/KingRouter.sol:84:29\n   │\n84 │         uint256 ethAmount = uint256(o.buy ? -int256(d.amount0()) : int256(d.amount0()));\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/KingRouter.sol:85:26\n   │\n85 │         uint256 tokens = uint256(o.buy ? int256(d.amount1()) : -int256(d.amount1()));\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/KingRouter.sol:97:13\n   │\n97 │             manager.settle{value: ethAmount}();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/KingRouter.sol:98:13\n   │\n98 │             manager.settleFor{value: fee}(hook);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/KingRouter.sol:103:13\n    │\n103 │             manager.settle();\n    │             ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/KingRouter.sol:107:13\n    │\n107 │             manager.settleFor{value: fee}(hook);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/KingRouter.sol:115:22\n    │\n115 │         (bool ok,) = recipient.call{value: value}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/KingHook.sol:119:28\n    │\n119 │     ) external onlyManager nonReentrant returns (bytes4, int128) {\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/KingHook.sol:129:29\n    │\n129 │             bool eligible = block.timestamp >= launchTime + ANTI_SNIPE && paid >= thronePrice() && delta.amount1() > 0;\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/KingHook.sol:211:13\n    │\n211 │             emit Dethroned(reigns.length - 1, king, block.timestamp, r.earned);\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/KingHook.sol:138:17\n    │\n138 │                 emit Crowned(reigns.length - 1, trader, paid, requiredBalance, block.timestamp);\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/KingHook.sol:148:13\n    │\n148 │             emit FeeCharged(trader, buy, ethAmount, fee, team);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingHook.sol:123:29\n    │\n123 │         uint256 ethAmount = uint256(buy ? -int256(delta.amount0()) : int256(delta.amount0()));\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/KingHook.sol:134:35\n    │\n134 │                 requiredBalance = uint256(uint128(delta.amount1()));\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/KingHook.sol:134:43\n    │\n134 │                 requiredBalance = uint256(uint128(delta.amount1()));\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/KingHook.sol:156:16\n    │\n156 │         return elapsed >= ANTI_SNIPE ? 250 : 2500 - 2250 * elapsed / ANTI_SNIPE;\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/KingHook.sol:168:13\n    │\n168 │         if (dt >= 256 hours) return FLOOR;\n    │             ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingHook.sol:169:25\n    │\n169 │         uint256 decay = uint256(wadExp(-int256(dt * 693147180559945309 / HALF_LIFE)));\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/KingHook.sol:169:41\n    │\n169 │         uint256 decay = uint256(wadExp(-int256(dt * 693147180559945309 / HALF_LIFE)));\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/KingHook.sol:177:13\n    │\n177 │         if (dt == 0) return 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/KingHook.sol:178:13\n    │\n178 │         if (dt >= 180_000 * 42) return thronePool;\n    │             ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/KingHook.sol:179:25\n    │\n179 │         uint256 decay = uint256(wadExp(-int256(dt * 1e18 / 180_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/KingHook.sol:179:41\n    │\n179 │         uint256 decay = uint256(wadExp(-int256(dt * 1e18 / 180_000)));\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 `entered` is updated\n    ╭▸ src/KingHook.sol:247:9\n    │\n247 │         poolManager.unlock(\"\");\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/KingHook.sol:232:9\n    │\n232 │         emit Claimed(msg.sender, recipient, 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/KingHook.sol:241:9\n    │\n241 │         emit TeamClaimed(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/KingHook.sol:247:9\n    │\n247 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n188 │         vm.warp(hook.launchTime() + 900);\n    │         ──────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n258 │         vm.warp(block.timestamp + 3600);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:258:17\n    │\n258 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:260:17\n    │\n260 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n 93 │         vm.warp(hook.launchTime() + 1800);\n    │         ───────────────────────────────── `vm.warp` changes this environment here\n    ‡\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n293 │         vm.warp(block.timestamp + 1);\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:293:17\n    │\n293 │         vm.warp(block.timestamp + 1);\n    │         ────────━━━━━━━━━━━━━━━───── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:295:17\n    │\n295 │         vm.warp(block.timestamp + 3599);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n320 │         vm.warp(block.timestamp + 10);\n    │         ───────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:320:17\n    │\n320 │         vm.warp(block.timestamp + 10);\n    │         ────────━━━━━━━━━━━━━━━────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n333 │         vm.warp(block.timestamp + 10);\n    │         ───────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:333:17\n    │\n333 │         vm.warp(block.timestamp + 10);\n    │         ────────━━━━━━━━━━━━━━━────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:337:17\n    │\n337 │         vm.warp(block.timestamp + 10);\n    │         ────────━━━━━━━━━━━━━━━────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:101:68\n    │\n101 │         return KingRouter.Order(buy, exactInput, amount, limit, 0, block.timestamp + 120, must);\n    │                                                                    ━━━━━━━━━━━━━━━\n    ‡\n438 │         vm.warp(block.timestamp + bound(waitTime, 0, 365 days));\n    │         ─────────────────────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/King.t.sol:438:17\n    │\n438 │         vm.warp(block.timestamp + bound(waitTime, 0, 365 days));\n    │         ────────━━━━━━━━━━━━━━━──────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Invariants.t.sol:28:17\n   │\n28 │         vm.warp(block.timestamp + bound(delay, 0, 10000));\n   │         ────────━━━━━━━━━━━━━━━────────────────────────── `vm.warp` changes 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":1246,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_launchTenEthMarketCapAndNinetyPercentTokenOnly() (gas: 4909421)\n[PASS] test_saltFinderUsesGivenFactoryAndConstructorArguments() (gas: 3667692)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 108.30ms (49.36ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] testFuzz_feeModesAcrossAntiSnipe(uint16,uint96) (runs: 256, μ: 657895, ~: 614165)\n[PASS] test_contractWalletIsKingNotOriginAndRefundReentrancyFails() (gas: 1274218)\n[PASS] test_exactOutputSellInsufficientFillRollsBackDethroneAndFee() (gas: 854332)\n[PASS] test_invalidOrdersDoNotMoveAssets() (gas: 320781)\n[PASS] test_partialSellChargesActualOutputAndUnspentTokensStayWithSeller() (gas: 856095)\n[PASS] test_rejectingTeamCannotBlockTradingAndFailedClaimPreservesCredit() (gas: 824665)\n[PASS] test_wrongPoolInitializationRejected() (gas: 11336129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 160.02ms (221.85ms CPU time)\n\nRan 19 tests for test/King.t.sol:KingTest\n[PASS] testFuzz_feeSolvencyRoundTrip(uint96,uint32) (runs: 256, μ: 1184725, ~: 1191665)\n[PASS] test_antiSnipeLinearDecayAndEmptyThrone() (gas: 865187)\n[PASS] test_bothDirectionsAndExactModesAlwaysChargeNative() (gas: 1279260)\n[PASS] test_claimReentrancyAndRejectingReceiver() (gas: 1330082)\n[PASS] test_firstBuyOnEmptyNativeManagerAndSplit() (gas: 397470)\n[PASS] test_kingAnySellDethronesButOtherSellsDoNot() (gas: 1346079)\n[PASS] test_liquidityChangesDoNotAffectGame() (gas: 761580)\n[PASS] test_mustTakeRevertsAtomicallyBeforeGameAndBelowPrice() (gas: 1007015)\n[PASS] test_partialExactOutputAndSlippageRevert() (gas: 1031116)\n[PASS] test_partialInputFeeUsesOnlySettledEthAndRefunds() (gas: 614446)\n[PASS] test_perSecondIncomeAndClaimsAfterDethroning() (gas: 1437887)\n[PASS] test_permissionlessDethroneAfterTransferStopsIncomeNow() (gas: 869825)\n[PASS] test_permissionsInitializationAndUnauthorizedCallbacks() (gas: 11839669)\n[PASS] test_sameTimestampFlashRoundTripCannotFarmPool() (gas: 1104082)\n[PASS] test_takeoverThresholdSingleBuyAndPriceDecay() (gas: 1171431)\n[PASS] test_teamPullFixedRecipient() (gas: 513373)\n[PASS] test_tokenAllowanceFailureAndNoMint() (gas: 89276)\n[PASS] test_tokenFixedSupplyAndPlainTransfer() (gas: 202363)\n[PASS] test_untrustedRouterAndSpoofedIdentityRejected() (gas: 23159)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 192.18ms (236.82ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:KingInvariantTest\n[PASS]\nKingInvariantTest invariants:\n[PASS] invariant_creditAndTokenConservation\n[PASS] invariant_nativeClaimsExactlyBackEveryLiability\n KingInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-------------+---------------------+-------+---------+----------╮\n| Contract    | Selector            | Calls | Reverts | Discards |\n+================================================================+\n| GameHandler | buy                 | 513   | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| GameHandler | claim               | 512   | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| GameHandler | sell                | 525   | 0       | 0        |\n|-------------+---------------------+-------+---------+----------|\n| GameHandler | transferAndDethrone | 498   | 0       | 0        |\n╰-------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.13s (1.08s CPU time)\n\nRan 4 test suites in 1.13s (1.59s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true},{"durationMs":71,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KingHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"KingHook.claim(address)\",\"KingHook.claimTeam()\",\"KingHook.dethrone()\",\"KingHook.unlockCallback(bytes)\",\"KingRouter.receive()\",\"KingRouter.swap((bool,bool,uint256,uint256,uint160,uint256,bool))\",\"KingRouter.unlockCallback(bytes)\",\"KingToken.approve(address,uint256)\",\"KingToken.transfer(address,uint256)\",\"KingToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":83,\"docs/DEPENDENCIES.md\":11,\"docs/DEPLOYMENT.md\":49,\"docs/INDEPENDENT_REVIEW.md\":85,\"docs/VALIDATION.md\":33,\"foundry.toml\":20,\"launch.parameters.json\":19,\"script/MineKing.s.sol\":27,\"src/Guard.sol\":13,\"src/HookFlags.sol\":28,\"src/KingHook.sol\":260,\"src/KingRouter.sol\":122,\"src/KingToken.sol\":45,\"src/LaunchParameters.sol\":28,\"test/Adversarial.t.sol\":155,\"test/Invariants.t.sol\":100,\"test/King.t.sol\":447,\"test/Launch.t.sol\":48,\"test/mocks/MockERC20.sol\":10,\"web/abi.json\":1,\"web/app.js\":132,\"web/config.json\":7,\"web/index.html\":15,\"web/style.css\":1,\"web/vendor/ethers.LICENSE.md\":21,\"web/vendor/ethers.min.js\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1538,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) uses arbitrary from in transferFrom: ! token.transferFrom(trader,address(manager),tokens) (src/KingRouter.sol#102)\n[high/medium] arbitrary-send-eth at src/KingRouter.sol:114: KingRouter._send(address,uint256) (src/KingRouter.sol#114-117) sends eth to arbitrary user\n[medium/high] incorrect-equality at src/KingHook.sol:174: KingHook.pendingIncome() (src/KingHook.sol#174-182) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KingHook.sol:174: KingHook.pendingIncome() (src/KingHook.sol#174-182) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KingHook.sol:224: KingHook.claim(address) (src/KingHook.sol#224-233) uses a dangerous strict equality:\n[medium/medium] unused-return at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) ignores return value by manager.settleFor{value: fee}(hook) (src/KingRouter.sol#98)\n[medium/medium] unused-return at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) ignores return value by manager.settle() (src/KingRouter.sol#103)\n[medium/medium] unused-return at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) ignores return value by manager.settle{value: ethAmount}() (src/KingRouter.sol#97)\n[medium/medium] unused-return at src/KingHook.sol:244: KingHook._redeem(address,uint256) (src/KingHook.sol#244-248) ignores return value by poolManager.unlock() (src/KingHook.sol#247)\n[medium/medium] unused-return at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) ignores return value by manager.settleFor{value: fee}(hook) (src/KingRouter.sol#107)\n[low/medium] missing-zero-check at src/KingRouter.sol:41: KingRouter.constructor(IPoolManager,KingToken,address).hook_ (src/KingRouter.sol#41) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/KingRouter.sol:53: Reentrancy in KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#53-64):\n[low/medium] reentrancy-events at src/KingRouter.sol:66: Reentrancy in KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112):\n[low/medium] timestamp at src/KingHook.sol:174: KingHook.pendingIncome() (src/KingHook.sol#174-182) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:165: KingHook.thronePrice() (src/KingHook.sol#165-171) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:113: KingHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/KingHook.sol#113-151) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:196: KingHook._accrue() (src/KingHook.sol#196-205) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:153: KingHook.feeBps() (src/KingHook.sol#153-157) uses timestamp for comparisons\n[low/medium] timestamp at src/KingHook.sol:224: KingHook.claim(address) (src/KingHook.sol#224-233) uses timestamp for comparisons\n[low/medium] timestamp at src/KingRouter.sol:53: KingRouter.swap(KingRouter.Order) (src/KingRouter.sol#53-64) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/KingRouter.sol:66: KingRouter.unlockCallback(bytes) (src/KingRouter.sol#66-112) uses arbitrary from in transferFrom: ! token.transferFrom(trader,address(manager),tokens) (src/KingRouter.sol#102)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"d51f66ee1096a33e6aedad45f11bc1f10a529f8c66b2bf30a9ed8fc20f36b994","verifiedTreeHash":"088025d17adb4cf1146bef30fdc3cc02924b6d77","verifierVersion":"0.1.0+e6140b7a"}]}