{"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":"d8ec4ec9-b939-4ff8-8ce1-fad7a6a69bd9","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"616ecba87b2a7f11f2f913fe959cb35f3ad21eda7a17eaf536c1d56ad34d1763","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 from 510bcfbf16cd6580a0f2409e9a92493241bbaa46. Implement and locally test oracle-gated generated-hook deployment. Code only: no public deployment, paid requests, signatures, keys, token or pool creation.\n\nKeep the build/test/adversarial-review job and separate oracle confirmation. Reuse the requester and its protections; explain necessary contract changes. A Delivered job or user-supplied review URL is not approval.\n\nEnforce approval in the official deployment contract, not just the website. Bind the verified verdict to the exact job/result and deployment artifact: source/build identity, initcode, constructor arguments, chain, PoolManager and callback permissions. Reject substitutions, wrong context, stale/replayed approvals and bypasses. Disclose signer/owner trust; an owner allowlist is not an oracle proof.\n\nImplement permission-correct CREATE2 mining, deployment and code/configuration readback for generated hooks, not only BoundedSwapHook. Verify each enabled production chain and PoolManager from first-party sources; no blanket mainnet unlock. Preserve regression tests; label legacy ungated routes honestly.\n\nProvide an executable path from job result through oracle verification/binding to unsigned deployment calldata. Automate routine evidence checks. Do not silently require founder approval of every hook, add a hosted backend/hot wallet, or assume owner-only bindReview is automatic. If authenticated binding cannot be automated under these constraints, identify the exact blocker; never fake a proof.\n\nTest success, forged/substituted artifacts, missing/failed reviews, both callback/binding orders, wrong chain/manager/mask, collisions, replay and malicious constructors. Exercise every gated deployment entry point. Rerun Foundry/site/ABI/SDK suites, gas and size limits; update tools/docs. Return commit, runnable local evidence, changed trust assumptions and remaining live-pilot gates. No claim of audit or live readiness.","parentJobId":"dc3bc239-442f-4ed4-9dd0-281045da7c9e","planHash":"4d841a312fa36f6cb799c5abb695d394a85b5176b5602b8f2e4e6f820525aa60","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":"52676","feedbackHash":"f73ebe2f0872ec0b276c1b7ad14b56133c3ce2ad3354ec3e43812e02bb8483c2","nodeKey":"build_contract_project","submissionHash":"616ecba87b2a7f11f2f913fe959cb35f3ad21eda7a17eaf536c1d56ad34d1763","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4d7bf8835252ce5617bc68d8ff43635000ca5333f7b6bc3d06bdc1f72235def4","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3c08b77c249d42a669a1b0101683f241f57b24bccffac41c22a497db588a167a","device":"970da38f1d564250","findings":[],"hash":"616ecba87b2a7f11f2f913fe959cb35f3ad21eda7a17eaf536c1d56ad34d1763","nodeId":"47485295-1d3c-4f53-92da-b1e97e376982","outcome":"completed","summary":"I've added `src/deployment/GatedHookDeployer.sol`, a deployer that refuses to deploy a generated hook unless the oracle has signed a passing review for it. It's committed as `2ebeffa` on top of `510bcfb`. Nothing was deployed, no paid request was made, nothing was signed, and this is not an audit or a claim of live readiness.\n\n**What I changed in contracts**\n- **New deployer.** It works for any generated hook that exposes `poolManager()` and `getHookPermissions()`, not just BoundedSwapHook. It mines a CREATE2 salt whose address carries exactly the hook's callback permission bits, deploys there, and reads back the runtime code hash, `poolManager()` and `getHookPermissions()`.\n- **`HookJobRequester` is unchanged, by necessity.** It is 24,117 bytes, only 459 bytes under the contract size limit, so there was no room to add an artifact-specific review. Instead, the artifact is bound through the job's result document:\n  - The document's hash must equal the job's stored result hash.\n  - It must contain `\"hooksStoreArtifact\":\"0x<digest>\"`.\n  - The digest covers the job id, source and build identity, initcode, constructor arguments, expected runtime code hash, chain, the deployer itself, the PoolManager and its code hash, and the permission mask.\n- **Gate conditions.** A deployment needs a delivered job and an oracle-signed `Passed` review that hasn't been revoked. It also needs a job younger than `maxJobAge` (default 30 days) and must be sent by the job's requester. Each job and each digest can deploy only once, the approval is used up before CREATE2, and the function has a reentrancy lock. `deploy` is the only gated entry point.\n- **Chains.** On Ethereum, Base, Robinhood Chain and Sepolia, only one PoolManager address and code hash can ever be enabled. I took the addresses from Uniswap's own deployment table and checked the code hashes live; `script/recheck_gated_managers.sh` reruns that check (all four were OK). Local 31337, Base Sepolia 84532 and Robinhood testnet 46630 accept a manager the owner enables. Every other chain is refused. No chain has a manager enabled until the owner calls `setManager`.\n- **Legacy route.** `HooksStoreFactory` is untouched and is documented as the old ungated, testnet-only, BoundedSwapHook-only route.\n\n**Path from job result to calldata:** `python3 -m sdk.gated_deploy` reads the job and checks the result document and its artifact line. It mines a salt with an `eth_call`, runs the contract's own `check(...)` as an `eth_call`, and prints an unsigned `deploy` transaction plus a list of the evidence it checked.\n\n**Local evidence**\n- `forge build`, `forge fmt --check` and `forge test` with the given fuzz seed: 297 tests pass across 29 suites. 44 of them are in `test/GatedHookDeployer.t.sol` and cover every rejection the brief lists, against the real requester:\n  - success, and both callback/binding orders\n  - forged signatures, and missing, failed or unanswered reviews\n  - substituted code, arguments, documents or other jobs' approvals\n  - wrong chain, deployer, manager, code hash or mask\n  - address collisions, replay, stale approvals and revoked signers\n  - six malicious constructors\n  - a real pool initialized on a gated BoundedSwapHook\n- Python: 35 tests pass, including 5 new ones in `test/test_gated_deploy.py`. These run on a local Anvil chain against a stand-in requester with no oracle checks, so the signature path is covered only by the Foundry tests.\n- Both JS tests pass. Sizes: the deployer is 10,342 bytes; the requester is unchanged.\n- Gas: `deploy` averages 375k and peaks at 1.1M. A full 131,072-candidate mining page can use up to about 32M gas as an `eth_call`, so the tool uses 4,096-candidate pages.\n- The new ABI is in `site/GatedHookDeployer.abi.json`.\n\n**Trust assumptions that changed**\n- **Artifact binding rests on the review panel.** The deployer does not recompute the digest from source. The panel and reviewers must confirm that the digest named in the result document is the artifact they ","treeHash":"4e2b862537c0b7751431a90ef244c80ed32586d2","usage":{"cachedInputTokens":3840439,"inputTokens":78,"model":"claude-opus-5-5","outputTokens":52892,"runtime":"claude","turns":43,"wallClockMs":727886}}],"verification":[{"checks":[{"durationMs":13957,"exitCode":0,"name":"build","output":"Compiling 136 files with Solc 0.8.26\nSolc 0.8.26 finished in 13.83s\nCompiler run successful!\n","passed":true},{"durationMs":29497,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/ReviewBinding.t.sol:RequesterOwnershipTest\n[PASS] testMistypedHandoverCanBeCancelledOrReplacedAndOnlyNomineeAccepts() (gas: 430359)\n[PASS] testZeroAndSelfHandoversRefusedWithoutLosingControl() (gas: 103680)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.09ms (367.51µs CPU time)\n\nRan 1 test for test/AuditExpiryProof.t.sol:ExpiryFrontRunShoppingTest\n[PASS] testRequesterFrontRunsLateNotPassedWithExpiryAndReasks() (gas: 1278383)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.61ms (1.18ms CPU time)\n\nRan 3 tests for test/DeployHookJobRequester.t.sol:DeployHookJobRequesterTest\n[PASS] testCheckRefusesAddressesWithoutCodeAndUnsoldActions() (gas: 136180)\n[PASS] testDeployThenConfigureGivesAWorkingRequesterOwnedByTheNamedOwner() (gas: 7241222)\n[PASS] testRunRefusesZeroBroadcaster() (gas: 86380)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.64ms (1.59ms CPU time)\n\nRan 1 test for test/JobProtocolTuple.t.sol:JobProtocolGasTest\n[PASS] testColdTupleWithLongURIFits200kAndRuntimeLimit() (gas: 894390)\nLogs:\n  Cold job tuple with 4096-byte URI minimum forwarded gas: 67052\n  Requester deployed runtime bytes: 24117\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.10ms (994.02µs CPU time)\n\nRan 1 test for test/UriPilotGas.t.sol:UriPilotGasTest\n[PASS] testColdMeasuredUriBoundaryAndOneAttemptFeeLoss() (gas: 872304)\nLogs:\n  Local cold URI bytes delivered under exact 200k: 20224\n  Local cold URI bytes exceeding exact 200k: 20256\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.38ms (565.24µs 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: 2093568)\n[PASS] testTaxedOrFailedWithdrawalRollsBackAndRemainsRetryable() (gas: 1194337)\n[PASS] testTokenCallbacksCannotReenterAnyCustodyMutation() (gas: 3108803)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.51ms (3.07ms CPU time)\n\nRan 4 tests for test/OracleConformance.t.sol:OracleConformanceTest\n[PASS] testProtocolSignatureVerifiesBeforeItsNonBoolAnswerIsRefused() (gas: 2060648)\n[PASS] test_acceptsAFreshSignatureFromTheVectorKeyAsDelivered() (gas: 2136385)\n[PASS] test_callbackSelectorsAreCanonical() (gas: 3965)\n[PASS] test_digestMatchesTheProtocol() (gas: 13912)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.88ms (2.02ms CPU time)\n\nRan 1 test for test/AuditReceiptConflictProof.t.sol:StuckReceiptProofTest\n[PASS] testOwnerCanCloseReceiptWhoseUuidWasConsumedElsewhere() (gas: 2596747)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.79ms (5.60ms CPU time)\n\nRan 6 tests for test/OracleSigner.t.sol:OracleSignerTest\n[PASS] testContractSignerUsesErc1271FallbackUnderTheStipend() (gas: 2627221)\n[PASS] testDelegatedSignerStillRejectsWrongKeyTamperingAndMalformedEcdsa() (gas: 2511895)\n[PASS] testEcdsaKeyRemainsValidEvenIfItsCodeRejectsErc1271() (gas: 2249328)\n[PASS] testEip7702DesignatorDoesNotDisableTheSignersEcdsaKey() (gas: 2263466)\n[PASS] testErc1271RevocationRevertAndShortReturnFailClosedAndDoNotConsume() (gas: 3047340)\n[PASS] testFutureAttestationIsRefusedWithoutConsumingIt() (gas: 2187980)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 11.68ms (8.44ms CPU time)\n\nRan 29 tests for test/HookJobRequester.t.sol:HookJobRequesterTest\n[PASS] testAnswerSignedForAnotherConsumerRefused() (gas: 2191898)\n[PASS] testBodyIsExactTemplateWithStepsSpecAndQuotedBrief() (gas: 947576)\n[PASS] testBriefValidation() (gas: 1870180)\n[PASS] testCallbackWithUnexpectedAbiFailsSafeAndJobCanExpire() (gas: 1202748)\n[PASS] testCallbacksFitTheIntakeStipend() (gas: 1859307)\n[PASS] testConstructorRefusesZeroAddresses() (gas: 10483)\n[PASS] testForgedExpiredWeakOrMistypedAnswersRefused() (gas: 2799455)\n[PASS] testFuzzPrintableAsciiBriefAcceptedUnlessReserved(bytes32,uint8) (runs: 256, μ: 513318, ~: 868182)\nLogs:\n  Bound result 20\n\n[PASS] testJobFailureClosesJobOnceAndIsNotAVerdict() (gas: 1954526)\n[PASS] testJobIdCollidingWithPendingReviewAskRefused() (gas: 2464996)\n[PASS] testOpenJobPaysOncePullsExactPriceAndTracksRequestId() (gas: 1153399)\n[PASS] testOwnerSettersAreOwnerOnlyAndValidated() (gas: 638330)\n[PASS] testPriceCeilingProtectsStandingAllowance() (gas: 3071134)\n[PASS] testResultAcceptedOnceFromIntakeOnly() (gas: 1116520)\n[PASS] testReusedRequestIdRefused() (gas: 1242437)\n[PASS] testReviewExpiryRequestedByRequesterAndConfirmedByOwner() (gas: 2378290)\n[PASS] testReviewFailureLeavesNoVerdictAndAllowsRetry() (gas: 3487817)\n[PASS] testReviewNotPassedIsStoredNotReverted() (gas: 2275740)\n[PASS] testReviewOnlyForDeliveredOrExpiredJobsByRequester() (gas: 2404055)\n[PASS] testReviewPassedOnlyFromSignedOracleAnswer() (gas: 2494788)\n[PASS] testSameAttestationCannotSettleASecondAsk() (gas: 4306375)\n[PASS] testSignerRotationTakesEffect() (gas: 2361296)\n[PASS] testStaticSiteReadContract() (gas: 1019818)\n[PASS] testSweepRecoversStrayTokens() (gas: 137069)\n[PASS] testUnconfiguredRequesterRefusesUntilOwnerSetsTemplates() (gas: 1560555)\n[PASS] testUnknownRequestIdRefused() (gas: 142556)\n[PASS] testUnpricedActionAndVersion1IntakeRefusedWithoutPayment() (gas: 472643)\n[PASS] testVersion1IntakeWorksWithTheFailureHookOff() (gas: 3249057)\n[PASS] testWalletMustApproveAndPay() (gas: 373289)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 84.33ms (80.32ms 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, μ: 842677, ~: 842726)\n[PASS] testFuzzValidLabelsRemainSearchable(uint128) (runs: 256, μ: 747341, ~: 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 87.62ms (89.82ms CPU time)\n\nRan 5 tests for test/FeaturedTransfer.t.sol:FeaturedTransferTest\n[PASS] testBuyerCanClearSellersAdAndBuyItsOwnWhileOnlySellerGetsRefund() (gas: 3188812)\n[PASS] testFuzzNewOwnerCancellationConservesAllCredits(uint256) (runs: 256, μ: 1712288, ~: 1713805)\nLogs:\n  Bound result 15161\n\n[PASS] testIntermediateOwnerLosesCancellationPowerButOriginalPayerKeepsIt() (gas: 1869005)\n[PASS] testNewOwnerCannotCancelAtExpiryAndCanRenewBeforeOldSettlement() (gas: 2169353)\n[PASS] testProposedOwnerCannotCancelUntilAcceptingAndAdminCannotCancel() (gas: 1838309)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 90.03ms (89.11ms CPU time)\n\nRan 3 tests for test/ReviewReceiptPacking.t.sol:ReviewReceiptPackingTest\n[PASS] testAllocatedMetadataIsNotAnAnswerAndReadAbiRemainsTenWords() (gas: 1882167)\n[PASS] testFuzzReceiptPreservesFullContextAndPackedFields(uint64,uint64,uint64,uint16,uint16,bool,uint256) (runs: 256, μ: 2402672, ~: 2402644)\nLogs:\n  Bound result 18863\n  Bound result 9666\n  Bound result 4750\n\n[PASS] testReceiptPackingMaximumValuesDoNotLeakIntoAdjacentFields() (gas: 2392631)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 104.64ms (103.89ms 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: 1586722)\n[PASS] testDepositWithdrawBelongsToDepositorAndCannotBeSwept() (gas: 693423)\n[PASS] testDirectTransfersAreNotCreditsAndCannotBeSwept() (gas: 496850)\n[PASS] testEditingInvalidatesStalePurchaseAndFeeDisclosuresAreSnapshotted() (gas: 1995083)\n[PASS] testExpirySettlementIsPermissionlessAndCannotBeRepeatedOrRefunded() (gas: 1830989)\n[PASS] testFeaturedOrderingPaginationAndLabelsSkipCancelledAndExpired() (gas: 3095145)\n[PASS] testFuzzCancellationConservesFundsAndRoundsInPayersFavor(uint256) (runs: 256, μ: 1590320, ~: 1591843)\nLogs:\n  Bound result 14099\n\n[PASS] testHalfDurationCancellationSplitsFeeAndProceedsArePullBased() (gas: 1742376)\n[PASS] testImmediateCancellationFullyRefundsThenOwnerCanWithdraw() (gas: 1648242)\n[PASS] testOnlyListingOwnerCanBuyAndUnrelatedAccountsCannotCancelIncludingAdmin() (gas: 1766171)\n[PASS] testPurchaseCostsExactlyPointOneImdAndHasSevenDayAdLabel() (gas: 1481632)\n[PASS] testRecipientRotationInvalidatesStalePurchaseBeforeFundsAreLocked() (gas: 1453614)\n[PASS] testRecipientsAreSnapshottedAndChangingThemCannotTakeOldFunds() (gas: 2414968)\n[PASS] testSingleLivePlacementButCanRenewUnsettledExpiredOrCancelledPlacement() (gas: 2497512)\n[PASS] testSnapshotSurvivesEditingArchivingTransferAndRefundStaysWithPayer() (gas: 2399315)\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 121.15ms (125.19ms 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, μ: 210228, ~: 210022)\n[PASS] testFuzzRealSwapsSettleAndConserve(uint128,bool,bool,bool) (runs: 256, μ: 280992, ~: 278533)\nLogs:\n  Bound result 4373\n\n[PASS] testFuzzSignedBoundaryAndNeutralReturn(int256,bytes) (runs: 256, μ: 30795, ~: 29816)\n[PASS] testFuzzUnauthorizedCallbacks(address) (runs: 256, μ: 95005, ~: 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 182.60ms (190.37ms CPU time)\n\nRan 11 tests for test/JobProtocolTuple.t.sol:JobProtocolTupleTest\n[PASS] testDuplicateCannotReplaceHashOrURI() (gas: 1092073)\n[PASS] testEmptyURICanBeReportedWithoutReviewApproval() (gas: 1026753)\n[PASS] testFuzzLateTupleWorksBeforeOrAfterLocalExpiry(bool) (runs: 256, μ: 1104328, ~: 1104328)\n[PASS] testFuzzSuppliedHashAndURIBytesArePreserved(bytes32,uint16) (runs: 256, μ: 1123810, ~: 1094891)\nLogs:\n  Bound result 66\n\n[PASS] testLateTuplePreservesFinalizedNegativeReview() (gas: 2468528)\n[PASS] testMalformedTuplesLoseOnlyTheSingleIntakeAttempt() (gas: 6654115)\n[PASS] testObsoleteSelectorIsNotAnAlias() (gas: 1024978)\n[PASS] testProtocolTuple() (gas: 996399)\n[PASS] testRegisteredSelectorAndResultEventsMatchProtocol() (gas: 1102173)\n[PASS] testUnauthorizedTupleLeavesJobAndLogsUntouched() (gas: 1117916)\n[PASS] testUnknownTupleCannotDeliverAnotherRequest() (gas: 1029152)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 213.86ms (216.56ms CPU time)\n\nRan 8 tests for test/ReviewReceiptGas.t.sol:ReviewReceiptGasTest\n[PASS] testAudit22ColdReadsNowRetainsOneShotReceiptAndBoundVerdict() (gas: 4150823)\nLogs:\n  Cold audit registry +22 reads receipt minimum forwarded gas: 187231\n  Cold audit registry +22 reads bound minimum forwarded gas: 149726\n\n[PASS] testColdEoaReceiptGasAndExactStipend() (gas: 1521757)\nLogs:\n  Cold EOA receipt minimum forwarded gas: 124984\n\n[PASS] testColdFiveOfSevenReceiptAfterExpiryRequestFitsStipend() (gas: 2836682)\nLogs:\n  Cold 5-of-7 receipt after expiry request minimum forwarded gas: 170077\n\n[PASS] testColdFiveOfSevenReceiptAndBoundCallbacksFitStipend() (gas: 4114308)\nLogs:\n  Cold 5-of-7 receipt minimum forwarded gas: 170077\n  Cold 5-of-7 bound minimum forwarded gas: 132553\n\n[PASS] testColdFiveOfSevenRetryReceiptBeforeReservationReleaseFitsStipend() (gas: 2938567)\nLogs:\n  Cold 5-of-7 reserved retry receipt minimum forwarded gas: 170077\n\n[PASS] testColdWrongPrebindingRetainsReceiptWithFiveOfSevenAndAuditSigner() (gas: 4934759)\nLogs:\n  Cold 5-of-7 mismatched pre-binding minimum forwarded gas: 175123\n  Cold audit +22 reads mismatched pre-binding minimum forwarded gas: 192286\n\n[PASS] testFuzzMultisignerRefusesWrongKeyDuplicateRevokedExpiredOrInsufficientSignatures(uint8) (runs: 256, μ: 382501, ~: 385495)\nLogs:\n  Bound result 3\n\n[PASS] testOverBudgetSignerStillFailsClosedAndLosesSingleAttemptWithoutPartialReceipt() (gas: 711516)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 352.69ms (345.00ms 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, μ: 29868, ~: 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 357.22ms (147.49ms CPU time)\n\nRan 13 tests for test/ReviewBinding.t.sol:ReviewBindingTest\n[PASS] testAnswerAtDeadlineAcceptedAndExcessiveBackwardSkewRefused() (gas: 2382031)\n[PASS] testBindingRequiresOwnerAndExactRecordedBodyAndCannotBeOverwritten() (gas: 2211557)\n[PASS] testExpiredAskAnswerCannotSettleRetryOfIdenticalQuestion() (gas: 3656740)\n[PASS] testFuzzIntakeIdCannotBeReusedAfterReviewCloses(uint8) (runs: 256, μ: 2806953, ~: 2831866)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzOracleIdReservationSurvivesFailureExpiryAndSettlement(uint8) (runs: 256, μ: 4268144, ~: 4295404)\nLogs:\n  Bound result 1\n\n[PASS] testInvalidOrUnknownBindingsRefused() (gas: 2068064)\n[PASS] testLateValidAnswerAndLateBindingAllowedUntilExplicitExpiry() (gas: 4466236)\n[PASS] testOwnerRotationPowersApplyToAlreadyPendingRequestsAsDocumented() (gas: 3317082)\n[PASS] testSignedPanelQuorumAndCountsMustBeConsistent() (gas: 2243442)\n[PASS] testSignedWrongQuestionIdChainOrWindowCannotSettle() (gas: 3719940)\n[PASS] testSwappedHonestAnswersLeaveBothPendingThenSettleTheirOwnAsks() (gas: 5021773)\n[PASS] testTemplateAndTimeoutChangesDoNotChangePendingAskContext() (gas: 2568227)\n[PASS] testUnboundReceiptDoesNotTrustMatchingIntakeIdAndRawBodyHash() (gas: 2428721)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 421.85ms (557.10ms CPU time)\n\nRan 7 tests for test/ReviewAuditRegression.t.sol:ReviewAuditRegressionTest\n[PASS] testExpiryNeedsDeadlineAndCurrentOwnerApprovalForExactAsk() (gas: 3755978)\n[PASS] testExpiryRequestAllowsBindingBeforeLateDelivery() (gas: 2447036)\n[PASS] testFuzzExactConflictRecoveryPreservesOtherAskAndReplayProtection(bool,bool,bool) (runs: 256, μ: 5951954, ~: 5951946)\n[PASS] testFuzzExpiryAndDeliveryBothOrdersPreserveVerdictAndBlockRetries(bool,bool,bool) (runs: 256, μ: 2690485, ~: 2779070)\n[PASS] testFuzzSameUuidTypoCannotDiscardGenuineNegativeEvenWithConflict(uint8,bool) (runs: 256, μ: 3470637, ~: 2580490)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzUnavailableDifferentTrueUuidCannotDiscardGenuineNegative(uint8) (runs: 256, μ: 4592762, ~: 4592976)\nLogs:\n  Bound result 0\n\n[PASS] testIntakeFailureAfterExpiryRequestAllowsRetryAndInvalidatesOldApproval() (gas: 3259741)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 426.89ms (1.30s CPU time)\n\nRan 6 tests for test/RequesterMvpAudit.t.sol:RequesterMvpPaymentTest\n[PASS] testCallerLimitZeroFailsAndLowerQuoteChargesOnlyQuote() (gas: 1077278)\n[PASS] testExistingDonationsCannotHideUnderpaymentOrBecomeCallerFunds() (gas: 1829601)\n[PASS] testFuzzCallerLimitSurvivesOwnerCeilingIncreaseAndIntakePriceMove(bool,uint96) (runs: 256, μ: 1610959, ~: 2075185)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzInexactIncomingTokensCannotSpendPreexistingDonations(uint8) (runs: 256, μ: 1208949, ~: 1210500)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzUnderspendingIntakeRollsBackAllStateAndLeavesNothingSweepable(uint256,bool,bool) (runs: 256, μ: 2410870, ~: 2880819)\nLogs:\n  Bound result 40000\n\n[PASS] testTokenCallbackCannotReenterSweepOrChangePaymentConfiguration() (gas: 4055234)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 426.86ms (457.83ms CPU time)\n\nRan 12 tests for test/AuditContextMismatchProof.t.sol:AuditContextMismatchProofTest\n[PASS] testAsynchronousRefusalAfterPaymentClosesWithoutRefund() (gas: 2749066)\n[PASS] testContextMismatchRecoveryCannotSetAsideAMatchingVerdictOrBeCalledByRequester() (gas: 2689591)\n[PASS] testContextMismatchRecoveryNeedsAnUnboundPendingAskWithAReceipt() (gas: 2545315)\n[PASS] testFuzzAcceptedTemplateNamesEveryStepInEveryAssembledBody(bytes32,uint16,uint8) (runs: 256, μ: 1631920, ~: 1643012)\nLogs:\n  Bound result 204\n\n[PASS] testFuzzBodyQuorumBelowConfiguredMinimumNoLongerBurnsAnAgreedAnswer(uint16,uint16,bool,bool) (runs: 256, μ: 2328000, ~: 2272917)\nLogs:\n  Bound result 6\n  Bound result 1\n\n[PASS] testFuzzPanelStrengthMinimumsStillRefuseWeakAnswersInOneShot(uint8) (runs: 256, μ: 2432679, ~: 2432664)\nLogs:\n  Bound result 3\n\n[PASS] testFuzzSameUuidOtherSignedContextWasStuckAndNowClosesHonestly(uint8,bool) (runs: 256, μ: 4070496, ~: 4070568)\nLogs:\n  Bound result 0\n\n[PASS] testFuzzStepMarkerSplitAcrossFragmentsIsRefused(uint8,uint8,uint8) (runs: 256, μ: 1111240, ~: 1113863)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n\n[PASS] testFuzzSynchronousIntakeRefusalRevertsTheWholeAskWithoutDebit(bytes4,bool) (runs: 256, μ: 2551755, ~: 2585082)\n[PASS] testMarkersOnlyACreatorBriefCouldSupplyDoNotSatisfyTheTemplate() (gas: 960879)\n[PASS] testReceiptAcknowledgmentCommitsToTheVerdict() (gas: 2195626)\n[PASS] testReproductionQuorumOneWithSixAgreedIsAValidAnswer() (gas: 2278852)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 427.08ms (1.72s CPU time)\n\nRan 24 tests for test/ReviewDelivery.t.sol:ReviewDeliveryTest\n[PASS] testAnswerAtExactSignatureExpiryCanBeRetainedAndConfirmedLater() (gas: 2353047)\n[PASS] testConfirmedReceiptCannotBeReplayedOrRebound() (gas: 2404078)\n[PASS] testEarlyEip7702KeyReceiptFitsColdStipend() (gas: 2353570)\n[PASS] testEarlyErc1271ReceiptFitsColdStipendAndSurvivesLaterRevocation() (gas: 2884531)\n[PASS] testFreshLateAnswerAcceptedIfRequesterRequestsExpiryFirst() (gas: 2369641)\n[PASS] testFuzzBindingMustMatchEveryRetainedFieldAndFailedBindingCanBeCorrected(uint8) (runs: 256, μ: 2599522, ~: 2599721)\nLogs:\n  Bound result 4\n\n[PASS] testFuzzClockSkewToleranceIsSymmetricAtAskTime(int16,bool) (runs: 256, μ: 2310053, ~: 2323088)\nLogs:\n  Bound result -126\n\n[PASS] testFuzzEarlyOneAttemptCallbackRetainedThenConfirmedWithoutAnotherFee(bool) (runs: 256, μ: 2800122, ~: 2800122)\n[PASS] testFuzzFreshLateAnswerAcceptedUntilExplicitExpiry(bool,uint32) (runs: 256, μ: 2420811, ~: 2400533)\nLogs:\n  Bound result 1\n\n[PASS] testFuzzInvalidEarlyAnswerNeverCreatesReceiptOrVerdict(uint8) (runs: 256, μ: 2024196, ~: 2026580)\nLogs:\n  Bound result 16\n\n[PASS] testFuzzRequesterCannotDiscardRetainedAnswerOrBuyAnotherReview(bool) (runs: 256, μ: 2586628, ~: 2586628)\n[PASS] testIntakeFailureBeforeReceiptIsTerminalAndBindingCannotInventAnAnswer() (gas: 2054289)\n[PASS] testInvalidOneAttemptCallbackLosesFeeAndCannotRetryOrCreateReceipt() (gas: 3581878)\n[PASS] testMalformedOneShotCallbackCannotCreateReceipt() (gas: 1889525)\n[PASS] testOneSecondBackwardSkewAndExactFiveMinuteBoundaryAccepted() (gas: 4620310)\n[PASS] testOnlyCurrentIntakeMayRetainAndOnlyOwnerMayConfirm() (gas: 2552393)\n[PASS] testReceiptBindingStillRequiresExactBodyFingerprint() (gas: 2358125)\n[PASS] testReceiptCanBeConfirmedAfterSignatureExpiryTimeoutAndAuthorityRotation() (gas: 2637612)\n[PASS] testReceiptCannotBeOverwrittenOrClearedBySecondIntakeCallback() (gas: 2592195)\n[PASS] testReservedUuidRetainedWithoutVerdictButConsumedUuidRefused() (gas: 6131275)\n[PASS] testSignatureExpiryStillControlsArrivalEvenAfterAskDeadline() (gas: 2022594)\n[PASS] testSwappedEarlyYesAndNoAnswersCannotBecomeVerdicts() (gas: 4361713)\n[PASS] testTimestampExtremesDoNotOverflowSkewCheck() (gas: 2412099)\n[PASS] testUnconfirmedDuplicateCannotReserveOrConsumeTheActualAsksUuid() (gas: 4374316)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 490.53ms (1.28s CPU time)\n\nRan 11 tests for test/ReviewRecovery.t.sol:ReviewRecoveryTest\n[PASS] testBoundOrTerminalAsksCannotBeDiscarded() (gas: 2367570)\n[PASS] testDiscardingDuplicateReceiptDoesNotClearGenuineConsumedUuid() (gas: 4380228)\n[PASS] testExpiredJobFalseVerdictRemainsTerminalEvenIfReviewLaterCompletes() (gas: 2444007)\n[PASS] testFuzzOwnerCannotDiscardReceiptWithMatchingContext(bool) (runs: 256, μ: 2375614, ~: 2375614)\n[PASS] testFuzzReleaseUnusedReservationAfterExpiryOrFailureThenFinalizeRetry(bool,bool) (runs: 256, μ: 5648635, ~: 5653544)\n[PASS] testFuzzSameUuidFieldMismatchCannotDiscardReceipt(uint8) (runs: 256, μ: 2237567, ~: 2237762)\nLogs:\n  Bound result 4\n\n[PASS] testLateNotPassedReceiptCannotBeFrontRunByRequesterExpiry() (gas: 2412823)\n[PASS] testRecoveryRequiresCurrentOwnerExactBodyValidContextAndReceipt() (gas: 2571619)\n[PASS] testReservationReleaseRejectsUnknownUnboundAndPendingHolderEvenPastDeadline() (gas: 4038072)\n[PASS] testSignerRotationPreservesRetainedVerificationButRejectsUndeliveredOldSignature() (gas: 4480967)\n[PASS] testSwappedReceiptOwnerClosesWrongAskWithoutStrandingGenuineUuid() (gas: 6144659)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 648.84ms (966.52ms 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 681.14ms (767.99ms CPU time)\n\nRan 13 tests for test/RequesterMvpAudit.t.sol:RequesterMvpLifecycleTest\n[PASS] testAbandonedAskReceiptBlocksClosureWithoutRequesterExpiryRequest() (gas: 2356137)\n[PASS] testBindingResetRequiresOwnerExactBodyAndPendingBoundAsk() (gas: 2745439)\n[PASS] testFuzzCompromisedEpochBlocksRetainedAnswersAndAllowsHonestClosure(bool,bool) (runs: 256, μ: 4036298, ~: 4164280)\n[PASS] testFuzzJobFailureAndExpiryOrderingCannotChangeReviewEligibility(uint8,bool) (runs: 256, μ: 2488120, ~: 2499057)\nLogs:\n  Bound result 0\n\n[PASS] testFuzzWrongPrebindingRetainsOneShotAnswerAndCanBeCorrected(uint8,bool) (runs: 256, μ: 2889974, ~: 2889581)\nLogs:\n  Bound result 0\n\n[PASS] testIncidentRevocationIsExplicitAndCannotUndoFinalizedVerdicts() (gas: 2491813)\n[PASS] testLateFailureCannotClearFinalizedNegativeReview() (gas: 2409318)\n[PASS] testOwnerClosesAbandonedAskOnlyAfterDeadlineAndCannotCloseItsRetry() (gas: 3679361)\n[PASS] testRevocationFreezesEveryOldReceiptButNotANewEpochReceipt() (gas: 6624254)\n[PASS] testRevocationValidatesAuthorityEpochAndEvidence() (gas: 238952)\n[PASS] testRevokedBoundMismatchClosesWithoutResetAndReservationReleasePreservesHistory() (gas: 2650887)\n[PASS] testSwappedPreboundDeliveriesStayPendingAndNeverConsumeEachOthersUuid() (gas: 4996492)\n[PASS] testUnknownOrMissingReceiptCannotBeIncidentClosed() (gas: 1869944)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.20s (1.85s CPU time)\n\nRan 44 tests for test/GatedHookDeployer.t.sol:GatedHookDeployerTest\n[PASS] testArtifactFieldEditNotInReviewedResult() (gas: 4295825)\n[PASS] testBoundedSwapHookDeploysThroughGateAndInitializesPool() (gas: 8668194)\n[PASS] testCheckViewMatchesDeploy() (gas: 4120509)\n[PASS] testConstructorRejectsZeroRequesterAndOwner() (gas: 6141)\n[PASS] testDisabledManagerRefused() (gas: 4117476)\n[PASS] testEmptyRuntimeRefused() (gas: 4789965)\n[PASS] testEnvironmentDependentRuntimeRefused() (gas: 16301522)\n[PASS] testExpectedHookMismatchRefused() (gas: 4156720)\n[PASS] testForgedResultDocumentRefused() (gas: 4119117)\n[PASS] testForgedSignatureNeverApproves() (gas: 4058572)\n[PASS] testFuzzAnyValidMaskDeploys(uint16) (runs: 256, μ: 8943837, ~: 6931609)\n[PASS] testGeneratedHookDeploysAfterBindThenCallback() (gas: 4489254)\n[PASS] testGeneratedHookDeploysAfterCallbackThenBind() (gas: 4577871)\n[PASS] testInvalidMasksRefused() (gas: 42503)\n[PASS] testJobReplayRefused() (gas: 7333463)\n[PASS] testLyingManagerReadbackRefused() (gas: 7101685)\n[PASS] testLyingPermissionsReadbackRefused() (gas: 11186985)\n[PASS] testManagerCodeHashMismatchRefused() (gas: 4090148)\n[PASS] testMarkerFormat() (gas: 31518)\n[PASS] testMaxJobAgeBounds() (gas: 103238)\n[PASS] testNoReviewRefused() (gas: 2824668)\n[PASS] testNotPassedRefused() (gas: 4110392)\n[PASS] testOccupiedAddressRefused() (gas: 4157201)\n[PASS] testOnlyJobRequesterMayDeploy() (gas: 4109849)\n[PASS] testOnlyOwnerSetsManager() (gas: 40194)\n[PASS] testOtherJobsApprovalCannotBeBorrowed() (gas: 9209152)\n[PASS] testPendingReviewRefused() (gas: 3918290)\n[PASS] testPinnedManagerRefusedWhenLiveCodeDiffers() (gas: 63542)\n[PASS] testProductionChainsAcceptOnlyPinnedManager() (gas: 297480)\n[PASS] testReenteringConstructorCannotReuseApproval() (gas: 7264351)\n[PASS] testRetainedUnboundReceiptIsNotApproval() (gas: 3903572)\n[PASS] testRevertingConstructorLeavesApprovalUnused() (gas: 5778513)\n[PASS] testRevokedSignerEpochBlocksRetainedVerdict() (gas: 4357287)\n[PASS] testStaleApprovalRefused() (gas: 4147686)\n[PASS] testSubstitutedConstructorArgsRefused() (gas: 4088893)\n[PASS] testSubstitutedCreationCodeRefused() (gas: 4086920)\n[PASS] testUnansweredReviewRefused() (gas: 3969848)\n[PASS] testUndeliveredJobRefused() (gas: 1032230)\n[PASS] testUnminedSaltRefused() (gas: 4163890)\n[PASS] testUnsupportedChainRefused() (gas: 41031)\n[PASS] testWrongChainRefused() (gas: 4077861)\n[PASS] testWrongDeployerRefused() (gas: 4158495)\n[PASS] testWrongManagerRefused() (gas: 8465295)\n[PASS] testWrongMaskRefused() (gas: 4158607)\nSuite result: ok. 44 passed; 0 failed; 0 skipped; finished in 1.64s (1.86s CPU time)\n\nRan 1 test for test/FeaturedTransferInvariant.t.sol:FeaturedTransferInvariantTest\n[PASS] invariantEveryTokenIsAccountedForAndEveryCreditHasBacking() (runs: 256, calls: 128000, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| FeaturedTransferHandler | advanceTime            | 11546 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancel                 | 11611 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | cancelAsCurrentOwner   | 11850 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | claim                  | 11725 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | deposit                | 11528 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | purchaseAsCurrentOwner | 11566 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | rotateRecipient        | 11577 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | settle                 | 11707 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | toggleCurrentListing   | 11731 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | transferListing        | 11629 | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| FeaturedTransferHandler | withdraw               | 11530 | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 225820091276669328\n  Bound result 1473\n  Bound result 286186293615491085\n  Bound result 336510\n  Bound result 1132\n  Bound result 1025\n  Bound result 595\n  Bound result 10444\n  Bound result 398246\n  Bound result 62\n  Bound result 11102\n  Bound result 3004\n  Bound result 11906\n  Bound result 546603\n  Bound result 99\n  Bound result 80\n  Bound result 320\n  Bound result 290740339967630715\n  Bound result 66\n  Bound result 1213\n  Bound result 87\n  Bound result 65\n  Bound result 10534\n  Bound result 2703\n  Bound result 2\n  Bound result 64\n  Bound result 224\n  Bound result 97\n  Bound result 4727522576219\n  Bound result 3066\n  Bound result 66\n  Bound result 319874134701655573\n  Bound result 1015\n  Bound result 7183\n  Bound result 8094\n  Bound result 1024\n  Bound result 74450\n  Bound result 1383\n  Bound result 11\n  Bound result 7103788232795\n  Bound result 50\n  Bound result 19874134701671824\n  Bound result 16716306674795573\n  Bound result 3522\n  Bound result 17179883264\n  Bound result 5922\n  Bound result 13\n  Bound result 8208\n  Bound result 3865\n  Bound result 149477023486088105\n  Bound result 11607\n  Bound result 593674\n  Bound result 626814\n  Bound result 1000\n  Bound result 459248\n  Bound result 292539217066958302\n  Bound result 66\n  Bound result 203085171130719371\n  Bound result 5727\n  Bound result 3380\n  Bound result 729026104939\n  Bound result 87\n  Bound result 41454081580505\n  Bound result 278429433457\n  Bound result 53031918731001855\n  Bound result 259\n  Bound result 339193\n  Bound result 123804568531\n  Bound result 240\n  Bound result 1268\n  Bound result 215172110721757\n  Bound result 14\n  Bound result 1025\n  Bound result 428230\n  Bound result 112006384892173525\n  Bound result 8649\n  Bound result 721185\n  Bound result 1152\n  Bound result 30000000\n  Bound result 30548835779381500\n  Bound result 185377520908837\n  Bound result 63141518161494337\n  Bound result 115428911151845857\n  Bound result 3052\n  Bound result 279122381821618\n  Bound result 19702019371312\n  Bound result 480\n  Bound result 777598\n  Bound result 3655\n  Bound result 167934543576446635\n  Bound result 1\n  Bound result 12069\n  Bound result 239\n  Bound result 131072\n  Bound result 62\n  Bound result 263\n  Bound result 6737048805\n  Bound result 284634302914454324\n  Bound result 176\n  Bound result 212006384892173523\n  Bound result 84532\n  Bound result 144\n  Bound result 86400\n  Bound result 448120919896\n  Bound result 2811\n  Bound result 4600\n  Bound result 109332575164987036\n  Bound result 5815\n  Bound result 8163\n  Bound result 7288\n  Bound result 676730\n  Bound result 300\n  Bound result 182606707442921176\n  Bound result 3879\n  Bound result 1617\n  Bound result 41454081581505\n  Bound result 268697\n  Bound result 202233\n  Bound result 1000000\n  Bound result 406542\n  Bound result 14853458084718\n  Bound result 26\n  Bound result 399\n  Bound result 14080\n  Bound result 10534\n  Bound result 210\n  Bound result 7220110163500\n  Bound result 593537\n  Bound result 555710\n  Bound result 223605595304887\n  Bound result 353254\n  Bound result 4404\n  Bound result 1024\n  Bound result 256\n  Bound result 1800604801\n  Bound result 1900\n  Bound result 2261695968662\n  Bound result 11043751548837616\n  Bound result 7200\n  Bound result 961935975956834360\n  Bound result 54960701404759629\n  Bound result 12131\n  Bound result 7309\n  Bound result 2999\n  Bound result 68901768177\n  Bound result 623\n  Bound result 10311\n  Bound result 2797412087337135\n  Bound result 9672\n  Bound result 1804498888\n  Bound result 16711935\n  Bound result 653906675248\n  Bound result 11976\n  Bound result 137056\n  Bound result 20916163031976955\n  Bound result 3085\n  Bound result 10340\n  Bound result 8453\n  Bound result 2497\n  Bound result 121685792579\n  Bound result 64\n  Bound result 213845706268122588\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 27.11s (27.10s 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 8791\n  Bound result 9318\n  Bound result 1624\n  Bound result 5813\n  Bound result 3792478064\n  Bound result 133180\n  Bound result 3964\n  Bound result 256\n  Bound result 7602\n  Bound result 3540\n  Bound result 5806\n  Bound result 99\n  Bound result 513\n  Bound result 718\n  Bound result 2\n  Bound result 15\n  Bound result 61698\n  Bound result 195000\n  Bound result 4965\n  Bound result 8148\n  Bound result 3653\n  Bound result 311022\n  Bound result 103\n  Bound result 401\n  Bound result 101\n  Bound result 212910\n  Bound result 475\n  Bound result 144\n  Bound result 86400\n  Bound result 852\n  Bound result 444890\n  Bound result 55\n  Bound result 270395\n  Bound result 80\n  Bound result 17179869184\n  Bound result 1000000\n  Bound result 1800000000\n  Bound result 277511596451062893\n  Bound result 3961662347139579\n  Bound result 370059965\n  Bound result 55980795426278220\n  Bound result 146744073709551615\n  Bound result 31\n  Bound result 100000\n  Bound result 22595111\n  Bound result 709600\n  Bound result 101\n  Bound result 21410316871880141\n  Bound result 4\n  Bound result 3422\n  Bound result 3518789280\n  Bound result 513\n  Bound result 225\n  Bound result 852\n  Bound result 10643623964021393\n  Bound result 47\n  Bound result 7782\n  Bound result 3806\n  Bound result 255\n  Bound result 65536\n  Bound result 8599\n  Bound result 208394965837152255\n  Bound result 3346\n  Bound result 60\n  Bound result 21410317241940997\n  Bound result 282612368149045871\n  Bound result 47\n  Bound result 7\n  Bound result 24\n  Bound result 2095\n  Bound result 75644250940394395\n  Bound result 322\n  Bound result 1800008682\n  Bound result 5657\n  Bound result 1475\n  Bound result 3938\n  Bound result 83109\n  Bound result 23\n  Bound result 1298026639695369\n  Bound result 18\n  Bound result 5793\n  Bound result 604800\n  Bound result 11902319038821795\n  Bound result 9002\n  Bound result 172800\n  Bound result 1038\n  Bound result 100000\n  Bound result 16383\n  Bound result 60000\n  Bound result 72057594037927935\n  Bound result 3\n  Bound result 2000\n  Bound result 12028\n  Bound result 96450059980546196\n  Bound result 5888\n  Bound result 1268\n  Bound result 7\n  Bound result 581\n  Bound result 223\n  Bound result 6721\n  Bound result 1792943868446393\n  Bound result 225684821632784055\n  Bound result 98578207671957672\n  Bound result 32259290458301756\n  Bound result 20256\n  Bound result 4955\n  Bound result 99\n  Bound result 1000\n  Bound result 127035603870986413\n  Bound result 112\n  Bound result 27582207880968858\n  Bound result 849601384536841\n  Bound result 6952\n  Bound result 153674664000704530\n  Bound result 11\n  Bound result 38474342279544679\n  Bound result 6452\n  Bound result 370059965\n  Bound result 100000000\n  Bound result 54023714\n  Bound result 230304381176537400\n  Bound result 5809\n  Bound result 4380\n  Bound result 174607431768211455\n  Bound result 9029\n  Bound result 9686\n  Bound result 280\n  Bound result 7499\n  Bound result 314\n  Bound result 1\n  Bound result 31337\n  Bound result 4514\n  Bound result 316964\n  Bound result 24145034787331155\n  Bound result 147453831824256331\n  Bound result 16577531123468867\n  Bound result 326438\n  Bound result 9518\n  Bound result 7081\n  Bound result 768\n  Bound result 1056290820\n  Bound result 62064573537398292\n  Bound result 2408\n  Bound result 1099511627775\n  Bound result 47\n  Bound result 4294967295\n  Bound result 1073741824\n  Bound result 195000\n  Bound result 241395520672167722\n  Bound result 561440\n  Bound result 46606973052839744\n  Bound result 293782792835301375\n  Bound result 3804\n  Bound result 1419\n  Bound result 95\n  Bound result 25431\n  Bound result 543452\n  Bound result 255444464034512895\n  Bound result 2732\n  Bound result 6868\n  Bound result 1278139994\n  Bound result 20000\n  Bound result 187475446922340563\n  Bound result 24935192954446852\n  Bound result 115400173206290188\n  Bound result 187475446922340564\n  Bound result 259419810760631496\n  Bound result 851\n  Bound result 5983\n  Bound result 1142570609\n  Bound result 5036\n  Bound result 8123\n  Bound result 1743\n  Bound result 104\n  Bound result 4294967296\n  Bound result 168\n  Bound result 658312702457678533\n  Bound result 5943468806243113\n  Bound result 4000\n  Bound result 2408\n  Bound result 184\n  Bound result 339075928\n  Bound result 334477\n  Bound result 645788\n  Bound result 4522462726960947\n  Bound result 125169935154903511\n  Bound result 2\n  Bound result 1056\n  Bound result 519224\n  Bound result 9175368048922754\n  Bound result 299\n  Bound result 321\n  Bound result 66817763702320680\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 29.35s (29.35s CPU time)\n\nRan 29 test suites in 29.35s (64.46s CPU time): 297 tests passed, 0 failed, 0 skipped (297 total tests)\n","passed":true},{"durationMs":128,"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)\",\"GatedHookDeployer.acceptOwnership()\",\"GatedHookDeployer.cancelOwnershipTransfer()\",\"GatedHookDeployer.deploy((bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,uint256,address,address,bytes32,uint160),bytes,bytes,bytes,bytes32,address)\",\"GatedHookDeployer.setManager(address,bytes32,bool)\",\"GatedHookDeployer.setMaxJobAge(uint64)\",\"GatedHookDeployer.transferOwnership(address)\",\"HookJobRequester.acceptOwnership()\",\"HookJobRequester.bindReview(bytes32,bytes32,bytes32,bytes32,uint256,uint64,uint64)\",\"HookJobRequester.cancelOwnershipTransfer()\",\"HookJobRequester.closeRevokedReviewReceipt(bytes32)\",\"HookJobRequester.confirmReviewExpiry(bytes32)\",\"HookJobRequester.discardMismatchedReviewReceipt(bytes32,bytes32,bytes32,bytes32,uint256,uint64,uint64)\",\"HookJobRequester.discardReviewReceipt(bytes32,bytes32,bytes32,bytes32,uint256,uint64,uint64)\",\"HookJobRequester.expireJob(bytes32)\",\"HookJobRequester.expireReview(bytes32)\",\"HookJobRequester.onJobFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"HookJobRequester.onJobResult(bytes32,bytes32,string)\",\"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,uint256)\",\"HookJobRequester.releaseReservation(bytes32)\",\"HookJobRequester.requestReview(bytes32,uint256)\",\"HookJobRequester.resetReviewBinding(bytes32,bytes32)\",\"HookJobRequester.revokeSignerEpoch(uint32,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\":166,\"dependencies.lock.json\":20,\"deployment/audited-build.json\":157,\"deployment/ethereum.draft.json\":13,\"deployment/manifest.json\":213,\"deployment/robinhood.draft.json\":13,\"deployment/sepolia.draft.json\":13,\"docs/AUDIT_1053AF02.md\":106,\"docs/AUDIT_5F43F94D.md\":94,\"docs/AUDIT_648BA2E5.md\":61,\"docs/AUDIT_6B607200.md\":76,\"docs/AUDIT_D9970905.md\":79,\"docs/AUDIT_EF1F6915.md\":127,\"docs/CHAINS.md\":35,\"docs/DEPENDENCIES.md\":22,\"docs/DEPLOYMENT.md\":88,\"docs/DEPLOYMENT_PREPARATION.md\":323,\"docs/GATED_DEPLOYMENT.md\":150,\"docs/HOOK_SPEC.md\":63,\"docs/IMD_INTEGRATION.md\":442,\"docs/LISTINGS_AND_ADS.md\":214,\"docs/STORE_API.md\":101,\"docs/THREAT_MODEL.md\":72,\"docs/VERIFICATION.md\":453,\"docs/build-fingerprints.json\":28,\"docs/checks/deployment-preparation/README.md\":105,\"docs/checks/deployment-preparation/assignment-seed.log\":394,\"docs/checks/deployment-preparation/baseline-build.log\":2256,\"docs/checks/deployment-preparation/build.log\":2257,\"docs/checks/deployment-preparation/bytecode-unchanged.json\":56,\"docs/checks/deployment-preparation/capabilities.json\":376,\"docs/checks/deployment-preparation/cold-gas.log\":56,\"docs/checks/deployment-preparation/deployment-tests.log\":15,\"docs/checks/deployment-preparation/ethereum-preflight.json\":17,\"docs/checks/deployment-preparation/fmt.log\":3,\"docs/checks/deployment-preparation/forge-test.log\":392,\"docs/checks/deployment-preparation/launcher-recipe.json\":10,\"docs/checks/deployment-preparation/live-rpc.json\":551,\"docs/checks/deployment-preparation/local-dry-run.json\":665,\"docs/checks/deployment-preparation/local-dry-run.log\":39,\"docs/checks/deployment-preparation/local-requester-activation.json\":538,\"docs/checks/deployment-preparation/local-script-dry-runs.log\":90,\"docs/checks/deployment-preparation/official-observations.json\":77,\"docs/checks/deployment-preparation/official-recheck.log\":53,\"docs/checks/deployment-preparation/preflight-commands.json\":47,\"docs/checks/deployment-preparation/python-tests.log\":39,\"docs/checks/deployment-preparation/robinhood-preflight.json\":17,\"docs/checks/deployment-preparation/sdk.log\":21,\"docs/checks/deployment-preparation/sepolia-preflight.json\":17,\"docs/checks/deployment-preparation/site-abi.log\":31,\"docs/checks/gated-deployment/managers.json\":16,\"docs/checks/job-protocol-tuple/README.md\":112,\"docs/checks/job-protocol-tuple/assignment-seed-gas.log\":1494,\"docs/checks/job-protocol-tuple/build.log\":2256,\"docs/checks/job-protocol-tuple/cold-gas.log\":46,\"docs/checks/job-protocol-tuple/fmt.log\":0,\"docs/checks/job-protocol-tuple/foundry.log\":386,\"docs/checks/job-protocol-tuple/green.log\":60,\"docs/checks/job-protocol-tuple/implementation.patch\":998,\"docs/checks/job-protocol-tuple/red.log\":113,\"docs/checks/job-protocol-tuple/sdk.log\":15,\"docs/checks/job-protocol-tuple/site-abi.log\":26,\"docs/checks/job-protocol-tuple/tuple-tests.log\":30,\"docs/checks/job-protocol-tuple/vendored-retry.log\":1,\"docs/checks/job-protocol-tuple/vendored.log\":1,\"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/check_request_body.py\":37,\"script/dry_run_deployment.py\":100,\"script/prepare_deployment.py\":67,\"script/recheck_gated_managers.sh\":21,\"script/recheck_official.py\":150,\"script/verify-vendored.sh\":15,\"sdk/deployment.py\":450,\"sdk/gated_deploy.py\":140,\"sdk/hooks_store.py\":350,\"site/GatedHookDeployer.abi.json\":1393,\"site/HookJobRequester.abi.json\":2834,\"site/display-text.js\":7,\"site/index.html\":224,\"site/listings.html\":57,\"site/listings.js\":213,\"src/BoundedSwapHook.sol\":97,\"src/DisabledCallbacks.sol\":63,\"src/HookSpec.sol\":61,\"src/HooksStoreFactory.sol\":114,\"src/deployment/DeploymentPolicy.sol\":21,\"src/deployment/GatedHookDeployer.sol\":352,\"src/deployment/HookDeployment.sol\":44,\"src/deployment/HookMiner.sol\":63,\"src/imd/HookJobRequester.sol\":1074,\"src/imd/IIntake.sol\":27,\"src/imd/OracleAttestation.sol\":230,\"src/interfaces/IHooksStore.sol\":36,\"src/store/ExactStoreToken.sol\":48,\"src/store/FeaturedPlacements.sol\":270,\"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/AuditContextMismatchProof.t.sol\":444,\"test/AuditExpiryProof.t.sol\":168,\"test/AuditFixes.t.sol\":192,\"test/AuditReceiptConflictProof.t.sol\":197,\"test/DeployHookJobRequester.t.sol\":104,\"test/Deployment.t.sol\":329,\"test/FeaturedAdversarial.t.sol\":151,\"test/FeaturedInvariant.t.sol\":186,\"test/FeaturedPlacements.t.sol\":443,\"test/FeaturedTransfer.t.sol\":120,\"test/FeaturedTransferInvariant.t.sol\":80,\"test/GatedHookDeployer.t.sol\":603,\"test/HookIntegration.t.sol\":294,\"test/HookJobRequester.t.sol\":775,\"test/HookListingRegistry.t.sol\":265,\"test/JobProtocolTuple.t.sol\":220,\"test/OracleConformance.t.sol\":135,\"test/OracleSigner.t.sol\":125,\"test/RequesterMvpAudit.t.sol\":508,\"test/ReviewAuditRegression.t.sol\":295,\"test/ReviewBinding.t.sol\":359,\"test/ReviewDelivery.t.sol\":500,\"test/ReviewReceiptGas.t.sol\":284,\"test/ReviewReceiptPacking.t.sol\":99,\"test/ReviewRecovery.t.sol\":341,\"test/UriPilotGas.t.sol\":34,\"test/__init__.py\":1,\"test/helpers/Fixture.sol\":46,\"test/helpers/GeneratedHooks.sol\":85,\"test/helpers/ImdTemplates.sol\":19,\"test/helpers/MockIntake.sol\":127,\"test/helpers/MockVerdictRequester.sol\":29,\"test/helpers/PoolRouter.sol\":76,\"test/helpers/ReceiptSigners.sol\":75,\"test/helpers/StoreFixture.sol\":81,\"test/helpers/StoreTokenMock.sol\":82,\"test/helpers/TestToken.sol\":13,\"test/helpers/__init__.py\":1,\"test/helpers/local_rpc.py\":84,\"test/listings-reader.test.cjs\":108,\"test/requester-abi.test.cjs\":227,\"test/test_deployment_preparation.py\":210,\"test/test_gated_deploy.py\":106,\"test/test_receipts.py\":62,\"test/test_request_body_check.py\":31,\"test/test_store_sdk.py\":215},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":5595,"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:219: FeaturedPlacements.getPlacement(uint256) (src/store/FeaturedPlacements.sol#219-222) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/imd/HookJobRequester.sol:377: Reentrancy in HookJobRequester.requestReview(bytes32,uint256) (src/imd/HookJobRequester.sol#377-405):\n[medium/medium] uninitialized-local at src/imd/HookJobRequester.sol:1017: HookJobRequester._validateBrief(bytes).cp (src/imd/HookJobRequester.sol#1017) is a local variable never initialized\n[medium/medium] uninitialized-local at src/imd/HookJobRequester.sol:1016: HookJobRequester._validateBrief(bytes).len (src/imd/HookJobRequester.sol#1016) 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/imd/OracleAttestation.sol:159: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/imd/OracleAttestation.sol#159-174) ignores return value by (recovered,err,None) = ECDSA.tryRecoverCalldata(digest,signature) (src/imd/OracleAttestation.sol#169)\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:302: Reentrancy in HookJobRequester.openJob(bytes32,bytes,uint256) (src/imd/HookJobRequester.sol#302-324):\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:377: Reentrancy in HookJobRequester.requestReview(bytes32,uint256) (src/imd/HookJobRequester.sol#377-405):\n[low/medium] return-bomb at src/deployment/GatedHookDeployer.sol:314: GatedHookDeployer.verifyDeployment(address,GatedHookDeployer.Artifact) (src/deployment/GatedHookDeployer.sol#314-326) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] timestamp at src/imd/HookJobRequester.sol:801: HookJobRequester.confirmReviewExpiry(bytes32) (src/imd/HookJobRequester.sol#801-813) uses timestamp for comparisons\n[low/medium] timestamp at src/deployment/GatedHookDeployer.sol:252: GatedHookDeployer._checkApproval(GatedHookDeployer.Artifact,bytes,address) (src/deployment/GatedHookDeployer.sol#252-277) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:197: FeaturedPlacements.settle(uint256) (src/store/FeaturedPlacements.sol#197-206) 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/imd/OracleAttestation.sol:159: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/imd/OracleAttestation.sol#159-174) uses timestamp for comparisons\n[low/medium] timestamp at src/imd/HookJobRequester.sol:359: HookJobRequester.expireJob(bytes32) (src/imd/HookJobRequester.sol#359-367) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:224: FeaturedPlacements.isActive(uint256) (src/store/FeaturedPlacements.sol#224-227) uses timestamp for comparisons\n[low/medium] timestamp at src/imd/HookJobRequester.sol:781: HookJobRequester.expireReview(bytes32) (src/imd/HookJobRequester.sol#781-794) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:177: FeaturedPlacements.cancel(uint256) (src/store/FeaturedPlacements.sol#177-194) uses timestamp for comparisons\n[low/medium] timestamp at src/store/FeaturedPlacements.sol:219: FeaturedPlacements.getPlacement(uint256) (src/store/FeaturedPlacements.sol#219-222) uses timestamp for comparisons","passed":true},{"durationMs":1010,"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:312: Reentrancy: State change after external call (4 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/deployment/GatedHookDeployer.sol:150: Centralization Risk (22 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/GatedHookDeployer.sol:61: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/deployment/GatedHookDeployer.sol:319: Literal Instead of Constant (229 places)\n[low] local-variable-shadowing at src/imd/HookJobRequester.sol:68: Local Variable Shadows State Variable (2 places)\n[low] modifier-used-only-once at src/deployment/GatedHookDeployer.sol:128: Modifier Invoked Only Once\n[low] non-reentrant-not-first at src/imd/HookJobRequester.sol:870: `nonReentrant` is Not the First Modifier (4 places)\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-change-without-event at src/imd/HookJobRequester.sol:955: State Change Without Event\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/deployment/GatedHookDeployer.sol:240: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/deployment/GatedHookDeployer.sol:334: Uninitialized Local Variable (8 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)\n[low] unused-state-variable at src/deployment/GatedHookDeployer.sol:61: Unused State Variable","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"616ecba87b2a7f11f2f913fe959cb35f3ad21eda7a17eaf536c1d56ad34d1763","verifiedTreeHash":"4e2b862537c0b7751431a90ef244c80ed32586d2","verifierVersion":"0.1.0+c3fba9eb"}]}