{"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":"83a7b154-3c69-4d51-9d21-a6a804413c48","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"06fb9c35b5998777333140839de83df727f1ad2edce157e3e0981a7959322b69","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"Continue the existing UNLOCK code project. CODE, TESTS AND GITHUB DELIVERY ONLY; no public-network deployment or website in this task. Start from the project's delivered repository and preserve its history. The inspected delivery is https://github.com/identity-md-launches/launch-1309-unlk at 7c02c96b3d6cd07c8df9ed8a7811c95ac2ca1976; reconcile any newer project head before editing. Preserve the individual-wallet quotas, milestone thresholds, unrestricted native reward claims and permanent $5M unlock requirements.\n\nFirst repair and verify the published handoff. On a clean clone of that commit, python3 scripts/check_dependencies.py fails: all 407 vendored files exist, but 177 SHA-256 values differ from dependencies.files.json. Determine the cause using the pinned upstream commits in dependencies.lock.json and the published Git blobs. Do not merely rewrite the expected hashes to accept unknown modifications. Restore or justify each difference, preserve licenses, and verify the final published commit, not only the pre-publication workspace. Correct the token display name to UNLOCK, retaining symbol UNLK; src/UnlkToken.sol and test/Launch.t.sol currently specify UNLK for both.\n\nResolve the documented IMD integration gaps INT-01 and INT-02 against authoritative factory, reward-distributor, fee and manifest interfaces. A previously inspected mainnet LaunchFactory at 0x12c63b581d07093f6126bc02263c58f7eadaa96f requires the full fixed supply to be minted to the factory, which then deploys the distributor and splits the tokens. The current three-recipient UnlkToken constructor does not implement that launch flow. Reverify source and policy before adapting it; never guess a Sepolia address or alter the required 10/87/3 final allocation. Reconcile companion-contract setup, CREATE2 hook flags, tuple constructor encoding, initial allocation evidence and authenticated router integration with the actual supported release interface. Provide a compatibility matrix and exact unresolved interface requirements.\n\nImplement immutable claim and fee adapters only where verified official interfaces support them. IClaimEvidence and IFeeDistribution are currently project-defined boundaries, not verified IMD ABIs. Prove actual native claims can be credited once to the rightful recipient without restricting the native claim operation. Test fee recipients and principal withdrawal rights. Mocks must remain clearly labeled and cannot count as official integration evidence.\n\nReproduce the build, formatting, ABI/artifact checks and complete test suite using the pinned toolchain, then add regression tests for the corrections. Where network access and verified dependencies are available, run fork integration at a recorded chain/block and distinguish it from local PoolManager tests. Report unavailable checks accurately. Independently assess the open ORC-01 irreversible-unlock manipulation risk; quantify assumptions and attack costs rather than claiming a TWAP makes manipulation impossible. Do not silently change immutable economic parameters. If no independent reviewer runs, explicitly keep that review pending.\n\nDeliver the updated repository commit, exact commands/results, final dependency verification, implementation changes, integration evidence, unresolved findings and a Sepolia readiness checklist. Mainnet release is out of scope. Do not claim deployment readiness while required integration or high-severity findings remain unresolved.\n\nUpgrades and pausing: Not upgradeable and not pausable. No proxy upgrades, admin rule changes, counter resets or trader exemptions. Permit authenticated one-time initialization only; no administrative changes afterward.","parentJobId":"9a462f85-b582-4b1d-b946-eed28887d8a9","planHash":"f01b9c6343f3f5b8e4036c01964bb372f2e597fa39a763f25edb3f0477b7f8d1","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"9a462f85-b582-4b1d-b946-eed28887d8a9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1309-unlk"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51566","feedbackHash":"3ebcc6c3439737776a5f3d22b2561d9199dfc69c8ab4df2e33655249c257864f","nodeKey":"build_contract_project","submissionHash":"06fb9c35b5998777333140839de83df727f1ad2edce157e3e0981a7959322b69","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"1b4d797a81fc0269e22c69492895c96652907b982a3778c0e4c950f87369ebeb","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"236f0f211b8bcd5a0303e75ed7eb631aab5610f745f1ba4b412c2c89d1517c33","device":"d0653dc91b6e2259","findings":[],"hash":"06fb9c35b5998777333140839de83df727f1ad2edce157e3e0981a7959322b69","nodeId":"0cd7e4d0-0a51-4950-a3b8-75e7d853a998","outcome":"completed","summary":"Delivery committed as `92d8b0d` on top of the published `7c02c96`. Final state: build clean, 118 tests passing in 14 suites, `forge fmt --check` clean, high-severity lint clean, dependency check passing on the published tree.\n\n**Dependency failure diagnosed and repaired.** All 407 pinned hashes in `dependencies.files.json` match the pristine upstream files refetched at the locked commits, so the lock was right. The 177 differing files are the result of the network's post-publication `forge fmt` pass, which reformats `lib/` because the protected `foundry.toml` has no `lib` exclusion. Running `forge fmt` on the pristine copies reproduced every published file byte for byte. Since `lib/` and `foundry.toml` are protected and the formatting pass reruns after every delivery, the check now proves equivalence offline instead of rewriting hashes: the pristine hashes stay as they were, 159 files are verified by a string-literal-exact token stream, and the 18 files where `forge fmt` also added braces embed the pinned upstream bytes and must be reproduced by `forge fmt --raw`. Details are in `docs/DEPENDENCY_VERIFICATION.md`.\n\n**INT-01 and INT-02 reconciled against verified sources.** The mainnet LaunchFactory is a Sourcify full match, and its sources (factory, MerkleDistributor, PoolFees, LaunchFees, registry) are copied to `test/imd/` with one documented import adaptation. The worker CLI confirms the token takes no constructor args and that hook args must be flat words with the `$poolManager`, `$token`, `$factory`, `$owner` placeholders, so tuple constructors are unsupported. Changes made:\n\n- `UnlkToken` is now `UNLOCK`/`UNLK` with an arg-less constructor minting the whole supply to the factory. The 10/87/3 split is performed by the factory and verified by the hook at bind.\n- `UnlkHook` takes 8 flat constructor words, accepts liquidity only from the factory with no removal, verifies router, oracle, adapter and the factory-created distributor at `beforeInitialize`, and credits the 3% to `$owner`.\n- `MerkleClaimEvidence` is an immutable adapter over the verified distributor. Credits require the distributor's own claimed flag plus a proof of the `(account, amount)` leaf against the round root, once per round, always to the leaf's account. Native claims stay untouched and are tested with a broken feed and without attestation.\n- `UnlkLiquidityLock` and `IFeeDistribution` are removed. Fees flow through the verified PoolFees, with tests for the 80/20 split, requester reassignment, recipient moves and principal retention.\n- Local tests now launch through the factory's real `launch()` logic. The quote-depth top-up and warm-up buy are labeled local fixtures.\n\n**Still unresolved, stated in the docs.** Sepolia addresses were not supplied and were not guessed. The distributor address prediction must be confirmed per chain. No fork run was executed because no Sepolia RPC or factory address exists and a mainnet launch needs IMD's deployer key. No official swap route exists, so the project router remains a product decision. ORC-01 is quantified in `docs/SECURITY_REVIEW.md` as a sustained, funded manipulation costing roughly the FDV gap held for at least 90 minutes, with quotas limiting counter-pressure. It stays open, and the independent review is explicitly pending. `docs/SEPOLIA_READINESS.md` lists the ten gating items and the exact commands and results.","treeHash":"d9a5356b1aaea90f8b5a8842bf2370a004dff225","usage":{"cachedInputTokens":7004938,"inputTokens":1444,"model":"claude-fable-5-1","outputTokens":95434,"runtime":"claude","turns":66,"wallClockMs":1575818}}],"verification":[{"checks":[{"durationMs":9109,"exitCode":0,"name":"build","output":"Compiling 109 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.00s\nCompiler run successful!\n","passed":true},{"durationMs":1846,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 1294799)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1229501)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.03ms (340.22µs CPU time)\n\nRan 12 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 440113)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 571151)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 687515)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 847849)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1283504)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82460)\n[PASS] testPoolFee125BpsNoHookFeeAndDistribution80_20() (gas: 860741)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 566874)\n[PASS] testRequesterShareIsTransferableOnlyByRequesterAndOwedOnRejection() (gas: 1305974)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1208733)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 241781)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 43765)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 9.24ms (6.67ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7259497)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 87355)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211557)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49877)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 121520)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 385766)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 242063)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 41399)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 12.83ms (6.60ms CPU time)\n\nRan 6 tests for test/Launch.t.sol:InitializationGuardTest\n[PASS] testCompanionMisconfigurationFailsTheLaunchAtomically() (gas: 36468768)\n[PASS] testForeignCallerCannotConfigureUnsetRouter() (gas: 32745)\n[PASS] testLaunchRejectsSeedThatSpendsPairedCurrency() (gas: 6388900)\n[PASS] testLaunchRejectsWrongFeeOrTickSpacing() (gas: 10478523)\n[PASS] testOnlyFactoryCanInitializeUnboundOfficialPool() (gas: 8137151)\n[PASS] testUnboundCreditsCannotBeSynchronized() (gas: 8169397)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 49.21ms (51.09ms CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 14490694)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 67107750)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 63.18ms (40.93ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 3315613)\n[PASS] testNativeBatchSettlement() (gas: 855210)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1100251)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 444200)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 600202)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 94867)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 994624)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 71405)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 456404)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1070043)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 4804091)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 63.27ms (9.59ms CPU time)\n\nRan 14 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2341043)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 2830947)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 16129490)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 4997515)\n[PASS] testFlashLoanCannotCrossMilestoneInItsTransaction() (gas: 1567517)\n[PASS] testInvalidDataResetsUnfinishedConfirmation() (gas: 3128805)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 768603)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 749074)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 98351)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 771306)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1292750)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 3118342)\n[PASS] testThresholdMappingBoundaries() (gas: 104606)\n[PASS] testWarmupAndExactWindow() (gas: 387476)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 72.32ms (31.31ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 320997)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 210287)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 1669437)\n[PASS] testOneTimeSetup() (gas: 63749)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66561)\n[PASS] testPayerCreditExactDeduplicated() (gas: 143013)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80540)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 39605)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 72.33ms (1.13ms CPU time)\n\nRan 16 tests for test/Trading.t.sol:Token0TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 483287)\n[PASS] testBatchBuysThenSellsAndRollbackExcess() (gas: 1648558)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 643183)\n[PASS] testDirectSmartWalletOwnsRightsNotItsOwner() (gas: 703308)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 490115)\n[PASS] testExactInputBuyCreditsOnlyDeliveredTokens() (gas: 454596)\n[PASS] testExactOutputBuyAndRefund() (gas: 395787)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 720093)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 809078)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1018241, ~: 1019061)\nLogs:\n  Bound result 1999999000000004652\n\n[PASS] testPartialExactOutputRejectedAtomically() (gas: 442849)\n[PASS] testPartialInputFillCreditsOnlyExecutedBuy() (gas: 391916)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 428759)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1047988)\n[PASS] testSlippageDeadlineAndNativeValueRejected() (gas: 521497)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 823413)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 72.40ms (75.98ms CPU time)\n\nRan 14 tests for test/Oracle.t.sol:Token0OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2335929)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 2824703)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 16095431)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 4986673)\n[PASS] testFlashLoanCannotCrossMilestoneInItsTransaction() (gas: 1550234)\n[PASS] testInvalidDataResetsUnfinishedConfirmation() (gas: 3121727)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 766651)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 747193)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 98807)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 769403)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1289237)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 3111642)\n[PASS] testThresholdMappingBoundaries() (gas: 104606)\n[PASS] testWarmupAndExactWindow() (gas: 386642)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 81.87ms (22.49ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 3315612)\n[PASS] testNativeBatchSettlement() (gas: 855210)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1100240)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 444111)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 94889)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 71427)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 4804091)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 81.93ms (8.37ms CPU time)\n\nRan 16 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 497614)\n[PASS] testBatchBuysThenSellsAndRollbackExcess() (gas: 1663899)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 642356)\n[PASS] testDirectSmartWalletOwnsRightsNotItsOwner() (gas: 717196)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 504231)\n[PASS] testExactInputBuyCreditsOnlyDeliveredTokens() (gas: 468712)\n[PASS] testExactOutputBuyAndRefund() (gas: 411091)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 735738)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 823515)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1033512, ~: 1034115)\nLogs:\n  Bound result 1999999000000000230\n\n[PASS] testPartialExactOutputRejectedAtomically() (gas: 460097)\n[PASS] testPartialInputFillCreditsOnlyExecutedBuy() (gas: 405830)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 442456)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1062743)\n[PASS] testSlippageDeadlineAndNativeValueRejected() (gas: 538765)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 837850)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 81.87ms (84.08ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 885   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 859   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 927   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 805   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 809   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 835   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 214\n  Bound result 13460080239323052164728711\n  Bound result 0\n  Bound result 255\n  Bound result 8490852637245852\n  Bound result 55813\n  Bound result 579949989820144154424773\n  Bound result 463573765941904899527400\n  Bound result 0\n  Bound result 133542529114295842\n  Bound result 255\n  Bound result 18440\n  Bound result 7\n  Bound result 408\n  Bound result 11035\n  Bound result 29035210320199054\n  Bound result 499999000000003598\n  Bound result 300\n  Bound result 1506\n  Bound result 72057594037927935\n  Bound result 1467\n  Bound result 24\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.59s (1.58s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 885   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 859   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 927   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 805   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 809   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 835   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 50\n  Bound result 17818\n  Bound result 0\n  Bound result 255\n  Bound result 8490852637245852\n  Bound result 16802\n  Bound result 31244541662170020268742\n  Bound result 1174993776181452976399407\n  Bound result 0\n  Bound result 133542529114295842\n  Bound result 255\n  Bound result 17240\n  Bound result 7\n  Bound result 1146\n  Bound result 8706\n  Bound result 29035210320199054\n  Bound result 142576929232920056\n  Bound result 300\n  Bound result 3194\n  Bound result 307663827626949226\n  Bound result 265\n  Bound result 54\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.74s (1.73s CPU time)\n\nRan 14 test suites in 1.74s (4.00s CPU time): 118 tests passed, 0 failed, 0 skipped (118 total tests)\n","passed":true},{"durationMs":86,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"HookDeployer.deploy(bytes32,(address,address,address,address,address,address,address,int24))\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address))\",\"UnlkOracle.checkpoint()\",\"UnlkOracle.configureHook(address)\",\"UnlkOracle.setLiquidityRange(int24,int24)\",\"UnlkSwapRouter.configureHook(address)\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":25,\"README.md\":83,\"dependencies.files.json\":409,\"dependencies.formatted.json\":1082,\"dependencies.lock.json\":29,\"docs/ARCHITECTURE.md\":64,\"docs/DEPENDENCY_VERIFICATION.md\":23,\"docs/DEPLOYMENT.md\":78,\"docs/GITHUB_HANDOFF.md\":20,\"docs/IMD_INTEGRATION.md\":50,\"docs/SECURITY_REVIEW.md\":72,\"docs/SEPOLIA_READINESS.md\":30,\"docs/VALIDATION.md\":71,\"docs/abi/HookDeployer.json\":233,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/MerkleClaimEvidence.json\":179,\"docs/abi/UnlkHook.json\":1552,\"docs/abi/UnlkOracle.json\":505,\"docs/abi/UnlkSwapRouter.json\":398,\"docs/abi/UnlkToken.json\":367,\"docs/validation/build.txt\":3,\"docs/validation/contract-sizes.json\":26,\"docs/validation/dependencies.txt\":1,\"docs/validation/lint-high-medium.txt\":3,\"docs/validation/lint-high.txt\":0,\"docs/validation/tests.txt\":1,\"foundry.toml\":31,\"handoff/inventory-digest.txt\":1,\"handoff/inventory.sha256\":474,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":60,\"script/LocalDemo.s.sol\":41,\"scripts/__pycache__/check_dependencies.cpython-314.pyc\":56,\"scripts/check.sh\":11,\"scripts/check_dependencies.py\":135,\"scripts/export_abis.py\":26,\"scripts/mine-hook.sh\":9,\"scripts/source_inventory.py\":24,\"scripts/verify_artifacts.py\":19,\"src/HookDeployer.sol\":51,\"src/MerkleClaimEvidence.sol\":60,\"src/UnlkHook.sol\":403,\"src/UnlkOracle.sol\":219,\"src/UnlkSwapRouter.sol\":239,\"src/UnlkToken.sol\":22,\"src/interfaces/IIntegration.sol\":58,\"src/libraries/OperationHash.sol\":14,\"test/Adversarial.t.sol\":117,\"test/CreditsAndFees.t.sol\":220,\"test/Invariants.t.sol\":215,\"test/Launch.t.sol\":207,\"test/LocalScript.t.sol\":28,\"test/NativeLaunch.t.sol\":234,\"test/Oracle.t.sol\":331,\"test/ReleaseConfig.t.sol\":24,\"test/Trading.t.sol\":277,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SystemFixture.sol\":351,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":374,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":219,\"test/imd/README.md\":19},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3711,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:113: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176):\n[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:113: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176):\n[medium/medium] divide-before-multiply at src/UnlkOracle.sol:151: UnlkOracle.twapTick() (src/UnlkOracle.sol#151-176) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:151: UnlkOracle.twapTick() (src/UnlkOracle.sol#151-176) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:115: UnlkOracle.checkpoint() (src/UnlkOracle.sol#115-144) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:115: UnlkOracle.checkpoint() (src/UnlkOracle.sol#115-144) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/UnlkHook.sol:209: Reentrancy in UnlkHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#209-239):\n[medium/medium] uninitialized-local at src/UnlkSwapRouter.sol:124: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256).state (src/UnlkSwapRouter.sol#124) is a local variable never initialized\n[medium/medium] unused-return at src/UnlkHook.sol:187: UnlkHook.beforeSwap(address,PoolKey,IPoolManager.SwapParams,bytes) (src/UnlkHook.sol#187-207) ignores return value by (None,None,protocolFee,lpFee) = poolManager.getSlot0(poolId) (src/UnlkHook.sol#201)\n[low/medium] events-maths at src/UnlkOracle.sol:100: UnlkOracle.setLiquidityRange(int24,int24) (src/UnlkOracle.sol#100-107) should emit an event for: \n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: state.outputToken.balanceOf(msg.sender) != outputBefore + output (src/UnlkSwapRouter.sol#167)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: outputBefore = state.outputToken.balanceOf(msg.sender) (src/UnlkSwapRouter.sol#165)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: state.baseInput = state.inputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#130-132)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: key = hook.poolKey() (src/UnlkSwapRouter.sol#123)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: state.inputToken.balanceOf(address(this)) != state.baseInput + request.maxInput (src/UnlkSwapRouter.sol#139)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: address(hook) == address(0) || ! hook.bound() || block.timestamp > request.deadline || request.amountSpecified == 0 || request.amountSpecified == type()(int256).min || request.maxInput == 0 || request.maxInput > uint256(uint128(type()(int128).max)) || request.minOutput == 0 (src/UnlkSwapRouter.sol#118-121)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:182: UnlkSwapRouter._balance(IERC20) (src/UnlkSwapRouter.sol#182-184) has external calls inside a loop: currency.balanceOf(address(this)) (src/UnlkSwapRouter.sol#183)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: state.baseOutput = state.outputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#133-134)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) has external calls inside a loop: result = poolManager.unlock(abi.encode(key,params,operationNonce,request.maxInput)) (src/UnlkSwapRouter.sol#149)\n[low/medium] reentrancy-benign at src/UnlkHook.sol:209: Reentrancy in UnlkHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#209-239):\n[low/medium] reentrancy-benign at src/UnlkSwapRouter.sol:113: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176):\n[low/medium] reentrancy-benign at src/UnlkHook.sol:348: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#348-352):\n[low/medium] reentrancy-events at src/UnlkHook.sol:348: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#348-352):\n[low/medium] reentrancy-events at src/UnlkHook.sol:139: Reentrancy in UnlkHook.beforeInitialize(address,PoolKey,uint160) (src/UnlkHook.sol#139-175):\n[low/medium] reentrancy-events at src/UnlkHook.sol:209: Reentrancy in UnlkHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#209-239):\n[low/medium] timestamp at src/UnlkHook.sol:364: UnlkHook._updateMilestone() (src/UnlkHook.sol#364-393) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:151: UnlkOracle.twapTick() (src/UnlkOracle.sol#151-176) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkSwapRouter.sol:113: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#113-176) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:115: UnlkOracle.checkpoint() (src/UnlkOracle.sol#115-144) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:195: UnlkOracle._ethUsd() (src/UnlkOracle.sol#195-208) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:179: UnlkOracle.fdvUsd() (src/UnlkOracle.sol#179-193) uses timestamp for comparisons","passed":true},{"durationMs":710,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/UnlkSwapRouter.sol:194: ETH transferred without address checks\n[high] reentrancy-state-change at src/MerkleClaimEvidence.sol:51: Reentrancy: State change after external call (6 places)\n[high] unprotected-initializer at src/HookDeployer.sol:11: Unprotected initializer (2 places)\n[low] costly-loop at src/UnlkHook.sol:377: Costly operations inside loop (2 places)\n[low] large-numeric-literal at src/UnlkHook.sol:229: Large Numeric Literal (16 places)\n[low] literal-instead-of-constant at src/UnlkHook.sol:194: Literal Instead of Constant (12 places)\n[low] local-variable-shadowing at src/UnlkHook.sol:69: Local Variable Shadows State Variable (7 places)\n[low] missing-inheritance at src/UnlkOracle.sol:15: Missing Inheritance\n[low] require-revert-in-loop at src/UnlkSwapRouter.sol:104: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/UnlkHook.sol:187: State Change Without Event (4 places)\n[low] unchecked-return at src/UnlkHook.sol:237: Unchecked Return\n[low] unused-public-function at src/HookDeployer.sol:31: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"06fb9c35b5998777333140839de83df727f1ad2edce157e3e0981a7959322b69","verifiedTreeHash":"d9a5356b1aaea90f8b5a8842bf2370a004dff225","verifierVersion":"0.1.0+fb8278c5"}]}