{"workflow":null,"planning":null,"id":"17d14f70-4f1b-4de2-8289-95465e51b17b","state":"completed","template":"shape:chain","objective":"Build a Uniswap v4 hook for a new token paired with IMD on Ethereum mainnet. Token name \"paper\", symbol \"paper\".\n\nFee:\n- The hook charges 2% of every swap in IMD, both directions (buys and sells), via beforeSwap/afterSwap return deltas. This total is a constant; nothing can raise it.\n- Inside the total, the split is a storage setting: 0.5% to the orders wallet 0x721F8232e19c92516eB753FEF53d8A33a3637989, 1.5% to the dev wallet 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75. Only the owner can call setSplit(ordersWallet, ordersBps, devWallet, devBps); the two parts must sum to the constant.\n- Fees are paid out to the two wallets in IMD in the same swap, with no accumulation inside the hook.\n\nUpgradeability:\n- The hook is a TransparentUpgradeableProxy whose address is mined with all 14 hook flag bits set (addr & 0x3fff == 0x3fff), so later implementations can use any callback. Unused callbacks are no-ops in v1.\n- ProxyAdmin owner is the constant 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75 (not a constructor argument, not the launch wallet). Storage uses namespaced ERC-7201 slots so an upgrade keeps all state.\n- Deliver two implementations with tests: v1 as specified, and a demo v2 identical except the default split is reversed, used only to rehearse an upgrade.\n\nVoting by burning (in the hook, reads the pool):\n- postDraft(bytes32 textHash) returns draftId: pulls from the caller the token amount worth postFeeUsd dollars at the current pool price (IMD per token from the pool, USD per IMD from a chain-readable source agreed at review; if none, owner-set imdUsd), transfers it to 0x000000000000000000000000000000000000dEaD, emits DraftPosted(draftId, author, textHash, burned). The burned amount counts as the author's votes.\n- burn(uint256 draftId, uint256 amount): pulls amount tokens from the caller to the dead address, emits Burned(draftId, voter, amount). Any amount, any number of times, any existing draft.\n- postFeeUsd starts at 1; owner-only setPostFeeUsd. Views: feeBps(), split(), postFeeUsd(), postFeeTokens().\n- Rounds, quorum and winners are computed off-chain from the events; the hook stores nothing about rounds.\n\nPool:\n- Pair with IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7; economics poolBps 8000, remainderTo 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75. Fee tier and tick spacing as the policy allows.\n\nDeliver a Foundry project with unit tests for fees in both directions, split changes, the post and burn paths, the upgrade to v2 keeping state, and an adversarial review. English only in code and docs.","blockedReason":null,"createdAt":"2026-10-06T17:23:25.826Z","updatedAt":"2026-10-06T20:04:36.914Z","paidBy":"0xb59eac9882ba98f4170d99d5f402c3edb6d50d75","parentJobId":null,"project":{"id":"17d14f70-4f1b-4de2-8289-95465e51b17b","head":"17d14f70-4f1b-4de2-8289-95465e51b17b","running":null,"versions":[{"jobId":"17d14f70-4f1b-4de2-8289-95465e51b17b","workflowId":null,"objective":"Build a Uniswap v4 hook for a new token paired with IMD on Ethereum mainnet. Token name \"paper\", symbol \"paper\".\n\nFee:\n- The hook charges 2% of every swap in IMD, both directions (buys and sells), via beforeSwap/afterSwap return deltas. This total is a constant; nothing can raise it.\n- Inside the total, the split is a storage setting: 0.5% to the orders wallet 0x721F8232e19c92516eB753FEF53d8A33a3637989, 1.5% to the dev wallet 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75. Only the owner can call setSplit(ordersWallet, ordersBps, devWallet, devBps); the two parts must sum to the constant.\n- Fees are paid out to the two wallets in IMD in the same swap, with no accumulation inside the hook.\n\nUpgradeability:\n- The hook is a TransparentUpgradeableProxy whose address is mined with all 14 hook flag bits set (addr & 0x3fff == 0x3fff), so later implementations can use any callback. Unused callbacks are no-ops in v1.\n- ProxyAdmin owner is the constant 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75 (not a constructor argument, not the launch wallet). Storage uses namespaced ERC-7201 slots so an upgrade keeps all state.\n- Deliver two implementations with tests: v1 as specified, and a demo v2 identical except the default split is reversed, used only to rehearse an upgrade.\n\nVoting by burning (in the hook, reads the pool):\n- postDraft(bytes32 textHash) returns draftId: pulls from the caller the token amount worth postFeeUsd dollars at the current pool price (IMD per token from the pool, USD per IMD from a chain-readable source agreed at review; if none, owner-set imdUsd), transfers it to 0x000000000000000000000000000000000000dEaD, emits DraftPosted(draftId, author, textHash, burned). The burned amount counts as the author's votes.\n- burn(uint256 draftId, uint256 amount): pulls amount tokens from the caller to the dead address, emits Burned(draftId, voter, amount). Any amount, any number of times, any existing draft.\n- postFeeUsd starts at 1; owner-only setPostFeeUsd. Views: feeBps(), split(), postFeeUsd(), postFeeTokens().\n- Rounds, quorum and winners are computed off-chain from the events; the hook stores nothing about rounds.\n\nPool:\n- Pair with IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7; economics poolBps 8000, remainderTo 0xb59eac9882Ba98f4170d99D5F402C3EDb6D50D75. Fee tier and tick spacing as the policy allows.\n\nDeliver a Foundry project with unit tests for fees in both directions, split changes, the post and burn paths, the upgrade to v2 keeping state, and an adversarial review. English only in code and docs.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-06T17:23:25.826Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":"3ded72c6-510b-490c-a6ae-ac8b21704a7f","status":"parked","chainId":1},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-825-build-uniswap-v4-hook","pullRequestUrl":"https://github.com/identity-md-launches/launch-825-build-uniswap-v4-hook/pull/1","commit":"a580c0fbd7e2404b619c0b458834b102fa32f447","deliveredAt":"2026-10-06T20:04:44.755Z","media":null},"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T18:52:56.890Z","verdict":null,"seat":{"tokenId":"225","agentId":"52158"},"live":null},{"key":"audit_flow","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T18:52:42.566Z","verdict":null,"seat":{"tokenId":"39","agentId":"52157"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":1,"revisions":2,"judgeRevisions":2,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"allowedPaths":[],"failureReason":null,"dispatchNote":"judge findings unresolved after 3 revisions: no revision budget left for build_contract_project (3 revisions, 2 from the judge) — launch.json still names the bare PaperHook implementation, which cannot initialize or operate the pool; the working PaperProxy cannot be expressed in the manifest and its runtime fails the protected D","dispatchNoteAt":"2026-10-06T20:04:36.914Z","updatedAt":"2026-10-06T20:04:36.914Z","verdict":null,"seat":{"tokenId":"1581","agentId":"51083"},"live":null},{"key":"audit_math","role":"review","state":"accepted","attempt":2,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T18:52:16.186Z","verdict":null,"seat":{"tokenId":"869","agentId":"52163"},"live":null},{"key":"audit_permissions","role":"review","state":"accepted","attempt":3,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T18:50:12.313Z","verdict":null,"seat":{"tokenId":"727","agentId":"52174"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":3,"judgeRevisions":2,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T19:45:36.905Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+94826a22","verifiedTreeHash":"58db8e3b6b773fa777bf42b21f31638b7bee6665","at":"2026-10-06T19:45:37.039Z","failedChecks":[]},"seat":{"tokenId":"47","agentId":"50962"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":2,"judgeRevisions":2,"dependsOn":["build_contract_project","write_foundry_tests"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T19:56:14.852Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+94826a22","verifiedTreeHash":"7162c4b1f03dd6bc9bf235439c922f3547a33fa8","at":"2026-10-06T19:56:14.854Z","failedChecks":[]},"seat":{"tokenId":"1085","agentId":"51446"},"live":null},{"key":"write_foundry_tests","role":"tests","state":"accepted","attempt":1,"revisions":3,"judgeRevisions":2,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-06T19:52:20.022Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+94826a22","verifiedTreeHash":"b933e91f93a0996cd89a19bbef54c06eb08956e7","at":"2026-10-06T19:52:20.023Z","failedChecks":[]},"seat":{"tokenId":"1120","agentId":"50957"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x7f93b8ba9668e2b57d807f3ef011b8e137c71ff50056ac00b7ada31d09af7094","blockNumber":26135794,"sentAt":"2026-10-06T20:42:13.706Z","entries":[{"nodeKey":"audit_economics","agentId":"52158","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"52157","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"52179","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"52232","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"51083","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"52163","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"52174","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"51541","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"50962","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"51519","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"50953","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"51737","value":0,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51446","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51704","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"52287","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"50957","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51300","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51733","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51890","value":1,"role":"verification:checks"}]}]}