{"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":"61b2582d-01da-4e15-8fd8-d397b3fac74d","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":"working"},{"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":"working"},{"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":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","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":"working"},{"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":"working"},{"acceptedSubmissionHash":"9fa16ee6665c34d66ff9c87fce3cbc58a0c821baa3ca6e904f668845c3a10f80","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"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"working"}],"objective":"{\n  \"objective\": \"Build Keel v2 smart contracts: permissionless memecoin launchpad on Uniswap v4. Foundry, Solidity 0.8.26, full tests. Do NOT deploy. v1 (github.com/forfun1111/keel-contracts) is style reference only. No IMD economics, basket, vouchers or build pulse.\\n\\n## Contracts\\n1. KeelV2Token: EIP-1167 clone. Name/symbol once. 1e9 supply, 18 decimals, minted to factory. Plain transfers, no restrictions, no owner, no mint, no tax. balanceAt(account, block) checkpoints on EVERY balance change (including PoolManager transfers during swaps). Test with swaps.\\n2. KeelV2Hook: one shared non-upgradeable v4 hook for all pools. Constructor(PoolManager, owner).\\n3. KeelV2Factory: permissionless launch in one tx.\\n4. KeelV2Takeover: community takeover of abandoned creator role.\\n\\n## Launch\\nlaunch(name, symbol, metadata, quote, startTick, feeBps):\\n- quote = ETH (address(0)) or ERC20 on owner allowlist. Fixed forever.\\n- startTick within owner bounds for that quote (price in quote units, no oracles).\\n- Clone token, create pool token/quote with hook, LP fee 0, add full supply as single-sided liquidity from startTick to max tick. Liquidity locked forever. Dust to 0x...dEaD.\\n- msg.sender = creator (gets no tokens).\\n- Emit Launched (metadata ≤1024 bytes).\\n- Owner can only pause new launches.\\n\\n## Fees (hook)\\n- Fee taken in QUOTE: from input on buys (beforeSwap + beforeSwapReturnDelta), from output on sells (afterSwap + afterSwapReturnDelta). Never sell meme inside swap, never convert.\\n- Exact-output reverts.\\n- Resting feeBps 100–500 (1–5%). Split 30% team / 70% creator. Fixed.\\n- Accrue in hook. claimCreator(token) / claimTeam(quote). No transfers inside swaps.\\n- Only factory may add liquidity. Nobody may remove it.\\n\\n## Fee changes\\n- Lower (min 100): immediate.\\n- Raise: scheduleRaise(newBps ≤ current+100 and ≤500). Applies after 24h via applyRaise. One pending. Cancelable. Events for site.\\n- No changes during decay.\\n\\n## Launch decay\\n- Starts at 9900 bps, falls linearly to feeBps over decaySeconds (owner-set, 30–600, default 120) from launch timestamp.\\n- Excess above feeBps → 100% team. Creator gets only 70% of resting part. No exemptions.\\n\\n## Creator\\n- Role = fee recipient + rate control. transferCreator by creator.\\n- lastActive updates on claimCreator, rate change, transferCreator, ping.\\n\\n## Takeover\\n- propose only if lastActive >30 days and proposer held ≥0.5% at previous block. One open proposal.\\n- Snapshot = proposal block-1. Vote 5 days. Weight = balanceAt(snapshot). Changeable.\\n- Circulating = totalSupply - PoolManager - 0x...dEaD at snapshot.\\n- Passes if yes>no AND yes≥10% circulating.\\n- 48h timelock, then execute moves creator role (old fees stay claimable by old creator).\\n- Any creator action during vote/timelock cancels. Failed/cancelled → 7 day cooldown.\\n- Only Takeover may call setCreatorByTakeover.\\n\\n## Owner powers (nothing more)\\n- Set team recipient; add/disable bases for NEW launches; set startTick bounds; set decaySeconds for NEW; pause launches.\\n- Cannot change existing token rate/split/creator/liquidity/fees. Two-step ownership.\\n- Allowlist rejects fee-on-transfer/rebasing (check received amounts). Support 6/8/18 decimals.\\n\\n## Security\\n- Hook flags match permissions. Mine salt in Deploy.s.sol (do not broadcast).\\n- Reentrancy-safe claims. CEI. Handle ETH + ERC20 via v4 settle/take.\\n- Solvency: for each quote, hook balance ≥ sum unclaimed fees.\\n- Funds leave hook ONLY via claimCreator/claimTeam (+swap settlement). No sweep/rescue/withdraw. No upgrade, selfdestruct, external delegatecall.\\n\\n## Tests (mainnet fork, real PoolManager)\\n- Launch ETH + 6-decimal base. Liquidity locked. Third-party add reverts.\\n- Fee math, 30/70, decay curve, excess to team.\\n- Rate lower/raise (limits, timing, cancel, apply). No changes during decay.\\n- Takeover: timing, balance, quorum, success, timelock, cancel, cooldown, post-snapshot votes ignored.\\n- Exact-output revert, pause, owner limits, claims, solvency fuzz.\\n\\n## Deliverables\\nsrc/, test/, script/Deploy.s.sol (dry-run only), README (architecture, params, events, owner powers, risks).\",\n  \"template\": \"impl_tests_review\",\n  \"references\": [\n    \"uniswap-v4-hooks\",\n    \"uniswap-v4-security\",\n    \"solidity-security-review\"\n  ],\n  \"github\": true\n}\n\nToken name: KKKK\nToken symbol: KKKKK","parentJobId":null,"planHash":"d91e93f747a84ec71db0179341e6ceed36dd1fc30faf649a369ea7b3747fd01b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"61b2582d-01da-4e15-8fd8-d397b3fac74d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2271-kkkk"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51318","feedbackHash":"80e05848cc6bbdd8f52189cc5cd606b57b990126e77f2b5e1e6031dac61301ef","nodeKey":"build_contract_project","submissionHash":"9fa16ee6665c34d66ff9c87fce3cbc58a0c821baa3ca6e904f668845c3a10f80","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"0ee2cfb100d780081d41035006b4d7210cdcb3f186610f703c2f625e7eeb1cf4","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"286825765a1b2bdec56863294b93f0c641886e64931f7672dac2f58a0cc239d4","device":"c7b1db4d25939bd5","findings":[],"hash":"9fa16ee6665c34d66ff9c87fce3cbc58a0c821baa3ca6e904f668845c3a10f80","nodeId":"bd708cba-28f6-449b-b780-c90c2e69ff25","outcome":"completed","summary":"Implemented all four contracts, vendored dependencies, tests, documentation, and dry-run deployment.\n\n- Clean build and formatting checks pass.\n- Offline: 54 tests pass; one fork-only test skipped.\n- Mainnet fork: all 55 tests pass.\n- Dry-run script passes. Nothing deployed or broadcast.\n\nDetails: [README](README.md) and [verification results](TESTING.md).","treeHash":"2774dd03352f54c5b987ae2fec8e2858289181b8","usage":{"cachedInputTokens":8430208,"inputTokens":181742,"model":"gpt-6-astra","outputTokens":81750,"runtime":"codex","turns":16,"wallClockMs":2360223}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6960837f8e61d811","findings":[],"hash":"cfb5c494f381649863c9d4bcf94514154895d4896a16e49c224a2b97e9b4bdc1","nodeId":"af7b860d-df10-49ea-a536-ca7869cebc36","outcome":"failed","summary":"needs input: The accepted implementation cannot be integrated through launch.json alone. KeelV2Hook validates that its address has low 14 bits 0x2acc, but the evm_contracts manifest cannot select a mined CREATE2 salt. None of the accepted application contracts can deploy the hook later. KeelV2DryRunDeployer is a simulation helper whose controller is constructor msg.sender, so deploying it through the project factory would leave the owner unable to use it. A production application deployer with an explicit owner argument and a function accepting an off-chain-mined salt requires a source change outside this assignment's launch.json-only scope. The existing manifest and accepted source have been left unchanged. — Can this task return to implementation to add and test a production hook deployer controlled by the explicit owner, then resume the evm_contracts manifest assignment?","treeHash":null,"usage":{"cachedInputTokens":999168,"inputTokens":93087,"model":"gpt-6-astra","outputTokens":8360,"runtime":"codex","turns":8,"wallClockMs":418622}}],"verification":[{"checks":[{"durationMs":70274,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 70.18s\nCompiler run successful!\n","passed":true},{"durationMs":534,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Mainnet.t.sol:MainnetTest\n[SKIP] testMainnetUSDCLaunchSwapCheckpointAndClaims() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 13.46ms (28.98µs CPU time)\n\nRan 11 tests for test/Takeover.t.sol:TakeoverTest\n[PASS] testClaimCancelsTimelock() (gas: 1752726)\n[PASS] testCreatorPingCancelsVotingAndStartsCooldown() (gas: 1731990)\n[PASS] testFormerCreatorClaimDoesNotCancelNewCreatorTakeover() (gas: 1101166)\n[PASS] testFuzzCreatorActionsCancel(uint8,bool) (runs: 256, μ: 1576435, ~: 1505483)\nLogs:\n  Bound result 1\n\n[PASS] testNobodyElseCanCancelOrReplaceCreator() (gas: 1511344)\n[PASS] testPreviousBlockHoldingRequiredAndExactThresholdAllowed() (gas: 1551165)\n[PASS] testQuorumFailureAndSevenDayCooldown() (gas: 2055114)\n[PASS] testSuccessfulTakeoverTimelockAndOldFeesRemainClaimable() (gas: 2430828)\n[PASS] testTiedVoteFailsEvenWithQuorum() (gas: 1791227)\n[PASS] testTimingHoldingAndOnlyOneOpenProposal() (gas: 1534809)\n[PASS] testVotesChangeWithoutDoubleCountingAndIgnorePostSnapshotTransfers() (gas: 2449484)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 131.71ms (143.44ms CPU time)\n\nRan 7 tests for test/CreatorAndOwner.t.sol:CreatorAndOwnerTest\n[PASS] testActivityUpdatesOnAllCreatorActions() (gas: 467976)\n[PASS] testLowerImmediateAndRaiseLimitsTimingApplyCancel() (gas: 822476)\n[PASS] testMaximumRaiseAndPendingInvalidation() (gas: 624814)\n[PASS] testNoRateChangesDuringDecay() (gas: 213296)\n[PASS] testOnlyCreatorMayControlRoleAndRate() (gas: 347507)\n[PASS] testOwnerAccessBoundsAndTwoStepOwnership() (gas: 472827)\n[PASS] testOwnerChangesOnlyNewLaunchConfiguration() (gas: 2753052)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 163.72ms (7.19ms CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testERC20FailureCasesAndHistoricalLookupBoundaries() (gas: 134844)\n[PASS] testEverySwapUpdatesManagerAndTraderCheckpoints() (gas: 1143486)\n[PASS] testFuzzHistoricalBalances(uint256) (runs: 256, μ: 3692171, ~: 3691246)\n[PASS] testTransferTransferFromSelfZeroAndSameBlockCoalescing() (gas: 1124778)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 163.69ms (138.15ms CPU time)\n\nRan 7 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testCallbackAuthenticationAndNoClaimOperatorApproval() (gas: 646497)\n[PASS] testFuzzERC20SolvencyAcrossRatesAndClaims(uint256) (runs: 256, μ: 6534364, ~: 6550355)\n[PASS] testFuzzFullRoundTripNeverMintsOrLosesCheckpoints(uint96) (runs: 256, μ: 2180649, ~: 760575)\nLogs:\n  Bound result 10309\n\n[PASS] testLaunchAndFeeEventsContainIndexableData() (gas: 1131513)\n[PASS] testOneOpenProposalPerTokenNotGlobally() (gas: 2586572)\n[PASS] testOwnerCreatorAndTeamHaveNoFeeExemption() (gas: 692518)\n[PASS] testQuorumExactlyTenPercentPassesAndOneUnitBelowFails() (gas: 1713232)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 320.04ms (527.59ms CPU time)\n\nRan 12 tests for test/Fees.t.sol:FeesTest\n[PASS] testClaimsAndMultiplePoolsSameQuote() (gas: 2323132)\n[PASS] testCreatorTransferPreservesOldAccrual() (gas: 1385147)\n[PASS] testERC20ClaimsCheckReceiptAndRollbackWhenTokenChangesBehavior() (gas: 1889814)\n[PASS] testExactOutputRevertsBothDirections() (gas: 714880)\n[PASS] testFuzzDecayAndFeeRounding(uint16,uint16,uint96) (runs: 256, μ: 1750778, ~: 1210051)\nLogs:\n  Bound result 444\n  Bound result 400\n  Bound result 99999999999999996863\n\n[PASS] testFuzzSolvencySequence(uint256) (runs: 256, μ: 8987639, ~: 8984323)\n[PASS] testLaunchDecayCurveAndExcessTeamOnly() (gas: 1266682)\n[PASS] testNoFeeTransferInsideSwapCallbacks() (gas: 1301514)\n[PASS] testPartialBuyRevertsWithoutAccruingFee() (gas: 313954)\n[PASS] testReentrantClaimCannotDoubleSpendAndFailedPaymentRetainsClaim() (gas: 1252733)\n[PASS] testRestingBuyAndSellQuoteFeeAndSplit() (gas: 1246579)\n[PASS] testSellDuringDecayExcessGoesToTeam() (gas: 720967)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 439.08ms (595.69ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testBadFlagAddressFailsConstructor() (gas: 7141)\n[PASS] testDryRunMinesAndBindsComponentsWithEmptyExternalChain() (gas: 31641587)\n[PASS] testMissingAddressesFailConstructors() (gas: 4111)\n[PASS] testSaltMiningLongSearchUsesBoundedMemory() (gas: 14329633)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 439.14ms (61.74ms CPU time)\n\nRan 9 tests for test/Launch.t.sol:LaunchTest\n[PASS] testAllowlistRejectsTaxRebaseFalseAndUnsupportedDecimals() (gas: 3205377)\n[PASS] testBothSortedCurrencyOrientationsAndDecimalSupport() (gas: 7206041)\n[PASS] testCannotInitializeUnregisteredPoolOrCallCallbacksDirectly() (gas: 129033)\n[PASS] testImplementationAndCloneCannotReinitialize() (gas: 83929)\n[PASS] testLaunchNativeIsSingleSidedAndLocked() (gas: 179190)\n[PASS] testLaunchSixDecimalQuoteAndSwapBothWays() (gas: 1688940)\n[PASS] testMetadataFeeQuoteAndTickValidation() (gas: 1274207)\n[PASS] testNonReturningERC20IsSupported() (gas: 1753239)\n[PASS] testThirdPartyLiquidityAndAllRemovalRevert() (gas: 161309)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 439.16ms (10.00ms CPU time)\n\nRan 8 test suites in 440.79ms (2.11s CPU time): 54 tests passed, 0 failed, 1 skipped (55 total tests)\n","passed":true},{"durationMs":50,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KeelV2Factory.launch(string,string,bytes,address,int24,uint16)\",\"KeelV2Factory.probeQuote(address,address,uint256)\",\"KeelV2Factory.unlockCallback(bytes)\",\"KeelV2Hook.acceptOwnership()\",\"KeelV2Hook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"KeelV2Hook.applyRaise(address)\",\"KeelV2Hook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"KeelV2Hook.cancelRaise(address)\",\"KeelV2Hook.claimCreator(address)\",\"KeelV2Hook.claimTeam(address)\",\"KeelV2Hook.configureBase(address,bool,int24,int24)\",\"KeelV2Hook.lowerFee(address,uint16)\",\"KeelV2Hook.ping(address)\",\"KeelV2Hook.registerToken(address,address,address,uint16,(address,address,uint24,int24,address))\",\"KeelV2Hook.scheduleRaise(address,uint16)\",\"KeelV2Hook.setCreatorByTakeover(address,address)\",\"KeelV2Hook.setDecaySeconds(uint16)\",\"KeelV2Hook.setLaunchesPaused(bool)\",\"KeelV2Hook.setTeamRecipient(address)\",\"KeelV2Hook.transferCreator(address,address)\",\"KeelV2Hook.transferOwnership(address)\",\"KeelV2Hook.unlockCallback(bytes)\",\"KeelV2Takeover.execute(uint256)\",\"KeelV2Takeover.finalize(uint256)\",\"KeelV2Takeover.onCreatorActivity(address)\",\"KeelV2Takeover.propose(address)\",\"KeelV2Takeover.vote(uint256,bool)\",\"KeelV2Token.approve(address,uint256)\",\"KeelV2Token.initialize(string,string)\",\"KeelV2Token.transfer(address,uint256)\",\"KeelV2Token.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":7,\"README.md\":138,\"REVIEW.md\":44,\"TESTING.md\":57,\"foundry.toml\":18,\"remappings.txt\":3,\"script/Deploy.s.sol\":80,\"src/KeelV2Factory.sol\":182,\"src/KeelV2Hook.sol\":478,\"src/KeelV2Takeover.sol\":161,\"src/KeelV2Token.sol\":116,\"src/interfaces/IKeelV2.sol\":36,\"src/libraries/ExactTransfer.sol\":36,\"src/libraries/Guard.sol\":14,\"test/CreatorAndOwner.t.sol\":188,\"test/Deployment.t.sol\":82,\"test/EdgeCases.t.sol\":150,\"test/Fees.t.sol\":250,\"test/Launch.t.sol\":169,\"test/Mainnet.t.sol\":56,\"test/Takeover.t.sol\":273,\"test/Token.t.sol\":95,\"test/helpers/KeelFixture.sol\":159,\"test/helpers/MockQuote.sol\":64,\"test/helpers/Router.sol\":67},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":5171,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/KeelV2Hook.sol:456: Reentrancy in KeelV2Hook.unlockCallback(bytes) (src/KeelV2Hook.sol#456-477):\n[high/medium] reentrancy-balance at src/libraries/ExactTransfer.sol:24: Reentrancy in ExactTransfer.transfer(address,address,uint256) (src/libraries/ExactTransfer.sol#24-35):\n[high/medium] reentrancy-balance at src/libraries/ExactTransfer.sol:24: Reentrancy in ExactTransfer.transfer(address,address,uint256) (src/libraries/ExactTransfer.sol#24-35):\n[high/medium] reentrancy-balance at src/libraries/ExactTransfer.sol:11: Reentrancy in ExactTransfer.transferFrom(address,address,address,uint256) (src/libraries/ExactTransfer.sol#11-22):\n[high/medium] reentrancy-balance at src/KeelV2Hook.sol:456: Reentrancy in KeelV2Hook.unlockCallback(bytes) (src/KeelV2Hook.sol#456-477):\n[high/medium] reentrancy-balance at src/libraries/ExactTransfer.sol:11: Reentrancy in ExactTransfer.transferFrom(address,address,address,uint256) (src/libraries/ExactTransfer.sol#11-22):\n[high/medium] unchecked-transfer at src/KeelV2Factory.sol:145: KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#145-181) ignores return value by KeelV2Token(token).transfer(address(poolManager),owed) (src/KeelV2Factory.sol#173)\n[high/medium] unchecked-transfer at src/KeelV2Factory.sol:65: KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116) ignores return value by KeelV2Token(token).transfer(DEAD,dust) (src/KeelV2Factory.sol#102)\n[high/high] uninitialized-state at src/KeelV2Token.sol:88: KeelV2Token.history (src/KeelV2Token.sol#30) is never initialized. It is used in:\n[medium/high] incorrect-equality at src/KeelV2Token.sol:88: KeelV2Token._checkpoint(address) (src/KeelV2Token.sol#88-97) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/KeelV2Hook.sol:172: Reentrancy in KeelV2Hook.configureBase(address,bool,int24,int24) (src/KeelV2Hook.sol#172-193):\n[medium/medium] uninitialized-local at src/KeelV2Token.sol:103: KeelV2Token.balanceAt(address,uint256).low (src/KeelV2Token.sol#103) is a local variable never initialized\n[medium/medium] unused-return at src/KeelV2Factory.sol:65: KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116) ignores return value by poolManager.initialize(key,sqrtUpper) (src/KeelV2Factory.sol#96)\n[medium/medium] unused-return at src/KeelV2Factory.sol:145: KeelV2Factory.unlockCallback(bytes) (src/KeelV2Factory.sol#145-181) ignores return value by (delta,None) = poolManager.modifyLiquidity(info.key,IPoolManager.ModifyLiquidityParams({tickLower:info.tickLower,tickUpper:info.tickUpper,liquidityDelta:int256(uint256(info.liquidity)),salt:bytes32(0)}),) (src/KeelV2Factory.sol#155-164)\n[medium/medium] unused-return at src/KeelV2Hook.sol:449: KeelV2Hook._redeem(address,address,uint256) (src/KeelV2Hook.sol#449-454) ignores return value by poolManager.unlock(data) (src/KeelV2Hook.sol#452)\n[medium/medium] unused-return at src/KeelV2Factory.sol:65: KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116) ignores return value by hook.validateLaunch(quote,startTick,feeBps) (src/KeelV2Factory.sol#74)\n[medium/medium] unused-return at src/KeelV2Factory.sol:65: KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116) ignores return value by poolManager.initialize(key,sqrtLower) (src/KeelV2Factory.sol#96)\n[medium/medium] unused-return at src/KeelV2Factory.sol:65: KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116) ignores return value by poolManager.unlock(data) (src/KeelV2Factory.sol#99)\n[low/medium] reentrancy-benign at src/KeelV2Factory.sol:65: Reentrancy in KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116):\n[low/medium] reentrancy-benign at src/KeelV2Factory.sol:65: Reentrancy in KeelV2Factory.launch(string,string,bytes,address,int24,uint16) (src/KeelV2Factory.sol#65-116):\n[low/medium] reentrancy-events at src/KeelV2Takeover.sol:139: Reentrancy in KeelV2Takeover.execute(uint256) (src/KeelV2Takeover.sol#139-148):\n[low/medium] timestamp at src/KeelV2Hook.sol:277: KeelV2Hook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/KeelV2Hook.sol#277-297) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:299: KeelV2Hook._accrue(address,uint256) (src/KeelV2Hook.sol#299-310) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:219: KeelV2Hook.currentFeeBps(address) (src/KeelV2Hook.sol#219-225) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Takeover.sol:139: KeelV2Takeover.execute(uint256) (src/KeelV2Takeover.sol#139-148) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Takeover.sol:106: KeelV2Takeover.vote(uint256,bool) (src/KeelV2Takeover.sol#106-120) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Takeover.sol:123: KeelV2Takeover.finalize(uint256) (src/KeelV2Takeover.sol#123-137) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:404: KeelV2Hook._rateAuthority(address) (src/KeelV2Hook.sol#404-407) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:204: KeelV2Hook.registerToken(address,address,address,uint16,PoolKey) (src/KeelV2Hook.sol#204-213) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Hook.sol:339: KeelV2Hook.applyRaise(address) (src/KeelV2Hook.sol#339-350) uses timestamp for comparisons\n[low/medium] timestamp at src/KeelV2Takeover.sol:77: KeelV2Takeover.propose(address) (src/KeelV2Takeover.sol#77-104) uses timestamp for comparisons","passed":true},{"durationMs":412,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/KeelV2Factory.sol:126: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/KeelV2Factory.sol:74: Reentrancy: State change after external call (13 places)\n[low] centralization-risk at src/KeelV2Hook.sol:136: Centralization Risk (5 places)\n[low] large-numeric-literal at src/KeelV2Hook.sol:290: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/KeelV2Factory.sol:91: Literal Instead of Constant (9 places)\n[low] missing-inheritance at src/KeelV2Takeover.sol:8: Missing Inheritance (2 places)\n[low] non-reentrant-not-first at src/KeelV2Hook.sol:150: `nonReentrant` is Not the First Modifier (4 places)\n[low] state-change-without-event at src/KeelV2Factory.sol:119: State Change Without Event (4 places)\n[low] unchecked-return at src/KeelV2Factory.sol:74: Unchecked Return (7 places)\n[low] unsafe-erc20-operation at src/KeelV2Factory.sol:102: Unsafe ERC20 Operation (5 places)\n[low] unused-public-function at src/KeelV2Hook.sol:415: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9fa16ee6665c34d66ff9c87fce3cbc58a0c821baa3ca6e904f668845c3a10f80","verifiedTreeHash":"2774dd03352f54c5b987ae2fec8e2858289181b8","verifierVersion":"0.1.0+6a374fcd"}]}