{"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":"f9ec1c5f-1880-4c47-87ec-43553aa1ec8d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"4eb75ab028ef01dce78ecab3321cd36fa306a9e88f3e7d337546458d6d6e40a9","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":"69b792478a955a681c38c4e544f92858a8b62bf529d66902576482db8c4955fd","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 DirectionalFeeHook, a simple, creative Uniswap v4 hook: a dynamic-fee hook with two fees per pool, one per swap direction, fixed at construction: swaps zeroForOne pay one fee and oneForZero the other, so a pool can tax one side more. Tests cover both directions and exact-input versus exact-output. 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":"93b3a8d9bf1f69387e327ff787a3c1417bf3b1365692ff06d55f194065048094","previousHash":"42bb642744951fbc311082274ad385fba11320586fde410fe055631c03c95cbe","projectId":"f9ec1c5f-1880-4c47-87ec-43553aa1ec8d","publication":{"commit":"4e5e52dbe40653ac4e9809bb1dab1df12e3c484d","deliveredAt":"2026-09-21T04:14:41.844Z","repoUrl":"https://github.com/Identity-md/launch-67-build-directionalfeehook-simple-creative"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"ff2c4ec25fb2d3dab23e64158966c3f8335bd14948218c2a5ddb9dec235e1a75","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[{"description":"The pinned v4-core snapshot lacks src/types/PoolOperation.sol, which the supplied Hook.protected.t.sol imports for SwapParams and ModifyLiquidityParams. This snapshot instead declares both structs inside IPoolManager, and its IHooks callbacks require those nested types. Consequently, the required protected suite cannot compile against the delivered dependencies, even though the project's own tests use the older API consistently. Adding standalone structs alone would also leave Solidity type mismatches at the protected suite's abi.encodeCall sites. This is a verification compatibility defect, not a demonstrated runtime exploit.","line":32,"path":"README.md","reproduction":"Include the supplied Hook.protected.t.sol in the Foundry test inputs at its intended test/protected/univ4_hook/ location, where its relative project imports resolve, and compile with the delivered remappings. Its import of v4-core/src/types/PoolOperation.sol resolves to lib/v4-core/src/types/PoolOperation.sol, which does not exist. Expected: the required protected hook checks compile and execute. Actual: source resolution fails before any check executes. The missing file and the conflicting nested parameter declarations in IPoolManager and IHooks were verified directly from the delivered files.","severity":"medium","title":"Vendored v4-core API is incompatible with the required protected hook suite"}],"hash":"4eb75ab028ef01dce78ecab3321cd36fa306a9e88f3e7d337546458d6d6e40a9","nodeId":"ce3ba9d3-954c-4328-b531-42f576248f21","outcome":"completed","summary":"Wrote `.imd-findings.json` with one medium-severity finding: the vendored v4-core API is incompatible with the supplied protected hook suite.\n\nVerified from source; no runtime exploit identified. No source files changed.","treeHash":null,"usage":{"cachedInputTokens":289280,"inputTokens":33013,"model":null,"outputTokens":2051,"runtime":"codex","turns":3,"wallClockMs":96364}},{"artifacts":[],"attempt":1,"bundleHash":"077ae95e324cc11bd6ff737884a321c818c35895f7581f024ac0083b1d7c2763","device":"3f6a9bdd601cb99f","findings":[],"hash":"69b792478a955a681c38c4e544f92858a8b62bf529d66902576482db8c4955fd","nodeId":"5a560fe7-af89-460c-9a50-983321f83e97","outcome":"completed","summary":"Repaired the bundle-size failure by removing nonessential vendored bulk: v4-core PDFs/docs, generated JS scripts, snapshots, forge-std self-tests/scripts, Solmate audits/tests, plus regenerated `out/` and `cache/`.\n\nI also replaced the test’s dependency on Solmate’s deleted mock with the local [MockERC20.sol](/home/imd2/.identitymd/work/f9ec1c5f-1880-4c47-87ec-43553aa1ec8d/5a560fe7-af89-460c-9a50-983321f83e97/test/mocks/MockERC20.sol), backed by Solmate’s core `ERC20`.\n\nChecks run successfully:\n- `forge build`\n- `forge test` - 8 passed\n- `forge fmt --check`\n\nFinal working tree size excluding `.git` and protected reads is about `1.9 MB`, under the `8 MiB` bundle limit.","treeHash":"5ae83df6d789f12f63ae2c72ad94d75b32fcf3b4","usage":{"cachedInputTokens":1840512,"inputTokens":119184,"model":null,"outputTokens":19866,"runtime":"codex","turns":38,"wallClockMs":477312}}],"verification":[{"checks":[{"durationMs":11617,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.49s\nCompiler run successful!\n","passed":true},{"durationMs":134,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 8 tests for test/DirectionalFeeHook.t.sol:DirectionalFeeHookTest\n[PASS] test_callbacksRejectDirectCallers() (gas: 17467)\n[PASS] test_liquidityProviderCanExit() (gas: 112110)\n[PASS] test_oneForZeroExactInputUsesOneForZeroFee() (gas: 140602)\n[PASS] test_oneForZeroExactOutputUsesOneForZeroFee() (gas: 141245)\n[PASS] test_permissionsMatchAddressFlags() (gas: 12300)\n[PASS] test_revertsWhenPoolIsNotDynamicFee() (gas: 48041)\n[PASS] test_zeroForOneExactInputUsesZeroForOneFee() (gas: 146424)\n[PASS] test_zeroForOneExactOutputUsesZeroForOneFee() (gas: 146152)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 25.88ms (2.84ms CPU time)\n\nRan 1 test suite in 26.79ms (25.88ms 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":"69b792478a955a681c38c4e544f92858a8b62bf529d66902576482db8c4955fd","verifiedTreeHash":"5ae83df6d789f12f63ae2c72ad94d75b32fcf3b4","verifierVersion":"0.1.0+eab70f1b"}]}