{"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":"cb9cb2ea-e553-4b60-81c1-2ef8935d54f9","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"879065eae2c6b09a6dc6d82a8f08c6c11ee8d1dc71bd9d994c857665a0321445","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":"Continue this Hooks Store project. Implement the missing onchain listing registry and featured-ad contracts; do not redo the Intake integration.\n\nListings are free to create and edit. Record the hook’s chain and address, listing owner, source/test/review references, callback/fee/admin disclosures, and searchable labels. A user-supplied audit URL must not by itself mark a hook as audited.\n\nImplement optional 0.1 IMD featured placements visibly labelled #ad. Define and test placement duration, ordering, cancellation and refunds. Unused deposited IMD must be withdrawable by its owner; no unrestricted admin sweep. Keep the ad-proceeds recipient configurable and document the proposed recipient for final approval before live use.\n\nDeliver contracts, adversarial Foundry tests, documentation and a clear account of admin powers. Do not deploy, create a token or pool, or move funds.","parentJobId":"6fbb4e49-1279-46f2-aea9-008c3105f0c7","planHash":"0502e6c761569b9e5e8976e37a3dc95647931e64d9ad8367251ff17854a34a66","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"28e81139-f2a5-4a5a-a239-b6c315b58e01","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52620","feedbackHash":"e3d0a45f213eaeb86750a4a788099295dd53611980e1d196e282ff73b324f3b0","nodeKey":"build_contract_project","submissionHash":"879065eae2c6b09a6dc6d82a8f08c6c11ee8d1dc71bd9d994c857665a0321445","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"9ff0c379a5d001f17330bf1dd8012a41afab0a47371d170c31608d93fc94bb91","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"e7d8967fecc7c977214190ca1e736c85cb43154727945ffe6739670969d09b12","device":"3ba092738fb7852e","findings":[],"hash":"879065eae2c6b09a6dc6d82a8f08c6c11ee8d1dc71bd9d994c857665a0321445","nodeId":"29e265e9-31af-49f4-ab34-f4661b1612a2","outcome":"completed","summary":"Implemented free listings with revision history, disclosures, searchable labels, and unverified audit references. Added seven-day, 0.1 IMD **#ad** placements with deterministic ordering, prorated refunds, depositor withdrawals, and no admin sweep.\n\nValidation passed: `forge build`, `forge fmt --check`, 126 Foundry tests under both seeds, and six reader tests.\n\n[Documentation](/root/.identitymd/work/cb9cb2ea-e553-4b60-81c1-2ef8935d54f9/29e265e9-31af-49f4-ab34-f4661b1612a2/docs/LISTINGS_AND_ADS.md) covers admin powers, configuration, and the proposed treasury recipient awaiting approval before live use.\n\nIntake integration preserved. No live deployment or fund movement.","treeHash":"93e5538ebb4dd9ce75987a4dc996afa0e9c1ebde","usage":{"cachedInputTokens":2092928,"inputTokens":119670,"model":"gpt-6-astra","outputTokens":48658,"runtime":"codex","turns":8,"wallClockMs":1347356}}],"verification":[{"checks":[{"durationMs":5779,"exitCode":0,"name":"build","output":"Compiling 116 files with Solc 0.8.26\nSolc 0.8.26 finished in 5.69s\nCompiler run successful!\n","passed":true},{"durationMs":28101,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKeyAsDelivered() (gas: 1776603)\n[PASS] test_callbackSelectorsAreCanonical() (gas: 3943)\n[PASS] test_digestMatchesTheProtocol() (gas: 13912)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.17ms (1.38ms CPU time)\n\nRan 7 tests for test/FeaturedAdversarial.t.sol:FeaturedAdversarialTest\n[PASS] testFalseRevertingMalformedAndNoMovementTokensCannotCreateCredit() (gas: 1201538)\n[PASS] testMissingTokenCodeAfterConfigurationCannotFakeTransfer() (gas: 68113)\n[PASS] testNoReturnTokenWorksForDepositsAndWithdrawals() (gas: 264270)\n[PASS] testProceedsWithdrawalAlsoGuardsReentrancy() (gas: 1621022)\n[PASS] testRecipientCannotBlockCancellationOrSettlementAndFailedClaimRollsBack() (gas: 2093542)\n[PASS] testTaxedOrFailedWithdrawalRollsBackAndRemainsRetryable() (gas: 1194337)\n[PASS] testTokenCallbacksCannotReenterAnyCustodyMutation() (gas: 3108803)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 11.35ms (7.08ms CPU time)\n\nRan 3 tests for test/DeployHookJobRequester.t.sol:DeployHookJobRequesterTest\n[PASS] testCheckRefusesAddressesWithoutCodeAndUnsoldActions() (gas: 136080)\n[PASS] testDeployThenConfigureGivesAWorkingRequesterOwnedByTheNamedOwner() (gas: 5488011)\n[PASS] testRunRefusesZeroBroadcaster() (gas: 86380)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 16.10ms (1.81ms CPU time)\n\nRan 15 tests for test/HookIntegration.t.sol:HookIntegrationTest\n[PASS] testAllDirectionsAndExactModesAcceptLimit() (gas: 650218)\n[PASS] testDuplicatePoolInitializationFails() (gas: 41653)\n[PASS] testDynamicFeePoolRejectedAtomically() (gas: 97839)\n[PASS] testFuzzHookDataHasNoAuthority(bytes) (runs: 256, μ: 210225, ~: 210004)\n[PASS] testFuzzRealSwapsSettleAndConserve(uint128,bool,bool,bool) (runs: 256, μ: 281004, ~: 278533)\nLogs:\n  Bound result 662\n\n[PASS] testFuzzSignedBoundaryAndNeutralReturn(int256,bytes) (runs: 256, μ: 30892, ~: 29822)\n[PASS] testFuzzUnauthorizedCallbacks(address) (runs: 256, μ: 94960, ~: 95102)\n[PASS] testIntMinIntMaxAndZeroFailClearly() (gas: 88270)\n[PASS] testLimitCapsOnlySpecifiedSideNotUnspecifiedSide() (gas: 427039)\n[PASS] testLiquidityWithdrawalRemainsAvailableAfterRejectedSwap() (gas: 184825)\n[PASS] testOverLimitRevertsThroughManagerInAllModes() (gas: 253819)\n[PASS] testSettlementFailureRollsBackCounterAndPoolState() (gas: 388376)\n[PASS] testTwoNewPoolsReuseOneDeployedHook() (gas: 624953)\n[PASS] testUnusedCallbacksAlwaysRevert() (gas: 209241)\n[PASS] testWrongHookAndUnknownPoolRejected() (gas: 124522)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 46.76ms (88.21ms CPU time)\n\nRan 29 tests for test/HookJobRequester.t.sol:HookJobRequesterTest\n[PASS] testAnswerSignedForAnotherConsumerRefused() (gas: 1724885)\n[PASS] testBodyIsExactTemplateWithStepsSpecAndQuotedBrief() (gas: 913382)\n[PASS] testBriefValidation() (gas: 1832043)\n[PASS] testCallbackWithUnexpectedAbiFailsSafeAndJobCanExpire() (gas: 1111094)\n[PASS] testCallbacksFitTheIntakeStipend() (gas: 1780719)\n[PASS] testConstructorRefusesZeroAddresses() (gas: 10461)\n[PASS] testForgedExpiredWeakOrMistypedAnswersRefused() (gas: 2084951)\n[PASS] testFuzzPrintableAsciiBriefAcceptedUnlessReserved(bytes32,uint8) (runs: 256, μ: 504599, ~: 834056)\nLogs:\n  Bound result 20\n\n[PASS] testJobFailureClosesJobOnceAndIsNotAVerdict() (gas: 1109807)\n[PASS] testJobIdCollidingWithPendingReviewAskRefused() (gas: 2043743)\n[PASS] testOpenJobPaysOncePullsExactPriceAndTracksRequestId() (gas: 1119293)\n[PASS] testOwnerSettersAreOwnerOnlyAndValidated() (gas: 573975)\n[PASS] testPriceCeilingProtectsStandingAllowance() (gas: 2961984)\n[PASS] testResultAcceptedOnceFromIntakeOnly() (gas: 1078196)\n[PASS] testReusedRequestIdRefused() (gas: 1194208)\n[PASS] testReviewExpiryByRequesterOnly() (gas: 1834695)\n[PASS] testReviewFailureLeavesNoVerdictAndAllowsRetry() (gas: 2645114)\n[PASS] testReviewNotPassedIsStoredNotReverted() (gas: 1805991)\n[PASS] testReviewOnlyForDeliveredOrExpiredJobsByRequester() (gas: 1932662)\n[PASS] testReviewPassedOnlyFromSignedOracleAnswer() (gas: 2031289)\n[PASS] testSameAttestationCannotSettleASecondAsk() (gas: 4157985)\n[PASS] testSignerRotationTakesEffect() (gas: 1875235)\n[PASS] testStaticSiteReadContract() (gas: 981180)\n[PASS] testSweepRecoversStrayTokens() (gas: 125831)\n[PASS] testUnconfiguredRequesterRefusesUntilOwnerSetsTemplates() (gas: 1524991)\n[PASS] testUnknownRequestIdRefused() (gas: 129991)\n[PASS] testUnpricedActionAndVersion1IntakeRefusedWithoutPayment() (gas: 464182)\n[PASS] testVersion1IntakeWorksWithTheFailureHookOff() (gas: 3046696)\n[PASS] testWalletMustApproveAndPay() (gas: 360539)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 46.79ms (54.88ms CPU time)\n\nRan 25 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testAllNamedMainnetsAndUnknownChainsRejected() (gas: 4440)\n[PASS] testAnyoneMayDeployIdenticalPlanWithoutTakingOwnership() (gas: 3340102)\n[PASS] testChangedConstructorSettingsInvalidateCachedPlan() (gas: 2452880)\n[PASS] testChangingManagerChangesCommitments() (gas: 4456007)\n[PASS] testDuplicateDeploymentRejectedAndMinerSkipsOccupiedAddress() (gas: 3409894)\n[PASS] testFuzzOnlyExactPermissionMaskAccepted(uint160) (runs: 256, μ: 30093, ~: 30225)\n[PASS] testFuzzPredictionMatchesIndependentCreate2Formula(address,bytes32,bytes32) (runs: 256, μ: 3933, ~: 3933)\n[PASS] testFuzzSpecLimitCommitsToExactConstructor(uint128,bytes32) (runs: 256, μ: 44323, ~: 44323)\n[PASS] testInvalidSearchRanges() (gas: 100769)\n[PASS] testInvalidSpecFieldsRejected() (gas: 161488)\n[PASS] testManagerCodeChangeFailsClosed() (gas: 2410875)\n[PASS] testManagerMustHaveExpectedCode() (gas: 68520)\n[PASS] testPredictionDeploymentPermissionsSettingsAndBytecodeAgree() (gas: 3496937)\n[PASS] testPrefundedPredictedAddressStillDeploys() (gas: 3331370)\n[PASS] testScriptUsesSamePlanAndDeploymentAsStore() (gas: 7192658)\n[PASS] testScriptsRejectMissingBroadcaster() (gas: 7147621)\n[PASS] testSearchExhaustionAndResume() (gas: 6291072)\n[PASS] testStaleOrForgedScriptPlansRejected() (gas: 6271704)\n[PASS] testTestnetPolicyIdsOnlyLocalSimulation() (gas: 7542)\n[PASS] testVerificationDetectsCorruptedConstructorStorage() (gas: 3314813)\n[PASS] testVerificationDetectsCorruptedRuntime() (gas: 3308499)\n[PASS] testVerifyUndeployedOrWrongAddressRejected() (gas: 2430633)\n[PASS] testWrongChainRejected() (gas: 29640)\n[PASS] testWrongExpectedAddressAndHashRejected() (gas: 2458895)\n[PASS] testWrongSaltRejectedByFactoryAndConstructor() (gas: 98469)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 46.78ms (194.53ms CPU time)\n\nRan 11 tests for test/HookListingRegistry.t.sol:HookListingRegistryTest\n[PASS] testAuditUrlAndAuditLabelNeverConferVerification() (gas: 1866291)\n[PASS] testFreeCreateAndEditPersistAllFieldsAndHistory() (gas: 1618302)\n[PASS] testFuzzUnauthorizedCallerCannotModifyListing(address) (runs: 256, μ: 842656, ~: 842726)\n[PASS] testFuzzValidLabelsRemainSearchable(uint128) (runs: 256, μ: 747324, ~: 746840)\n[PASS] testInvalidIdentityUnknownRecordsAndPagesRevert() (gas: 931804)\n[PASS] testInvalidMetadataIsAtomicAndReferencesMayBeAbsent() (gas: 1106108)\n[PASS] testLabelValidationBoundsAndDuplicates() (gas: 965451)\n[PASS] testSameHookCanHaveIndependentOwnersButNoOwnerDuplicates() (gas: 2284749)\n[PASS] testSearchByLabelChainOwnerAndVisibilityUsesBoundedAscendingCursor() (gas: 2329424)\n[PASS] testTransferCanBeCancelledOrReplaced() (gas: 1022369)\n[PASS] testTwoStepListingTransferAndDuplicateProtection() (gas: 1824321)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 46.80ms (61.10ms CPU time)\n\nRan 21 tests for test/FeaturedPlacements.t.sol:FeaturedPlacementsTest\n[PASS] testAdminRotationIsTwoStepAndDoesNotControlCustody() (gas: 805868)\n[PASS] testBadTokenConfigurationAndConstructorArguments() (gas: 1022284)\n[PASS] testCancelledPlacementCannotSettleOrCancelTwice() (gas: 1586696)\n[PASS] testDepositWithdrawBelongsToDepositorAndCannotBeSwept() (gas: 693423)\n[PASS] testDirectTransfersAreNotCreditsAndCannotBeSwept() (gas: 496850)\n[PASS] testEditingInvalidatesStalePurchaseAndFeeDisclosuresAreSnapshotted() (gas: 1995083)\n[PASS] testExpirySettlementIsPermissionlessAndCannotBeRepeatedOrRefunded() (gas: 1830963)\n[PASS] testFeaturedOrderingPaginationAndLabelsSkipCancelledAndExpired() (gas: 3095119)\n[PASS] testFuzzCancellationConservesFundsAndRoundsInPayersFavor(uint256) (runs: 256, μ: 1590303, ~: 1591817)\nLogs:\n  Bound result 604797\n\n[PASS] testHalfDurationCancellationSplitsFeeAndProceedsArePullBased() (gas: 1742350)\n[PASS] testImmediateCancellationFullyRefundsThenOwnerCanWithdraw() (gas: 1648216)\n[PASS] testOnlyOwnerCanBuyAndOnlyPayerCanCancelIncludingAdmin() (gas: 1727217)\n[PASS] testPurchaseCostsExactlyPointOneImdAndHasSevenDayAdLabel() (gas: 1481632)\n[PASS] testRecipientRotationInvalidatesStalePurchaseBeforeFundsAreLocked() (gas: 1453614)\n[PASS] testRecipientsAreSnapshottedAndChangingThemCannotTakeOldFunds() (gas: 2414942)\n[PASS] testSingleLivePlacementButCanRenewUnsettledExpiredOrCancelledPlacement() (gas: 2497486)\n[PASS] testSnapshotSurvivesEditingArchivingTransferAndRefundStaysWithPayer() (gas: 2430671)\n[PASS] testStaleTermsInactiveListingInsufficientBalanceAndDeadlineFailBeforeDebit() (gas: 1405175)\n[PASS] testUnknownIdsAndInvalidPagesFail() (gas: 228111)\n[PASS] testUnsetConfigurationAndTokenCanOnlyBeChosenOnce() (gas: 703556)\n[PASS] testZeroAmountsInvalidRecipientsAndExcessWithdrawalsFail() (gas: 629582)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 365.06ms (49.68ms CPU time)\n\nRan 11 tests for test/AuditFixes.t.sol:AuditFixesTest\n[PASS] testAllowedTestnetsDeployAndVerifyEndToEnd() (gas: 7765983)\n[PASS] testBaseMainnetRejectedOnEveryReleasePath() (gas: 9450397)\n[PASS] testEthereumMainnetRejectedOnEveryReleasePath() (gas: 9450443)\n[PASS] testFullPageCompletesOrResumesUnderTypicalCallGasCap() (gas: 4696895)\n[PASS] testFuzzUnknownChainsRejectedOnEveryReleasePath(uint64) (runs: 256, μ: 9453605, ~: 9453605)\n[PASS] testHookConstructorStillBindsSpecToActualChain() (gas: 19895)\n[PASS] testHookTemplateStaysChainAgnosticForFutureMainnetRelease() (gas: 1388790)\n[PASS] testMaxPageGasWithinBudgetWhenUncapped() (gas: 2338692)\n[PASS] testRobinhoodMainnetRejectedOnEveryReleasePath() (gas: 9450442)\n[PASS] testTooLittleGasForOneCandidateRevertsClearly() (gas: 17619788)\n[PASS] testTruncatedPageReportsFirstUncheckedNonce() (gas: 1946363)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 410.63ms (546.95ms CPU time)\n\nRan 1 test for test/FeaturedInvariant.t.sol:FeaturedInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 256, calls: 128000, reverts: 0)\n\n╭-----------------+-----------------+-------+---------+----------╮\n| Contract        | Selector        | Calls | Reverts | Discards |\n+================================================================+\n| FeaturedHandler | advanceTime     | 14053 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | cancel          | 14187 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | claim           | 14209 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | deposit         | 14094 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | purchase        | 14187 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | rotateRecipient | 14101 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | settle          | 14296 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | toggleListing   | 14538 | 0       | 0        |\n|-----------------+-----------------+-------+---------+----------|\n| FeaturedHandler | withdraw        | 14335 | 0       | 0        |\n╰-----------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 7155\n  Bound result 9326\n  Bound result 1644\n  Bound result 85540\n  Bound result 449\n  Bound result 133180\n  Bound result 7593\n  Bound result 1812\n  Bound result 60\n  Bound result 5587\n  Bound result 4000\n  Bound result 186\n  Bound result 2\n  Bound result 24\n  Bound result 692073\n  Bound result 15\n  Bound result 4690\n  Bound result 8091\n  Bound result 3422\n  Bound result 311022\n  Bound result 642727\n  Bound result 29\n  Bound result 3000\n  Bound result 212910\n  Bound result 475\n  Bound result 5991\n  Bound result 4096\n  Bound result 4009\n  Bound result 444890\n  Bound result 30\n  Bound result 346223\n  Bound result 120\n  Bound result 237344928932233215\n  Bound result 30000000\n  Bound result 157198259\n  Bound result 277511596451062893\n  Bound result 1630\n  Bound result 6028\n  Bound result 12159707817302679\n  Bound result 70423947251286015\n  Bound result 20\n  Bound result 31\n  Bound result 22595111\n  Bound result 382\n  Bound result 25345306122746026\n  Bound result 2173159515509002\n  Bound result 276972\n  Bound result 2732\n  Bound result 3732202874\n  Bound result 345597\n  Bound result 4096\n  Bound result 767\n  Bound result 769\n  Bound result 71777214294589695\n  Bound result 9540\n  Bound result 3386\n  Bound result 146744073709551615\n  Bound result 40\n  Bound result 8243\n  Bound result 172481103610249215\n  Bound result 2384\n  Bound result 17179869184\n  Bound result 102696817775794911\n  Bound result 569010617831040081\n  Bound result 74966859414961920\n  Bound result 32\n  Bound result 1912\n  Bound result 75644250940394395\n  Bound result 322\n  Bound result 9103\n  Bound result 5165\n  Bound result 947\n  Bound result 3013\n  Bound result 6937\n  Bound result 270933325407007564\n  Bound result 1042530868459558\n  Bound result 17\n  Bound result 300\n  Bound result 1024\n  Bound result 3821\n  Bound result 83344636275378644\n  Bound result 8751\n  Bound result 62\n  Bound result 3707953493\n  Bound result 31\n  Bound result 604800\n  Bound result 1800003600\n  Bound result 104\n  Bound result 3\n  Bound result 1792\n  Bound result 460\n  Bound result 328005359304160871\n  Bound result 100\n  Bound result 5914\n  Bound result 32\n  Bound result 667\n  Bound result 41\n  Bound result 6362\n  Bound result 40000\n  Bound result 225684821632784055\n  Bound result 52947539942941307\n  Bound result 285280472844403671\n  Bound result 229035837012967424\n  Bound result 4725\n  Bound result 4000\n  Bound result 74023167342684767\n  Bound result 127035603870986413\n  Bound result 406542\n  Bound result 169885949660130975\n  Bound result 12345\n  Bound result 853\n  Bound result 377347551802061319\n  Bound result 223\n  Bound result 2640971383611532\n  Bound result 6157\n  Bound result 8\n  Bound result 372\n  Bound result 230304381176537400\n  Bound result 2186\n  Bound result 5423\n  Bound result 4139\n  Bound result 183019655932542975\n  Bound result 8513\n  Bound result 9715\n  Bound result 7319\n  Bound result 371\n  Bound result 1\n  Bound result 300000000000000000\n  Bound result 4457\n  Bound result 316964\n  Bound result 2665870005905283\n  Bound result 498853764125984773\n  Bound result 39956487125657855\n  Bound result 127327\n  Bound result 5217\n  Bound result 4131\n  Bound result 89821042463539455\n  Bound result 1056290820\n  Bound result 80466026493285592\n  Bound result 2243\n  Bound result 74966859414961920\n  Bound result 15617133935015283\n  Bound result 14080\n  Bound result 100000000000000000\n  Bound result 278632365283678357\n  Bound result 561440\n  Bound result 249111254310977535\n  Bound result 546\n  Bound result 244\n  Bound result 11941\n  Bound result 543452\n  Bound result 216\n  Bound result 1570\n  Bound result 6145\n  Bound result 1089\n  Bound result 101289861579269388\n  Bound result 593585156\n  Bound result 98678654938376526\n  Bound result 402087717160645503\n  Bound result 593585156\n  Bound result 25928667018422229\n  Bound result 6637\n  Bound result 340\n  Bound result 3732202875\n  Bound result 4963\n  Bound result 7237\n  Bound result 6953\n  Bound result 344825\n  Bound result 40\n  Bound result 192\n  Bound result 1806147089\n  Bound result 1137733038054273\n  Bound result 42\n  Bound result 2215\n  Bound result 208\n  Bound result 339075928\n  Bound result 665155\n  Bound result 645788\n  Bound result 8753\n  Bound result 125169935154903511\n  Bound result 72057594037927935\n  Bound result 642\n  Bound result 519224\n  Bound result 6393801195045137\n  Bound result 513\n  Bound result 4396\n  Bound result 427739717599645\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 27.98s (27.98s CPU time)\n\nRan 10 test suites in 27.99s (28.98s CPU time): 126 tests passed, 0 failed, 0 skipped (126 total tests)\n","passed":true},{"durationMs":67,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BoundedSwapHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"BoundedSwapHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FeaturedPlacements.acceptOwnership()\",\"FeaturedPlacements.cancel(uint256)\",\"FeaturedPlacements.cancelOwnershipTransfer()\",\"FeaturedPlacements.configureToken(address)\",\"FeaturedPlacements.deposit(uint256)\",\"FeaturedPlacements.purchase(uint256,uint256,address,uint256)\",\"FeaturedPlacements.setProceedsRecipient(address)\",\"FeaturedPlacements.settle(uint256)\",\"FeaturedPlacements.transferOwnership(address)\",\"FeaturedPlacements.withdraw(uint256,address)\",\"FeaturedPlacements.withdrawProceeds(uint256,address)\",\"HookJobRequester.expireJob(bytes32)\",\"HookJobRequester.expireReview(bytes32)\",\"HookJobRequester.onJobFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"HookJobRequester.onJobResult(bytes32,bytes)\",\"HookJobRequester.onReviewFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"HookJobRequester.onReviewResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"HookJobRequester.openJob(bytes32,bytes)\",\"HookJobRequester.requestReview(bytes32)\",\"HookJobRequester.setFailureHook(bool)\",\"HookJobRequester.setIntake(address)\",\"HookJobRequester.setJobTemplate(bytes32,bytes,bytes,bytes)\",\"HookJobRequester.setOracleSigner(address)\",\"HookJobRequester.setPayment(address,uint256)\",\"HookJobRequester.setReviewTemplate(bytes32,bytes,bytes,uint16,uint16)\",\"HookJobRequester.setTimeouts(uint64,uint64)\",\"HookJobRequester.sweep(address,address,uint256)\",\"HookJobRequester.transferOwnership(address)\",\"HookListingRegistry.acceptListingOwnership(uint256)\",\"HookListingRegistry.cancelListingTransfer(uint256)\",\"HookListingRegistry.createListing(uint256,address,(string,string,string,string,string,uint160,string,string,string,string[]))\",\"HookListingRegistry.proposeListingOwner(uint256,address)\",\"HookListingRegistry.setListingActive(uint256,bool)\",\"HookListingRegistry.updateListing(uint256,(string,string,string,string,string,uint160,string,string,string,string[]))\",\"HooksStoreFactory.deploy((uint32,bytes32,uint256,address,bytes32,uint160,uint128),bytes32,address,bytes32)\"],\"files\":{\".gitignore\":6,\"LICENSE\":24,\"README.md\":103,\"dependencies.lock.json\":20,\"docs/CHAINS.md\":18,\"docs/DEPENDENCIES.md\":22,\"docs/DEPLOYMENT.md\":69,\"docs/HOOK_SPEC.md\":63,\"docs/IMD_INTEGRATION.md\":75,\"docs/LISTINGS_AND_ADS.md\":205,\"docs/STORE_API.md\":69,\"docs/THREAT_MODEL.md\":59,\"docs/VERIFICATION.md\":135,\"docs/build-fingerprints.json\":28,\"docs/checksums/FORMAT_ONLY.txt\":24,\"docs/checksums/UPSTREAM.sha256\":96,\"docs/checksums/VENDORED.sha256\":96,\"foundry.toml\":22,\"remappings.txt\":3,\"schemas/hook-spec.v1.schema.json\":17,\"script/DeployHook.s.sol\":38,\"script/DeployHookJobRequester.s.sol\":86,\"script/DeployStore.s.sol\":19,\"script/verify-vendored.sh\":15,\"sdk/hooks_store.py\":306,\"site/index.html\":168,\"site/listings.html\":56,\"site/listings.js\":212,\"src/BoundedSwapHook.sol\":97,\"src/DisabledCallbacks.sol\":63,\"src/HookSpec.sol\":61,\"src/HooksStoreFactory.sol\":114,\"src/deployment/DeploymentPolicy.sol\":21,\"src/deployment/HookDeployment.sol\":44,\"src/deployment/HookMiner.sol\":63,\"src/imd/HookJobRequester.sol\":518,\"src/imd/IIntake.sol\":27,\"src/imd/OracleAttestation.sol\":221,\"src/interfaces/IHooksStore.sol\":36,\"src/store/ExactStoreToken.sol\":48,\"src/store/FeaturedPlacements.sol\":268,\"src/store/HookListingRegistry.sol\":217,\"src/store/StoreAdmin.sol\":46,\"src/vendor/openzeppelin/LICENSE\":22,\"src/vendor/openzeppelin/interfaces/IERC1271.sol\":17,\"src/vendor/openzeppelin/interfaces/IERC5267.sol\":28,\"src/vendor/openzeppelin/interfaces/IERC7913.sol\":18,\"src/vendor/openzeppelin/utils/Bytes.sol\":247,\"src/vendor/openzeppelin/utils/Panic.sol\":57,\"src/vendor/openzeppelin/utils/ShortStrings.sol\":122,\"src/vendor/openzeppelin/utils/StorageSlot.sol\":143,\"src/vendor/openzeppelin/utils/Strings.sol\":515,\"src/vendor/openzeppelin/utils/cryptography/ECDSA.sol\":285,\"src/vendor/openzeppelin/utils/cryptography/EIP712.sol\":160,\"src/vendor/openzeppelin/utils/cryptography/MessageHashUtils.sol\":100,\"src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol\":162,\"src/vendor/openzeppelin/utils/math/Math.sol\":758,\"src/vendor/openzeppelin/utils/math/SafeCast.sol\":1162,\"src/vendor/openzeppelin/utils/math/SignedMath.sol\":68,\"test/AuditFixes.t.sol\":192,\"test/DeployHookJobRequester.t.sol\":103,\"test/Deployment.t.sol\":329,\"test/FeaturedAdversarial.t.sol\":151,\"test/FeaturedInvariant.t.sol\":186,\"test/FeaturedPlacements.t.sol\":446,\"test/HookIntegration.t.sol\":294,\"test/HookJobRequester.t.sol\":734,\"test/HookListingRegistry.t.sol\":265,\"test/OracleConformance.t.sol\":103,\"test/helpers/Fixture.sol\":46,\"test/helpers/ImdTemplates.sol\":15,\"test/helpers/MockIntake.sol\":111,\"test/helpers/PoolRouter.sol\":76,\"test/helpers/StoreFixture.sol\":81,\"test/helpers/StoreTokenMock.sol\":82,\"test/helpers/TestToken.sol\":13,\"test/listings-reader.test.cjs\":97,\"test/test_store_sdk.py\":193},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3771,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:315: Math.invMod(uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#315-363) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/vendor/openzeppelin/utils/math/Math.sol:204: Math.mulDiv(uint256,uint256,uint256) (src/vendor/openzeppelin/utils/math/Math.sol#204-275) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/store/FeaturedPlacements.sol:217: FeaturedPlacements.getPlacement(uint256) (src/store/FeaturedPlacements.sol#217-220) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/imd/HookJobRequester.sol:249: Reentrancy in HookJobRequester.requestReview(bytes32) (src/imd/HookJobRequester.sol#249-271):\n[medium/medium] uninitialized-local at src/imd/HookJobRequester.sol:469: HookJobRequester._validateBrief(bytes).cp (src/imd/HookJobRequester.sol#469) is a local variable never initialized\n[medium/medium] uninitialized-local at src/imd/HookJobRequester.sol:468: HookJobRequester._validateBrief(bytes).len (src/imd/HookJobRequester.sol#468) is a local variable never initialized\n[medium/medium] unused-return at src/store/FeaturedPlacements.sol:104: FeaturedPlacements.configureToken(address) (src/store/FeaturedPlacements.sol#104-113) ignores return value by ExactStoreToken.balance(token,address(this)) (src/store/FeaturedPlacements.sol#110)\n[medium/medium] unused-return at src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol:44: SignatureChecker.isValidSignatureNowCalldata(address,bytes32,bytes) (src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol#44-55) ignores return value by (recovered,err,None) = ECDSA.tryRecoverCalldata(hash,signature) (src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol#50)\n[medium/medium] unused-return at src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol:32: SignatureChecker.isValidSignatureNow(address,bytes32,bytes) (src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol#32-39) ignores return value by (recovered,err,None) = ECDSA.tryRecover(hash,signature) (src/vendor/openzeppelin/utils/cryptography/SignatureChecker.sol#34)\n[low/medium] reentrancy-benign at src/imd/HookJobRequester.sol:249: Reentrancy in HookJobRequester.requestReview(bytes32) (src/imd/HookJobRequester.sol#249-271):\n[low/medium] reentrancy-benign at src/store/FeaturedPlacements.sol:123: Reentrancy in FeaturedPlacements.deposit(uint256) (src/store/FeaturedPlacements.sol#123-131):\n[low/medium] reentrancy-benign at src/imd/HookJobRequester.sol:178: Reentrancy in HookJobRequester.openJob(bytes32,bytes) (src/imd/HookJobRequester.sol#178-198):\n[low/medium] timestamp at src/imd/OracleAttestation.sol:157: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/imd/OracleAttestation.sol#157-165) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:222: FeaturedPlacements.isActive(uint256) (src/store/FeaturedPlacements.sol#222-225) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:217: FeaturedPlacements.getPlacement(uint256) (src/store/FeaturedPlacements.sol#217-220) uses timestamp for comparisons\n[low/medium] timestamp at src/imd/HookJobRequester.sol:309: HookJobRequester.expireReview(bytes32) (src/imd/HookJobRequester.sol#309-319) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:145: FeaturedPlacements.purchase(uint256,uint256,address,uint256) (src/store/FeaturedPlacements.sol#145-173) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:195: FeaturedPlacements.settle(uint256) (src/store/FeaturedPlacements.sol#195-204) uses timestamp for comparisons\n[low/medium] timestamp at src/imd/HookJobRequester.sol:234: HookJobRequester.expireJob(bytes32) (src/imd/HookJobRequester.sol#234-242) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:177: FeaturedPlacements.cancel(uint256) (src/store/FeaturedPlacements.sol#177-192) uses timestamp for comparisons","passed":true},{"durationMs":778,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/vendor/openzeppelin/utils/cryptography/MessageHashUtils.sol:63: `abi.encodePacked()` Hash Collision (2 places)\n[high] incorrect-caret-operator at src/vendor/openzeppelin/utils/math/Math.sol:257: Incorrect use of caret operator\n[high] incorrect-shift-order at src/deployment/HookMiner.sol:27: Incorrect Assembly Shift Parameter Order\n[high] reentrancy-state-change at src/imd/HookJobRequester.sol:184: Reentrancy: State change after external call (3 places)\n[high] reused-contract-name at src/vendor/openzeppelin/utils/math/SafeCast.sol:19: Contract Name Reused in Different Files\n[high] unsafe-casting at src/vendor/openzeppelin/utils/Strings.sol:432: Unsafe Casting of integers\n[low] centralization-risk at src/imd/HookJobRequester.sol:21: Centralization Risk (13 places)\n[low] costly-loop at src/store/HookListingRegistry.sol:175: Costly operations inside loop (2 places)\n[low] ecrecover at src/vendor/openzeppelin/utils/cryptography/ECDSA.sol:191: `ecrecover` Signature Malleability\n[low] internal-function-used-once at src/HookSpec.sol:35: Internal Function Used Only Once (33 places)\n[low] large-numeric-literal at src/deployment/HookMiner.sol:9: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/imd/HookJobRequester.sol:452: Literal Instead of Constant (211 places)\n[low] non-reentrant-not-first at src/store/FeaturedPlacements.sol:104: `nonReentrant` is Not the First Modifier\n[low] push-zero-opcode at src/vendor/openzeppelin/interfaces/IERC1271.sol:4: PUSH0 Opcode (15 places)\n[low] require-revert-in-loop at src/deployment/HookMiner.sol:51: Loop Contains `require`/`revert` (6 places)\n[low] state-no-address-check at src/BoundedSwapHook.sol:43: Address State Variable Set Without Checks\n[low] state-variable-could-be-immutable at src/BoundedSwapHook.sol:21: State Variable Could Be Immutable (5 places)\n[low] unchecked-return at src/store/FeaturedPlacements.sol:110: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/imd/HookJobRequester.sol:498: Uninitialized Local Variable (6 places)\n[low] unsafe-erc20-operation at src/store/ExactStoreToken.sol:43: Unsafe ERC20 Operation\n[low] unspecific-solidity-pragma at src/vendor/openzeppelin/interfaces/IERC1271.sol:4: Unspecific Solidity Pragma (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"879065eae2c6b09a6dc6d82a8f08c6c11ee8d1dc71bd9d994c857665a0321445","verifiedTreeHash":"93e5538ebb4dd9ce75987a4dc996afa0e9c1ebde","verifierVersion":"0.1.0+63e0a393"}]}