{"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":"6fbb4e49-1279-46f2-aea9-008c3105f0c7","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"94c50dec7ccb1709b374f2f8c5e3dade0e16e0c43fcd554d9598709ff6eac618","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":"https://explorer.imd.fun/jobs/17b4f2ef-e83c-41e4-8765-cdbf11196fd3?hired=build-contract-project","parentJobId":"17b4f2ef-e83c-41e4-8765-cdbf11196fd3","planHash":"46377506dcaabf0a5fa6ffcd7a3133f3bc5d3db2814e054759f6496d33578023","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":"53925","feedbackHash":"3bb0ec73290cdd910b7bddb9306a1ff9550613854d6fb55c4a26d774f73a9bd5","nodeKey":"build_contract_project","submissionHash":"94c50dec7ccb1709b374f2f8c5e3dade0e16e0c43fcd554d9598709ff6eac618","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"8c36b23f7ecb4e5caa95621dc39262fe37ec7299ba773a78dad264c8260a7104","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"1f25b7cb2e886490d09dacbbae259eadc1b0310e477e1c77a927b4a6934d5a1a","device":"96ecbe9236c400bb","findings":[],"hash":"94c50dec7ccb1709b374f2f8c5e3dade0e16e0c43fcd554d9598709ff6eac618","nodeId":"b617baf8-916a-48f6-9912-62978bc28bf7","outcome":"completed","summary":"The only unformatted file was my scratch script under test/scratch, which is deleted before checks anyway; I removed it and the format check now passes.\n\n**Outcome.** The workspace already held an accepted delivery for this job, so I built on it rather than starting over. The request's core pieces were present and verified: a wallet-approved Intake v2 `job.open` with build, test and adversarial-review steps, request-id tracking, Intake-only one-time result and failure handling, a signed oracle review verdict, and a static status page that never touches api.imd.fun. I hardened the requester along the pinned oracle-consumer reference, extended the static page, added a tested deploy script and updated the docs. Nothing was deployed and no paid request was submitted.\n\n**What changed**\n\n- **Price ceiling.** `HookJobRequester` now takes `maxPrice` as a fifth constructor argument and pulls the Intake's current price only up to it, with `setPayment(asset, maxPrice)` replacing `setAsset`. A wallet that gave an unlimited allowance can no longer be drained by an Intake price move. Tested for job and review asks, above and below the ceiling.\n- **Version 1 fallback.** An owner-set `failureHook` (on by default, as the brief names Intake v2) switches between `requestWithFailure` and plain `request`, per the reference. Tested against the mock in version-1 mode, including the deadline path for a refused job.\n- **Id collision.** A job ask now refuses an Intake request id already held by a pending review ask, matching the existing check in the other direction.\n- **Static page.** It lists a creator wallet's jobs with each one's status, and shows a job's on-chain history through one `eth_getLogs` filter on the seven event topics and the request id. The selectors and topic hashes it hard-codes are pinned by a test. I also replayed its exact JSON-RPC calls from outside the EVM against a disposable local Anvil after walking one job to Delivered with a refused review ask, and the decode and event order came back as the page expects.\n- **Deploy script.** `script/DeployHookJobRequester.s.sol` has `check`, `deploy` and `configure` units driven directly by a new test, plus `run` and `runConfigure` broadcast wrappers. The owner is an explicit argument and the constructor still calls no contract.\n- **Docs.** IMD_INTEGRATION.md, DEPLOYMENT.md, THREAT_MODEL.md, VERIFICATION.md, README.md and build-fingerprints.json reflect the new argument, setters, script, page features and pilot items.\n\n**Checks**\n\n| Check | Result |\n|---|---|\n| `forge build` | Pass |\n| `forge test`, pinned seed and the verifier's seed | 86 tests pass (80 kept, 6 new) |\n| `forge fmt --check` | Pass |\n| `sh script/verify-vendored.sh` | Pass |\n| Python SDK tests | 10 pass against local Anvil (the previous job could not run them) |\n\n**Still open, as documented.** The blocker stands: without the signed oracle step a static site cannot tell whether review passed, and the page never shows \"audited\". The live `job.open` callback ABI, action id, body schema and oracle wording still need an Ethereum or Robinhood Chain pilot, and the published Intake, IMD and signer addresses were not checked with `cast code` here. An independent adversarial review is still needed before the contract holds anyone's IMD.","treeHash":"bf2f12426c6c67f873e149623f038381329640f1","usage":{"cachedInputTokens":3722933,"inputTokens":1026,"model":"claude-fable-5-1","outputTokens":48831,"runtime":"claude","turns":70,"wallClockMs":718524}}],"verification":[{"checks":[{"durationMs":4078,"exitCode":0,"name":"build","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.97s\nCompiler run successful!\n","passed":true},{"durationMs":507,"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 1.86ms (928.38µs 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 5.69ms (2.94ms 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, μ: 495590, ~: 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 31.67ms (49.22ms 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, ~: 210028)\n[PASS] testFuzzRealSwapsSettleAndConserve(uint128,bool,bool,bool) (runs: 256, μ: 281022, ~: 278533)\nLogs:\n  Bound result 2823\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 32.93ms (59.93ms 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 401.56ms (533.66ms 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 401.57ms (563.76ms CPU time)\n\nRan 6 test suites in 402.46ms (875.29ms CPU time): 86 tests passed, 0 failed, 0 skipped (86 total tests)\n","passed":true},{"durationMs":66,"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)\",\"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)\",\"HooksStoreFactory.deploy((uint32,bytes32,uint256,address,bytes32,uint160,uint128),bytes32,address,bytes32)\"],\"files\":{\".gitignore\":6,\"LICENSE\":24,\"README.md\":78,\"dependencies.lock.json\":20,\"docs/CHAINS.md\":18,\"docs/DEPENDENCIES.md\":22,\"docs/DEPLOYMENT.md\":63,\"docs/HOOK_SPEC.md\":63,\"docs/IMD_INTEGRATION.md\":75,\"docs/STORE_API.md\":64,\"docs/THREAT_MODEL.md\":52,\"docs/VERIFICATION.md\":71,\"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\":167,\"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/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/HookIntegration.t.sol\":294,\"test/HookJobRequester.t.sol\":734,\"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/TestToken.sol\":13,\"test/test_store_sdk.py\":193},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3130,"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/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/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/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/imd/HookJobRequester.sol:309: HookJobRequester.expireReview(bytes32) (src/imd/HookJobRequester.sol#309-319) 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","passed":true},{"durationMs":629,"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 (2 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 (9 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\n[low] literal-instead-of-constant at src/imd/HookJobRequester.sol:452: Literal Instead of Constant (209 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` (3 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] uninitialized-local-variable at src/imd/HookJobRequester.sol:498: Uninitialized Local Variable\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":"94c50dec7ccb1709b374f2f8c5e3dade0e16e0c43fcd554d9598709ff6eac618","verifiedTreeHash":"bf2f12426c6c67f873e149623f038381329640f1","verifierVersion":"0.1.0+63e0a393"}]}