{"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":"f4c6c94f-30c2-45be-8a4d-313ff9cf3b3d","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"32a568098a434cd2eb07695c915bea8432da59c9b6d1f1a914b75e4e6cd73513","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"}],"objective":"Build Keel v2 contracts (part 1 of 2): a memecoin launchpad on Uniswap v4. Foundry, Solidity 0.8.26, tests on a mainnet fork. Code only: no deployment, no broadcast.\n\nCONTRACTS\n1. KeelV2Token: ERC20 clone, 1e9 supply, 18 decimals, minted once to the factory. No owner, no mint, no transfer limits. Balance checkpoints: balanceAt(account, blockNumber) returns the balance at the end of that block; written on every balance change incl. transfers to/from the PoolManager.\n2. KeelV2Hook: one shared hook for all pools. Not upgradeable. Holds all fee money. Request the full permission set future modules may need: afterInitialize, beforeAddLiquidity, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta.\n3. KeelV2Factory: launch(name, symbol, metadata, quote, startTick, baseFeeBps). Clones token, creates pool token/quote (LP fee 0, this hook), adds the whole supply single-sided from startTick up, liquidity locked forever. Caller becomes creator.\n4. FixedRateModule: first rules module (below).\n5. script/Deploy.s.sol: deploys all, mines the hook CREATE2 salt, takes an explicit owner address. Dry run only.\n\nRULES MODULES\n- Interface: feeBps(poolId, isBuy, context) view returns uint16. Modules hold no money and cannot move funds.\n- At launch the pool stores the current module address; it is immutable and the owner has no function to change it. Owner may register a new module only for future launches.\n- FixedRateModule: returns the creator's base rate (100 to 500 bps). Creator may lower it any time; a raise is at most +100 bps, scheduled, applied after 24 h, cancellable.\n\nFEES (hook)\n- Fee always taken in the quote currency: from input on buys, from output on sells. Never sell the meme token for fees. Only exact-input swaps are supported; exact-output swaps must revert.\n- Split of the base fee: 80% creator, 20% team, fixed in code. Round the total fee up; creator gets 80% of it rounded down, team gets the rest. Math must be correct for 6, 8 and 18 decimal quotes.\n- Launch schedule: scheduled rate starts at 9900 bps and falls linearly to the base rate over decaySeconds (30 to 600, default 120). Effective rate = max(scheduled rate, current base rate). A base rate change during the schedule does not restart it. The part above base goes 100% to team. No wallet is exempt.\n- Fees accrue per pool; claimCreator(token, to) and claimTeam(quote, to), where to may be any address incl. contracts. Funds leave the hook only via these claims and swap settlement.\n- Only the factory adds liquidity; nobody removes it.\n\nCREATOR ROLE\n- transferCreator by creator. lastActive updates on any creator action and ping().\n- setCreatorByTakeover(token, newCreator): callable only by a takeover contract the owner may set once (unset in this part), and only if lastActive is older than 30 days. The hook itself enforces this check; the takeover contract cannot bypass it. Already accrued fees stay with the old creator.\n\nOWNER (multisig)\n- Pause new launches, allowlist quote bases (ETH plus ERC20s; reject fee-on-transfer and rebasing; support 6, 8, 18 decimals), startTick bounds per base, decaySeconds and module for new launches, team recipient, set takeover contract once. Two-step ownership.\n- Owner can never change an existing pool's module, rate, split, creator, liquidity or accrued fees.\n\nINVARIANTS\n- For each quote: hook balance >= all unclaimed fees.\n- No selfdestruct, no delegatecall, reentrancy-safe claims.\n\nTESTS\nLaunch with ETH and with a 6-decimal base; locked liquidity; outside liquidity add reverts; fee on buys and sells; 80/20 split and rounding; launch schedule at several timestamps; creator lowers the rate during the schedule; module fixed per pool after a new module is registered; rate lower and raise rules; takeover hook rejects early and unknown callers; exact-output revert; pause and owner limits; claims; fuzz the balance invariant.\n\nDeliver: src, test, script, README listing every parameter, event, owner power and known limits.\n\nToken name: kkkkk\nToken symbol: lllll","parentJobId":null,"planHash":"5e207aab499b765743b897cd2fd6167854db586cebd39145c7c7b050ca009f9d","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f4c6c94f-30c2-45be-8a4d-313ff9cf3b3d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2320-kkkkk"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51044","feedbackHash":"6b68cb3e4f26e0a1a057fde24e857338868a2e30832d1a78aab178f24c41bf49","nodeKey":"build_contract_project","submissionHash":"32a568098a434cd2eb07695c915bea8432da59c9b6d1f1a914b75e4e6cd73513","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50981","feedbackHash":"c0456c531d1b4cbc95e1a4a28318dbd5538a609a11df5473935a06ab181ac78c","nodeKey":"build_contract_project","submissionHash":"573e34844eae53cd34e7aebeed1763cf99873175c23e91a99472d617421f8cc0","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"a6d0675fcdac414ba6719336d826268f006e4b38026567325ab4f7aa8657e07a","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"c653c9ba9ec35f5a8dca814b4fea2a9447f0e1089489d8254f325a913720d734","device":"42423bf7250e09c0","findings":[],"hash":"32a568098a434cd2eb07695c915bea8432da59c9b6d1f1a914b75e4e6cd73513","nodeId":"a126384a-8f68-444d-8b50-0487eb468182","outcome":"completed","summary":"Implemented contracts, tests, dry-run script, and documentation.\n\n- 55 offline checks passed; 56 mainnet-fork checks passed.\n- Required seed and second seed with 1,024 fuzz runs passed.\n- Build, formatting, and size checks passed.\n- Slither: zero high-severity findings.\n\n[README](README.md) documents parameters, owner powers, clone design, and quote-token assumptions. [REVIEW.md](REVIEW.md) records validation and remaining limitations. No transactions were broadcast.","treeHash":"bf625b54046d659bd4be221b099cccd59f89cbd4","usage":{"cachedInputTokens":8423168,"inputTokens":174975,"model":"gpt-6-astra","outputTokens":85383,"runtime":"codex","turns":14,"wallClockMs":2527669}},{"artifacts":[],"attempt":1,"bundleHash":"8a8640fba26fb207f16a5ef5d32c54c6a715ae1c1e19edd18e114803ba0b9d25","device":"5739ce0d803a43cd","findings":[],"hash":"573e34844eae53cd34e7aebeed1763cf99873175c23e91a99472d617421f8cc0","nodeId":"a126384a-8f68-444d-8b50-0487eb468182","outcome":"completed","summary":"","treeHash":"5162cfc6a0c9b63a466bccd298e1a2edaf656567","usage":{"cachedInputTokens":6273714,"inputTokens":1890,"model":"claude-fable-5-1","outputTokens":110983,"runtime":"claude","turns":61,"wallClockMs":1520652}}],"verification":[{"checks":[{"durationMs":47662,"exitCode":0,"name":"build","output":"Compiling 86 files with Solc 0.8.26\nSolc 0.8.26 finished in 47.57s\nCompiler run successful!\n","passed":true},{"durationMs":717,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Math.t.sol:MathTest\n[PASS] testFuzz_bitScansAgainstDivisionReference(uint256) (runs: 256, μ: 13455, ~: 9370)\n[PASS] testFuzz_fullWidthMultiplicationAndDivision(uint256,uint256) (runs: 256, μ: 5313, ~: 5083)\n[PASS] test_allPowerOfTwoBoundaries() (gas: 697936)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.66ms (6.92ms CPU time)\n\nRan 1 test for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_mainnetRealUSDCAndETH() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 5.75ms (32.07µs CPU time)\n\nRan 9 tests for test/Rules.t.sol:RulesTest\n[PASS] test_allCreatorActionsRefreshActivity() (gas: 1777980)\n[PASS] test_creatorTransferAndPendingRaiseControl() (gas: 1735071)\n[PASS] test_lowerImmediateCancelsPending() (gas: 1481862)\n[PASS] test_moduleImmutablePerPool() (gas: 2797743)\n[PASS] test_pingAndModuleActionDelayTakeover() (gas: 1582007)\n[PASS] test_raiseDelayAndBoundaryAndCancellation() (gas: 1681548)\n[PASS] test_rateGuardsAndUnauthorized() (gas: 1725513)\n[PASS] test_rescheduleRestartsRaiseDelay() (gas: 1533353)\n[PASS] test_takeoverUnknownEarlyBoundaryAndSuccess() (gas: 2551105)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 8.60ms (6.93ms CPU time)\n\nRan 2 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_dryRunRejectsWrongChainAndMissingOwner() (gas: 5881963)\n[PASS] test_dryRunWiringExplicitOwnerAndPermissions() (gas: 13817659)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.91ms (4.12ms CPU time)\n\nRan 13 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_bothAddressOrderings() (gas: 33767373)\n[PASS] test_callbackAndUnknownPoolGuards() (gas: 1459627)\n[PASS] test_canDisableQuoteWhoseMetadataBreaks() (gas: 54409)\n[PASS] test_decayModuleAndTakeoverGuards() (gas: 348949)\n[PASS] test_launch6and8and18DecimalQuotes() (gas: 6630781)\n[PASS] test_launchETHWholeSupplyLockedAndCheckpointed() (gas: 1387810)\n[PASS] test_launchValidation() (gas: 398083)\n[PASS] test_outsideAddAndRemoveRevert() (gas: 1436225)\n[PASS] test_ownerGuardsAndTwoStep() (gas: 387081)\n[PASS] test_ownerPowersApplyOnlyToFuturePools() (gas: 1916010)\n[PASS] test_pauseOnlyNewLaunches() (gas: 3031988)\n[PASS] test_quoteClassificationAndBounds() (gas: 1974113)\n[PASS] test_realSwapsCheckpointPoolManagerAndTrader() (gas: 2120023)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 18.32ms (21.29ms CPU time)\n\nRan 5 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_balanceAtMatchesHistory(uint8,uint256) (runs: 256, μ: 2381087, ~: 1644970)\nLogs:\n  Bound result 25\n  Bound result 571962906239212514031297037\n  Bound result 132108504077060987483998485\n  Bound result 382244306215083571312542705\n  Bound result 376753809478807060252387553\n  Bound result 12661858245335506252777820\n  Bound result 82694190599711429683091961\n  Bound result 186525598253124909030955642\n  Bound result 346743888028091454945454104\n  Bound result 5967766453318225408278257\n  Bound result 157900931449122555853729409\n  Bound result 178952945244442085008831\n  Bound result 288864776881167174548669953\n  Bound result 21054518595266721934838335\n  Bound result 320654655756639937066099671\n  Bound result 42879905971727971059064806\n  Bound result 30644348102378376331974314\n  Bound result 8538680786123569616138243\n  Bound result 429974392508136548143238850\n  Bound result 111000534888607921117337478\n  Bound result 62913890119514481993354176\n  Bound result 254949623509580723764205062\n  Bound result 149838766522426351236920045\n  Bound result 92549976776280294099998644\n  Bound result 45903080950285561833789283\n  Bound result 261397138826444759184552278\n\n[PASS] test_allowanceAndTransferFailures() (gas: 272217)\n[PASS] test_checkpointsSameBlockPoolManagerAndSelfTransfer() (gas: 612594)\n[PASS] test_erc20AndExactBalances() (gas: 402310)\n[PASS] test_noOwnerMintOrReinitialize() (gas: 81339)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 59.76ms (60.19ms CPU time)\n\nRan 22 tests for test/Fees.t.sol:FeesTest\n[PASS] testFuzz_balanceInvariant(uint96[6],uint8,uint16) (runs: 256, μ: 5023920, ~: 5289256)\nLogs:\n  Bound result 2\n  Bound result 237\n  Bound result 901027\n  Bound result 900151\n  Bound result 914654\n  Bound result 903128\n  Bound result 915252\n  Bound result 916179\n\n[PASS] testFuzz_roundingConserves(uint128,uint16,uint16) (runs: 256, μ: 19839, ~: 19859)\nLogs:\n  Bound result 358\n  Bound result 4096\n\n[PASS] test_buySellFeeSplitForAllDecimals() (gas: 8930717)\n[PASS] test_buyUsesSingleRateSnapshot() (gas: 2130022)\n[PASS] test_creatorAndTeamClaimsToContractsReentrancyAndFailure() (gas: 2333695)\n[PASS] test_creatorTransferPreservesOldCreditAndActivity() (gas: 2129880)\n[PASS] test_erc20ClaimsAndInvalidRecipients() (gas: 2169100)\n[PASS] test_exactOutputAndTinyBuyRevert() (gas: 1505300)\n[PASS] test_invalidModuleRateCannotCollectFees() (gas: 1566349)\n[PASS] test_lowerDuringScheduleDoesNotRestartClock() (gas: 1843823)\n[PASS] test_multiplePoolsSameQuoteAggregateClaims() (gas: 3546272)\n[PASS] test_negativeRebasePreventsPreferentialClaim() (gas: 2006827)\n[PASS] test_noCreatorOwnerOrTeamExemption() (gas: 2249725)\n[PASS] test_partialBuyRevertsWithoutAccruingFee() (gas: 1644465)\n[PASS] test_raiseChangesSwapRateAfterExplicitApplication() (gas: 1837928)\n[PASS] test_reentrancyCannotClaimAnotherLiveCredit() (gas: 2072914)\n[PASS] test_scheduleAtSeveralTimesAndExtraAllToTeam() (gas: 2840110)\n[PASS] test_scheduledRateRoundsUp() (gas: 1286669)\n[PASS] test_taxedOrFailedPayoutPreservesCredit() (gas: 2348651)\n[PASS] test_taxedReceiptRollsBackSwapAndFeeCredits() (gas: 1820210)\n[PASS] test_teamRecipientChangePreservesAccruedOwnership() (gas: 2145880)\n[PASS] test_unauthorizedClaimsCannotRedirectCredits() (gas: 1789195)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 189.30ms (210.85ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:FeeInvariantTest\n[PASS]\nFeeInvariantTest invariants:\n[PASS] invariant_feesFullyBackedAndExactlyAttributed\n[PASS] invariant_fixedSupplyAndLockedPosition\n FeeInvariantTest invariants (runs: 128, calls: 4096, reverts: 0)\n\n╭------------+-----------------+-------+---------+----------╮\n| Contract   | Selector        | Calls | Reverts | Discards |\n+===========================================================+\n| FeeHandler | advance         | 591   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | buy             | 582   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | claim           | 563   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | lower           | 568   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | sell            | 611   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | transferCreator | 586   | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | transferTeam    | 595   | 0       | 0        |\n╰------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171241\n  Bound result 2468\n  Bound result 19900000000005021\n  Bound result 5451\n  Bound result 19900000000007965\n  Bound result 8333424497131156\n  Bound result 24988638073025468214899659\n  Bound result 3\n  Bound result 12589\n  Bound result 19900000000014468\n  Bound result 787\n  Bound result 19900000000007985\n  Bound result 310\n  Bound result 18049\n  Bound result 2618\n  Bound result 19900000000006706\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 624.51ms (613.20ms CPU time)\n\nRan 8 test suites in 626.83ms (919.81ms CPU time): 55 tests passed, 0 failed, 1 skipped (56 total tests)\n","passed":true},{"durationMs":48,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FixedRateModule.applyRaise(bytes32)\",\"FixedRateModule.cancelRaise(bytes32)\",\"FixedRateModule.initialize(bytes32,uint16)\",\"FixedRateModule.lowerRate(bytes32,uint16)\",\"FixedRateModule.scheduleRaise(bytes32,uint16)\",\"KeelV2Factory.acceptOwnership()\",\"KeelV2Factory.configureQuote(address,bool,int24,int24,bool,bool)\",\"KeelV2Factory.initialize(address,address)\",\"KeelV2Factory.launch(string,string,string,address,int24,uint16)\",\"KeelV2Factory.registerModule(address)\",\"KeelV2Factory.setDecaySeconds(uint32)\",\"KeelV2Factory.setLaunchesPaused(bool)\",\"KeelV2Factory.setTakeoverContract(address)\",\"KeelV2Factory.setTeamRecipient(address)\",\"KeelV2Factory.transferOwnership(address)\",\"KeelV2Factory.unlockCallback(bytes)\",\"KeelV2Hook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeelV2Hook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeelV2Hook.claimCreator(address,address)\",\"KeelV2Hook.claimTeam(address,address)\",\"KeelV2Hook.creatorAction(bytes32,address)\",\"KeelV2Hook.ping(address)\",\"KeelV2Hook.receive()\",\"KeelV2Hook.registerPool((address,address,uint24,int24,address),address,address,address,address,uint16,uint32)\",\"KeelV2Hook.setCreatorByTakeover(address,address)\",\"KeelV2Hook.transferCreator(address,address)\",\"KeelV2Token.approve(address,uint256)\",\"KeelV2Token.transfer(address,uint256)\",\"KeelV2Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":5,\"README.md\":171,\"REVIEW.md\":80,\"foundry.toml\":26,\"script/Deploy.s.sol\":70,\"src/FixedRateModule.sol\":109,\"src/KeelV2Factory.sol\":297,\"src/KeelV2Hook.sol\":359,\"src/KeelV2Token.sol\":94,\"src/interfaces/IRulesModule.sol\":18,\"src/libraries/Guard.sol\":14,\"src/libraries/QuoteTransfer.sol\":27,\"test/Deploy.t.sol\":43,\"test/Fees.t.sol\":444,\"test/Invariant.t.sol\":185,\"test/Launch.t.sol\":267,\"test/MainnetFork.t.sol\":34,\"test/Math.t.sol\":45,\"test/Rules.t.sol\":197,\"test/Token.t.sol\":113,\"test/support/KeelTest.sol\":130,\"test/support/MockQuote.sol\":67,\"test/support/Router.sol\":82,\"test/support/TestModules.sol\":37},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3833,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/FixedRateModule.sol:93: FixedRateModule._creator(bytes32) (src/FixedRateModule.sol#93-96) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FixedRateModule.sol:48: FixedRateModule.feeBps(bytes32,bool,bytes) (src/FixedRateModule.sol#48-52) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/KeelV2Token.sol:86: KeelV2Token._checkpoint(address) (src/KeelV2Token.sol#86-93) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/FixedRateModule.sol:82: Reentrancy in FixedRateModule.applyRaise(bytes32) (src/FixedRateModule.sol#82-91):\n[medium/medium] reentrancy-no-eth at src/FixedRateModule.sol:74: Reentrancy in FixedRateModule.cancelRaise(bytes32) (src/FixedRateModule.sol#74-79):\n[medium/medium] reentrancy-no-eth at src/FixedRateModule.sol:54: Reentrancy in FixedRateModule.lowerRate(bytes32,uint16) (src/FixedRateModule.sol#54-62):\n[medium/medium] reentrancy-no-eth at src/FixedRateModule.sol:64: Reentrancy in FixedRateModule.scheduleRaise(bytes32,uint16) (src/FixedRateModule.sol#64-72):\n[medium/medium] reentrancy-no-eth at src/KeelV2Factory.sol:248: Reentrancy in KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#248-278):\n[medium/medium] uninitialized-local at src/KeelV2Token.sol:62: KeelV2Token.balanceAt(address,uint256).low (src/KeelV2Token.sol#62) is a local variable never initialized\n[medium/medium] unused-return at src/KeelV2Factory.sol:195: KeelV2Factory.launch(string,string,string,address,int24,uint16) (src/KeelV2Factory.sol#195-241) ignores return value by poolManager.initialize(key,TickMath.getSqrtPriceAtTick(startTick)) (src/KeelV2Factory.sol#236)\n[medium/medium] unused-return at src/KeelV2Factory.sol:195: KeelV2Factory.launch(string,string,string,address,int24,uint16) (src/KeelV2Factory.sol#195-241) ignores return value by poolManager.unlock(abi.encode(token)) (src/KeelV2Factory.sol#238)\n[medium/medium] unused-return at src/KeelV2Factory.sol:195: KeelV2Factory.launch(string,string,string,address,int24,uint16) (src/KeelV2Factory.sol#195-241) ignores return value by poolManager.initialize(key,TickMath.getSqrtPriceAtTick(- startTick)) (src/KeelV2Factory.sol#236)\n[medium/medium] unused-return at src/KeelV2Factory.sol:248: KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#248-278) ignores return value by poolManager.settle() (src/KeelV2Factory.sol#272)\n[medium/medium] unused-return at src/KeelV2Factory.sol:248: KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#248-278) ignores return value by (delta,None) = poolManager.modifyLiquidity(info.key,ModifyLiquidityParams(info.tickLower,info.tickUpper,int256(uint256(info.liquidity)),bytes32(0)),) (src/KeelV2Factory.sol#254-260)\n[low/medium] reentrancy-benign at src/KeelV2Factory.sol:195: Reentrancy in KeelV2Factory.launch(string,string,string,address,int24,uint16) (src/KeelV2Factory.sol#195-241):\n[low/medium] reentrancy-benign at src/KeelV2Factory.sol:195: Reentrancy in KeelV2Factory.launch(string,string,string,address,int24,uint16) (src/KeelV2Factory.sol#195-241):\n[low/medium] reentrancy-events at src/FixedRateModule.sol:54: Reentrancy in FixedRateModule.lowerRate(bytes32,uint16) (src/FixedRateModule.sol#54-62):\n[low/medium] reentrancy-events at src/FixedRateModule.sol:74: Reentrancy in FixedRateModule.cancelRaise(bytes32) (src/FixedRateModule.sol#74-79):\n[low/medium] reentrancy-events at src/FixedRateModule.sol:82: Reentrancy in FixedRateModule.applyRaise(bytes32) (src/FixedRateModule.sol#82-91):\n[low/medium] reentrancy-events at src/KeelV2Factory.sol:248: Reentrancy in KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#248-278):\n[low/medium] reentrancy-events at src/FixedRateModule.sol:64: Reentrancy in FixedRateModule.scheduleRaise(bytes32,uint16) (src/FixedRateModule.sol#64-72):\n[low/medium] timestamp at src/KeelV2Hook.sol:168: KeelV2Hook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/KeelV2Hook.sol#168-187) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:282: KeelV2Hook._rates(bytes32,KeelV2Hook.Pool,bool,bytes) (src/KeelV2Hook.sol#282-299) uses timestamp for comparisons\n[low/medium] timestamp at src/FixedRateModule.sol:82: FixedRateModule.applyRaise(bytes32) (src/FixedRateModule.sol#82-91) uses timestamp for comparisons\n[low/medium] timestamp at src/FixedRateModule.sol:48: FixedRateModule.feeBps(bytes32,bool,bytes) (src/FixedRateModule.sol#48-52) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:254: KeelV2Hook.setCreatorByTakeover(address,address) (src/KeelV2Hook.sol#254-260) uses timestamp for comparisons\n[low/medium] timestamp at src/FixedRateModule.sol:40: FixedRateModule.initialize(bytes32,uint16) (src/FixedRateModule.sol#40-46) uses timestamp for comparisons\n[low/medium] timestamp at src/FixedRateModule.sol:93: FixedRateModule._creator(bytes32) (src/FixedRateModule.sol#93-96) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:317: KeelV2Hook._pay(address,address,uint256) (src/KeelV2Hook.sol#317-332) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:216: KeelV2Hook.splitFee(uint256,uint16,uint16) (src/KeelV2Hook.sol#216-225) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:301: KeelV2Hook._accrue(bytes32,KeelV2Hook.Pool,uint256,uint256) (src/KeelV2Hook.sol#301-315) uses timestamp for comparisons","passed":true},{"durationMs":483,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/KeelV2Factory.sol:119: Reentrancy: State change after external call (6 places)\n[low] centralization-risk at src/KeelV2Factory.sol:127: Centralization Risk (7 places)\n[low] large-numeric-literal at src/KeelV2Factory.sol:43: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/KeelV2Factory.sol:163: Literal Instead of Constant (11 places)\n[low] missing-inheritance at src/KeelV2Token.sol:5: Missing Inheritance\n[low] non-reentrant-not-first at src/KeelV2Hook.sol:171: `nonReentrant` is Not the First Modifier (2 places)\n[low] state-variable-could-be-immutable at src/KeelV2Token.sol:11: State Variable Could Be Immutable (2 places)\n[low] unchecked-return at src/KeelV2Factory.sol:236: Unchecked Return (5 places)\n[low] unsafe-erc20-operation at src/KeelV2Factory.sol:271: Unsafe ERC20 Operation","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"32a568098a434cd2eb07695c915bea8432da59c9b6d1f1a914b75e4e6cd73513","verifiedTreeHash":"bf625b54046d659bd4be221b099cccd59f89cbd4","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":55769,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 55.65s\nCompiler run successful!\n","passed":true},{"durationMs":293,"exitCode":1,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[FAIL: FutureBlock(); counterexample: calldata=0x05b7bbfb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026b98338c2a5ddd1e60a6fb99f4371f args=[0, 3217118765708221101860438712798951199 [3.217e36]]] testFuzz_token_balanceAtMatchesHistory(uint8,uint256) (runs: 0, μ: 0, ~: 0)\n[PASS] test_token_checkpoints_transfersAndPoolManager() (gas: 2002533)\n[FAIL: assertion failed: 492310312515202701624608489 != 492310312515202701624608490] test_token_erc20Basics() (gas: 1585216)\n[PASS] test_token_noOwnerNoMint() (gas: 910067)\nSuite result: FAILED. 2 passed; 2 failed; 0 skipped; finished in 15.15ms (6.33ms CPU time)\n\nRan 13 tests for test/Rules.t.sol:RulesTest\n[FAIL: NoPendingRaise()] test_creatorActionsViaModuleRefreshLastActive() (gas: 957949)\n[FAIL: NotCreator()] test_creator_transferAndPing() (gas: 1526011)\n[FAIL: NotCreator()] test_moduleFixedPerPool() (gas: 2887954)\n[PASS] test_registerModuleGuards() (gas: 43304)\n[PASS] test_rules_initPoolGuards() (gas: 917001)\n[PASS] test_rules_lower() (gas: 1108890)\n[PASS] test_rules_lowerCancelsPendingRaise() (gas: 961086)\n[PASS] test_rules_moduleHoldsNoFunds() (gas: 1253360)\n[PASS] test_rules_raiseAffectsSwapsAfterDelay() (gas: 1566482)\n[PASS] test_rules_raiseCancel() (gas: 1054741)\n[PASS] test_rules_raiseScheduledAndApplied() (gas: 1205913)\n[PASS] test_takeover_rejectsUnknownCallersAndEarly() (gas: 1261709)\n[PASS] test_takeover_succeedsAfterInactivity_feesStayWithOldCreator() (gas: 1962832)\nSuite result: FAILED. 10 passed; 3 failed; 0 skipped; finished in 30.70ms (12.82ms CPU time)\n\nRan 27 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_deploy_requiresOwner() (gas: 9879656)\n[PASS] test_deploy_runWithMainnetPoolManagerAddress() (gas: 19990673)\n[PASS] test_deploy_wiring() (gas: 55268)\n[PASS] test_hook_callbacksOnlyPoolManager() (gas: 916941)\n[PASS] test_hook_receiveOnlyPoolManager() (gas: 36327)\n[PASS] test_launch_bothOrderings() (gas: 4876577)\n[PASS] test_launch_eth() (gas: 1076693)\n[PASS] test_launch_eventAndReturn() (gas: 825835)\n[PASS] test_launch_revertsInvalidRate() (gas: 80035)\n[PASS] test_launch_revertsQuoteNotAllowed() (gas: 692773)\n[PASS] test_launch_revertsTickNotAligned() (gas: 39917)\n[PASS] test_launch_revertsTickOutOfBounds() (gas: 70214)\n[PASS] test_launch_revertsWhenPaused() (gas: 923850)\n[PASS] test_launch_revertsWithoutModule() (gas: 21305274)\n[PASS] test_launch_usdc6Decimals() (gas: 1450739)\n[PASS] test_outsideLiquidityAddReverts() (gas: 911240)\n[PASS] test_outsideLiquidityRemoveReverts() (gas: 973142)\n[PASS] test_owner_cannotChangeExistingPool() (gas: 1024292)\n[PASS] test_owner_decayBounds() (gas: 1837236)\n[PASS] test_owner_onlyOwnerGuards() (gas: 261244)\n[PASS] test_owner_quoteAllowlistRules() (gas: 2573862)\n[PASS] test_owner_startTickBoundsPerBase() (gas: 1736078)\n[PASS] test_owner_takeoverContractSetOnce() (gas: 120451)\n[PASS] test_owner_twoStepOwnership() (gas: 222973)\n[PASS] test_tokenImplementationLocked() (gas: 37867)\n[PASS] test_unknownPoolWithHookCannotInitialize() (gas: 718765)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 32548)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 32.42ms (24.35ms CPU time)\n\nRan 17 tests for test/Fees.t.sol:FeesTest\n[PASS] testFuzz_balanceInvariant(uint256[6],uint8,uint32) (runs: 256, μ: 3517273, ~: 3606191)\n[PASS] testFuzz_split_conservesAndBounds(uint256,uint16,uint16) (runs: 256, μ: 8135, ~: 8139)\n[PASS] test_claims_eth() (gas: 1554447)\n[PASS] test_claims_fundsOnlyLeaveViaClaims() (gas: 1539571)\n[PASS] test_claims_guards() (gas: 54988778)\n[PASS] test_claims_reentrancyBlocked() (gas: 1840320)\n[PASS] test_claims_usdc() (gas: 1588445)\n[PASS] test_exactOutputReverts() (gas: 1446786)\n[PASS] test_fee_neverTakenInMemeToken() (gas: 1526828)\n[PASS] test_fee_onBuy_eth() (gas: 1298630)\n[PASS] test_fee_onSell_eth() (gas: 1558994)\n[PASS] test_fee_onSell_usdc() (gas: 1710281)\n[PASS] test_schedule_creatorLowersDuringSchedule() (gas: 1388199)\n[PASS] test_schedule_decaySecondsBounds() (gas: 888650)\n[PASS] test_schedule_premiumGoesToTeam() (gas: 1506074)\n[PASS] test_schedule_rateOverTime() (gas: 1007887)\n[PASS] test_split_rounding_examples() (gas: 22217)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 157.75ms (196.89ms CPU time)\n\nRan 4 test suites in 159.32ms (236.02ms CPU time): 56 tests passed, 5 failed, 0 skipped (61 total tests)\n\nFailing tests:\nEncountered 3 failing tests in test/Rules.t.sol:RulesTest\n[FAIL: NoPendingRaise()] test_creatorActionsViaModuleRefreshLastActive() (gas: 957949)\n[FAIL: NotCreator()] test_creator_transferAndPing() (gas: 1526011)\n[FAIL: NotCreator()] test_moduleFixedPerPool() (gas: 2887954)\n\nEncountered 2 failing tests in test/Token.t.sol:TokenTest\n[FAIL: FutureBlock(); counterexample: calldata=0x05b7bbfb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026b98338c2a5ddd1e60a6fb99f4371f args=[0, 3217118765708221101860438712798951199 [3.217e36]]] testFuzz_token_balanceAtMatchesHistory(uint8,uint256) (runs: 0, μ: 0, ~: 0)\n[FAIL: assertion failed: 492310312515202701624608489 != 492310312515202701624608490] test_token_erc20Basics() (gas: 1585216)\n\nEncountered a total of 5 failing tests, 56 tests succeeded\n\nTip: Run `forge test --rerun` to retry only the 5 failed tests\nTip: Run `forge test --debug --match-test <TEST_NAME>` to inspect one failing test in the debugger\n\nFuzz seed: 0x499dc327679faaf06b10ce7dcdb5c0fc53193f29b8cff9db2d228fc1e11100fb (use `--fuzz-seed` to reproduce)\n","passed":false}],"detail":"test failed with exit code 1","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"573e34844eae53cd34e7aebeed1763cf99873175c23e91a99472d617421f8cc0","verifiedTreeHash":"5162cfc6a0c9b63a466bccd298e1a2edaf656567","verifierVersion":"0.1.0+a26ee00d"}]}