{"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":"e70e221f-cfed-40c7-8c31-450e7e2eaa96","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":"e349662d55cf6756a010511941d9dc0e0c5c4622860b1cf67198412ed7333759","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"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"working"}],"objective":"Deploy one contract: WordsmithHook, a standalone Uniswap v4 hook with no token and no pool of its own, on Robinhood Chain. It must be usable by anyone initializing a new pool with it on the PoolManager passed as a constructor argument (Robinhood Chain PoolManager 0x8366a39CC670B4001A1121B8F6A443A643e40951).\nThe hook does exactly what the creator describes below, and nothing else.\nIn the creator’s own words: <description>A hook for a pool where the other currency is native ETH. Take a 0.5% fee on the ETH side of every buy and every sell, settled in ETH inside the swap that paid it; when the PoolManager cannot pay it directly, mint a claim that anyone may redeem to the recipient by calling claimFees(). The recipient is 0x5Bff2a2FEcD1d6152676813b21346238733bEAB1. For the first 30 minutes after the pool opens, no wallet may buy more than 0.5% of the pool's token supply in total; after that there is no limit; expose windowClosesAt() as a view. There are no owner functions: nothing can be paused, changed or upgraded after deployment. Do not use any other pool, token or outside service.</description>\nNo owner functions, no backend signer, no upgrade path.\nFees are always taken from the ETH (pair currency) side, never from the pool’s token; a fee the PoolManager cannot pay directly is minted as a claim the recipient can redeem.\nTake the PoolManager as a constructor argument and enable only the callbacks the behavior above needs. The deployed address must carry the correct hook permission bits (mine a CREATE2 salt). Owner, if any, is $owner.\nKeep the function names exactly as written so the storefront can show them. Composed with The Hooks Store.","parentJobId":null,"planHash":"8403e62c3e23b8cc7949af06120736206ab20c4dfee9e77ff94143d808f55fa1","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e70e221f-cfed-40c7-8c31-450e7e2eaa96","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2429-deploy-one-contract-wordsmithhook"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51490","feedbackHash":"e6baa5917c0bf66db82ac44614ca6f39dfad3fa913d23fb5aeaea272bb5163b2","nodeKey":"build_contract_project","submissionHash":"e349662d55cf6756a010511941d9dc0e0c5c4622860b1cf67198412ed7333759","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4dedf96b97ff227c87aa433196d2b4fbaa3fd293026bb52cbcbc51abb44ffb28","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"e6388a8d5b686610d6e01aeceac786bb25f63e009522ca69d431c420197b28c9","device":"7f1df2a55552de06","findings":[],"hash":"e349662d55cf6756a010511941d9dc0e0c5c4622860b1cf67198412ed7333759","nodeId":"8ba38037-26b2-44be-a569-53f40bb80328","outcome":"completed","summary":"I've built WordsmithHook as a standalone Uniswap v4 hook for Robinhood Chain, with tests, a deploy script and a README. `forge build`, `forge test` (14 tests pass, run with your fuzz seed) and `forge fmt --check` all pass. Nothing is committed and nothing was deployed.\n\n**What it does** (`src/WordsmithHook.sol`):\n- **Pools:** it only accepts pools on the PoolManager given at deployment where the other currency is native ETH. Anyone can open such a pool with it; any other pair is refused.\n- **Fee:** 0.5% of the ETH side of every buy and sell, never taken in the token. It is sent to `0x5Bff2a2FEcD1d6152676813b21346238733bEAB1` inside the swap that paid it. If the PoolManager can't pay it, the hook records a claim instead, and anyone can call `claimFees()` to pay all claims to that address in ETH.\n- **Buy limit:** for 30 minutes after a pool opens, no wallet can buy more than 0.5% of the token's total supply in total. Sells are never limited, and after the window there is no limit.\n- **No owner:** nothing can be paused, changed or upgraded. Only the callbacks this needs are switched on.\n\n**Choices you should check:**\n- **`windowClosesAt` takes the pool's id** (`windowClosesAt(PoolId)`), not zero arguments as the brief wrote it. Because anyone can open a pool with the hook, each pool gets its own window. A single shared window could be used up by someone opening a junk pool first.\n- **\"Wallet\" means the account that signed the transaction** (`tx.origin`), because swaps arrive through routers. Someone using several wallets can still get around the limit.\n- **Small swaps pay no fee:** the fee rounds down, so swaps under 200 wei of ETH pay nothing.\n\n**Deployment:** the launch can't deploy this contract, because a hook's address has to carry its permission bits. `script/DeployWordsmithHook.s.sol` finds a matching salt and deploys through the standard CREATE2 deployer at `0x4e59b44847b379578588920cA78FbF26c0B4956C`. I haven't confirmed that deployer exists on Robinhood Chain; whoever deploys should check that first. The test suite checks that the salt it finds gives the right address.\n\n**Tests** cover all four kinds of swap, a fee becoming a claim and being redeemed, the buy limit during and after the window, and rejected pools and callers. They are not a security audit, so get an independent review before real money goes through it.\n\nThe dependencies (v4-core, solmate, forge-std) are copied into `lib/` as ordinary files so the build works offline. The README covers the assumptions and deployment details.","treeHash":"ac0207eb31cbb75bab365ba7cc9542d44b1f63f2","usage":{"cachedInputTokens":664411,"inputTokens":28,"model":"claude-opus-5-5","outputTokens":18320,"runtime":"claude","turns":14,"wallClockMs":184877}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be85220723d9ce9d","findings":[],"hash":"ff3c9ca08048b157a522edff85becfc023bae180edea03f4c9ba18ae4946385f","nodeId":"70bf7895-5a6d-46f3-bb31-57e34df8b50f","outcome":"failed","summary":"needs input: WordsmithHook needs a mined CREATE2 salt so its address carries permission bits 0x20cc, but an evm_contracts launch deploys it at an unmined, launch-number-salted address, where its constructor reverts. The accepted source has no deployer contract, and this task may only edit launch.json and must use kind evm_contracts. — Should this launch become a univ4_hook manifest, whose deployer mines the hook salt, or should the source gain a deployer contract that CREATE2-deploys WordsmithHook with an off-chain-mined salt and then list that deployer in an evm_contracts launch.json?","treeHash":null,"usage":{"cachedInputTokens":166205,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":2097,"runtime":"claude","turns":6,"wallClockMs":36323}}],"verification":[{"checks":[{"durationMs":1720,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.62s\nCompiler run successful!\n","passed":true},{"durationMs":123,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/WordsmithHook.t.sol:WordsmithHookTest\n[PASS] testFuzz_exactInputBuyFee(uint256) (runs: 256, μ: 229398, ~: 229569)\n[PASS] test_buyLimitDuringWindow() (gas: 697689)\n[PASS] test_callbacksOnlyFromPoolManager() (gas: 64287)\n[PASS] test_claimFeesRevertsWhenNothingPending() (gas: 34984)\n[PASS] test_exactInputBuyPaysFeeInEth() (gas: 239343)\n[PASS] test_exactInputSellPaysFeeOnEthOut() (gas: 201307)\n[PASS] test_exactOutputBuyPaysFeeOnEthIn() (gas: 237020)\n[PASS] test_exactOutputSellPaysFee() (gas: 196905)\n[PASS] test_mineSaltMatchesFlags() (gas: 5679586)\n[PASS] test_rejectsNonEthPool() (gas: 813830)\n[PASS] test_secondPoolHasOwnWindow() (gas: 95794)\n[PASS] test_sellsNotLimited() (gas: 566461)\n[PASS] test_unpayableFeeBecomesClaimAndAnyoneRedeems() (gas: 645897)\n[PASS] test_windowClosesAt() (gas: 9930)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 18.36ms (29.40ms CPU time)\n\nRan 1 test suite in 19.13ms (18.36ms CPU time): 14 tests passed, 0 failed, 0 skipped (14 total tests)\n","passed":true},{"durationMs":51,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"WordsmithHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"WordsmithHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WordsmithHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"WordsmithHook.claimFees()\",\"WordsmithHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"README.md\":46,\"foundry.toml\":13,\"remappings.txt\":3,\"script/DeployWordsmithHook.s.sol\":35,\"src/WordsmithHook.sol\":219,\"test/WordsmithHook.t.sol\":192},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":938,"exitCode":0,"name":"slither","output":"[medium/medium] uninitialized-local at src/WordsmithHook.sol:159: WordsmithHook._collect(PoolKey,uint256).paid (src/WordsmithHook.sol#159) is a local variable never initialized\n[medium/medium] unused-return at src/WordsmithHook.sol:95: WordsmithHook.claimFees() (src/WordsmithHook.sol#95-100) ignores return value by poolManager.unlock(abi.encode(amount)) (src/WordsmithHook.sol#98)\n[low/medium] reentrancy-events at src/WordsmithHook.sol:95: Reentrancy in WordsmithHook.claimFees() (src/WordsmithHook.sol#95-100):\n[low/medium] reentrancy-events at src/WordsmithHook.sol:158: Reentrancy in WordsmithHook._collect(PoolKey,uint256) (src/WordsmithHook.sol#158-166):\n[low/medium] timestamp at src/WordsmithHook.sol:134: WordsmithHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/WordsmithHook.sol#134-155) uses timestamp for comparisons","passed":true},{"durationMs":340,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/WordsmithHook.sol:143: Reentrancy: State change after external call\n[low] large-numeric-literal at src/WordsmithHook.sol:36: Large Numeric Literal\n[low] state-change-without-event at src/WordsmithHook.sol:111: State Change Without Event\n[low] unchecked-return at src/WordsmithHook.sol:98: Unchecked Return","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e349662d55cf6756a010511941d9dc0e0c5c4622860b1cf67198412ed7333759","verifiedTreeHash":"ac0207eb31cbb75bab365ba7cc9542d44b1f63f2","verifierVersion":"0.1.0+560ab6a2"}]}