{"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":"bfc288d4-3e34-4b8b-8ee7-92a0d1a12933","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4db191b0fab504d91a8690a495a214c62821572e06309a2404dbadbf336fe2e9","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"4e4cc97b44c1558573cffd4fb4a3614bdf63c7e74058e4a823509536f554124f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"}],"objective":"Build HourlyFeeHook, a simple, creative Uniswap v4 hook: a dynamic-fee hook that charges a different LP fee by UTC hour: a 24-entry fee schedule fixed at construction (in hundredths of a bip, each at most 1%), applied in beforeSwap from block.timestamp. Tests cover the hour boundaries and the schedule bounds. Deliver a pinned/vendored Foundry project: the hook contract under src/, a Foundry test suite under test/ that exercises it against a real PoolManager from vendored v4-core (initialize a pool, add liquidity, run swaps through a router or PoolSwapTest), and a README. Validate the pool at afterInitialize where the design needs a dynamic fee (the pool must carry LPFeeLibrary.DYNAMIC_FEE_FLAG) and revert otherwise. Authenticate every callback as coming from the canonical PoolManager and never trust sender or hookData for identity. Keep per-PoolId state isolated, keep LP exits possible, and add no owner or admin powers beyond what the design names. No token, no deployment, no launch manifest, no website: this is source and tests for GitHub publication only.","parentJobId":null,"planHash":"0ce82408457c04cc1dc4df2a2eb3e8acf776ca17f18c6eca7c0e45fed588a5c6","previousHash":"6e0740ee8e91ea7883e0f9e795dd2e553286c1459388f01e2a08258c22047203","projectId":"bfc288d4-3e34-4b8b-8ee7-92a0d1a12933","publication":{"commit":"b2e91901af76d366e4eb57a2dfcd3ad357b98a05","deliveredAt":"2026-09-21T04:12:14.579Z","repoUrl":"https://github.com/Identity-md/launch-63-build-hourlyfeehook-simple-creative"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"025440692f653fe89046cc0920347d59b2e542e10148d90fb5f4fd6179e572e8","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"693a98443cff7807","findings":[{"description":"The documented v4-core snapshot does not contain src/types/PoolOperation.sol, which the supplied Hook.protected.t.sol imports for ModifyLiquidityParams and SwapParams. This snapshot instead declares those structs inside IPoolManager, and the implementation and local tests use that older API. Consequently the required protected hook suite cannot compile against the delivered dependencies, even though the local constructor-bound test passes. This is a verification compatibility blocker, not a demonstrated runtime vulnerability.","line":31,"path":"README.md","reproduction":"From the repository root run: forge build --offline .imd/reads/protected/univ4_hook/Hook.protected.t.sol -R '.imd/src/HookFlags.sol=src/HookFlags.sol' -R '.imd/reads/mocks/MockERC20.sol=test/mocks/MockERC20.sol' --out /tmp/hourly-review-protected-out --cache-path /tmp/hourly-review-protected-cache . The two command-line remappings resolve the protected input's relative imports without changing repository files. Expected: the supplied protected check compiles against the vendored project. Actual: exit code 1 with Solidity ParserError 6275 at Hook.protected.t.sol:11: Source lib/v4-core/src/types/PoolOperation.sol not found. The required checks cannot execute.","severity":"medium","title":"Vendored v4-core is incompatible with the required protected hook suite"}],"hash":"4db191b0fab504d91a8690a495a214c62821572e06309a2404dbadbf336fe2e9","nodeId":"62ee1dcd-16d8-4a5a-94ba-372be4779a5c","outcome":"completed","summary":"Wrote `.imd-findings.json` with one **medium** finding: the vendored v4-core lacks `PoolOperation.sol`, preventing the required protected hook suite from compiling.\n\nNo substantiated runtime vulnerability found. Source files unchanged.","treeHash":null,"usage":{"cachedInputTokens":294016,"inputTokens":30809,"model":null,"outputTokens":2036,"runtime":"codex","turns":4,"wallClockMs":83464}},{"artifacts":[],"attempt":1,"bundleHash":"436fa806252ecc51b500a3bc3a46c111181795492325270051e6f644e4dfc7d1","device":"0256823ae36e7900","findings":[],"hash":"4e4cc97b44c1558573cffd4fb4a3614bdf63c7e74058e4a823509536f554124f","nodeId":"4ca64440-34d5-4219-b8de-9bef373282e8","outcome":"completed","summary":"Implemented a complete, vendored Foundry project for `HourlyFeeHook`.\n\nKey features:\n\n- Fixed 24-entry UTC hourly fee schedule, capped at 1%.\n- Dynamic-fee pool validation during `afterInitialize`.\n- Canonical `PoolManager` callback authentication.\n- Per-`PoolId` initialization isolation.\n- No owner, admin, upgrade, custody, or liquidity-exit restrictions.\n- Vendored pinned `v4-core`, `forge-std`, and Solmate sources with licenses.\n- Real `PoolManager` integration tests covering liquidity, swaps, hour boundaries, invalid schedules, static pools, authentication, and LP exit.\n- Deployment assumptions and operational responsibilities documented in [README.md](/home/imd-worker/.identitymd/work/bfc288d4-3e34-4b8b-8ee7-92a0d1a12933/4ca64440-34d5-4219-b8de-9bef373282e8/README.md).\n\nValidation passed:\n\n- `forge build --offline`\n- `forge test --offline`: 8 passed, 0 failed\n- `forge fmt --check`","treeHash":"43638dc1b63bac458dd255b215702f51b1af593f","usage":{"cachedInputTokens":1130496,"inputTokens":44638,"model":null,"outputTokens":12707,"runtime":"codex","turns":6,"wallClockMs":349342}}],"verification":[{"checks":[{"durationMs":1875,"exitCode":0,"name":"build","output":"Compiling 73 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.77s\nCompiler run successful!\n","passed":true},{"durationMs":182,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/HourlyFeeHook.t.sol:HourlyFeeHookTest\n[PASS] testBeforeSwapReturnsScheduledFeeAndOverrideFlag() (gas: 24390)\n[PASS] testCallbacksRejectNonManagerEvenWithPlausibleIdentityData() (gas: 18368)\n[PASS] testOnePoolCannotInitializeAnotherPoolId() (gas: 25242)\n[PASS] testPoolsAreRegisteredByPoolId() (gas: 17121)\n[PASS] testRealManagerSwapsAcrossBoundaryAndAllowsLiquidityExit() (gas: 328982)\n[PASS] testRejectsScheduleEntryAboveOnePercent() (gas: 9369836)\n[PASS] testRejectsStaticFeePoolDuringInitialization() (gas: 49367)\n[PASS] testScheduleUsesExactUtcHourBoundaries() (gas: 19086)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 71.69ms (31.14ms CPU time)\n\nRan 1 test suite in 72.46ms (71.69ms CPU time): 8 tests passed, 0 failed, 0 skipped (8 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4e4cc97b44c1558573cffd4fb4a3614bdf63c7e74058e4a823509536f554124f","verifiedTreeHash":"43638dc1b63bac458dd255b215702f51b1af593f","verifierVersion":"0.1.0+eab70f1b"}]}