{"workflow":null,"planning":null,"id":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","state":"blocked","template":"shape:chain","objective":"When the hook acts: after every swap (afterSwap), plus once at pool initialization (beforeInitialize) to lock the hook to this launch's pool.\nFee rule: the hook takes no fee. No fees, only the launchpad's standard trading fee.\nWhere fees go: nowhere; the hook never takes or moves any funds.\nWho can change it: nobody. No owner, no admin, no upgrades, no settings.\nToken name: Pixel Pool\nToken symbol: PIXEL\n\nBuild PIXEL POOL: a Uniswap v4 hook whose pool paints a 32x32 dot canvas, one dot per swap, fully on chain. The pool pairs the new token with IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7).\n\nCONTRACT PixelPoolHook (Solidity 0.8.26, Foundry, depends only on v4-core):\n1. Implements IHooks directly (no BaseHook). Permissions: beforeInitialize and afterSwap only. No return deltas, never touches funds. Constructor takes only the PoolManager and validates permissions.\n2. beforeInitialize: the first pool initialized with the hook is stored as its only pool (poolId). Any later initialize reverts PoolAlreadySet. Every hook entry reverts NotPoolManager unless msg.sender is the PoolManager. afterSwap reverts WrongPool for any other pool.\n3. beforeInitialize also stores which side is the quote currency: quoteIsCurrency0 = (currency0 is IMD or native ETH). The other side is the launch token. This makes buy and sell correct whatever the address order is.\n4. afterSwap paints one dot: strokes += 1; pixel = (strokes - 1) % 1024. Dots fill in order, left to right, top to bottom; after 1024 swaps a new pass starts at the top left and repaints over the old dots.\n5. Color: a BUY is a swap where the quote currency goes in and the launch token comes out (buy = zeroForOne == quoteIsCurrency0). BUY is GREEN, SELL is RED. Shade by the absolute quote side amount of the swap delta: < 5 IMD, < 50 IMD, < 500 IMD, >= 500 IMD (in 18 decimals) -> index 0..3. Palette index: 0 empty, 1..4 green, 5..8 red. Hex: 1 #1f7a3d, 2 #22b455, 3 #2ee66b, 4 #8dffad, 5 #7a1f1f, 6 #c42b2b, 7 #ff3b3b, 8 #ff9a9a, empty #0b0b12.\n6. Storage: 1024 one-byte palette indexes packed 32 per slot in uint256[32].\n7. Event Painted(uint256 indexed stroke, uint256 indexed pixel, uint8 color, address indexed painter) with painter = tx.origin.\n8. Views: strokes(), pass() (1 + (strokes-1)/1024, 1 when empty), pixelAt(i), canvas() returning 1024 bytes, palette(i) returning bytes7 hex, quoteIsCurrency0(), render() returning an SVG (viewBox 0 0 32 36, dark background, one path per color, each dot a 0.8 square offset 0.1 so dots show gaps, footer text \"PIXEL POOL  pass N  swaps M\"), renderURI() returning data:image/svg+xml;base64. render must build into a preallocated buffer (no repeated abi.encodePacked concatenation) and stay under 15M gas on a full canvas.\n9. No owner, no admin, no upgrade, no post deploy calls. Keep it small and readable; no features beyond this spec.\n\nTESTS (Foundry, against a real v4 PoolManager): swaps paint dots in order with no gaps; a buy is green and a sell red with the quote currency as currency0 AND as currency1; bigger swaps brighter; second pass repaints dots 0 and 1; only one pool; only PoolManager can call the hook; render under the gas limit on a full canvas.\n\nPool parameters for the manifest: tickSpacing 60. Initial price: the launch policy's opening market cap of 2,500 IMD for 1,000,000,000 PIXEL, i.e. 0.0000025 IMD per PIXEL (both 18 decimals). currency0 is the lower address. If currency0 = PIXEL and currency1 = IMD: sqrtPriceX96 = 125270724187523965593206901. If currency0 = IMD and currency1 = PIXEL: sqrtPriceX96 = 50108289675009586237282760313921. If the launch factory sets these itself, use the factory values.","blockedReason":"node build_contract_project: analysis_failed","createdAt":"2026-10-08T23:22:44.132Z","updatedAt":"2026-10-09T00:02:40.996Z","paidBy":"0x6f3511265742aee0160a69653dc1b5beffd3b62b","parentJobId":null,"project":{"id":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","head":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","running":null,"versions":[{"jobId":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","workflowId":null,"objective":"When the hook acts: after every swap (afterSwap), plus once at pool initialization (beforeInitialize) to lock the hook to this launch's pool.\nFee rule: the hook takes no fee. No fees, only the launchpad's standard trading fee.\nWhere fees go: nowhere; the hook never takes or moves any funds.\nWho can change it: nobody. No owner, no admin, no upgrades, no settings.\nToken name: Pixel Pool\nToken symbol: PIXEL\n\nBuild PIXEL POOL: a Uniswap v4 hook whose pool paints a 32x32 dot canvas, one dot per swap, fully on chain. The pool pairs the new token with IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7).\n\nCONTRACT PixelPoolHook (Solidity 0.8.26, Foundry, depends only on v4-core):\n1. Implements IHooks directly (no BaseHook). Permissions: beforeInitialize and afterSwap only. No return deltas, never touches funds. Constructor takes only the PoolManager and validates permissions.\n2. beforeInitialize: the first pool initialized with the hook is stored as its only pool (poolId). Any later initialize reverts PoolAlreadySet. Every hook entry reverts NotPoolManager unless msg.sender is the PoolManager. afterSwap reverts WrongPool for any other pool.\n3. beforeInitialize also stores which side is the quote currency: quoteIsCurrency0 = (currency0 is IMD or native ETH). The other side is the launch token. This makes buy and sell correct whatever the address order is.\n4. afterSwap paints one dot: strokes += 1; pixel = (strokes - 1) % 1024. Dots fill in order, left to right, top to bottom; after 1024 swaps a new pass starts at the top left and repaints over the old dots.\n5. Color: a BUY is a swap where the quote currency goes in and the launch token comes out (buy = zeroForOne == quoteIsCurrency0). BUY is GREEN, SELL is RED. Shade by the absolute quote side amount of the swap delta: < 5 IMD, < 50 IMD, < 500 IMD, >= 500 IMD (in 18 decimals) -> index 0..3. Palette index: 0 empty, 1..4 green, 5..8 red. Hex: 1 #1f7a3d, 2 #22b455, 3 #2ee66b, 4 #8dffad, 5 #7a1f1f, 6 #c42b2b, 7 #ff3b3b, 8 #ff9a9a, empty #0b0b12.\n6. Storage: 1024 one-byte palette indexes packed 32 per slot in uint256[32].\n7. Event Painted(uint256 indexed stroke, uint256 indexed pixel, uint8 color, address indexed painter) with painter = tx.origin.\n8. Views: strokes(), pass() (1 + (strokes-1)/1024, 1 when empty), pixelAt(i), canvas() returning 1024 bytes, palette(i) returning bytes7 hex, quoteIsCurrency0(), render() returning an SVG (viewBox 0 0 32 36, dark background, one path per color, each dot a 0.8 square offset 0.1 so dots show gaps, footer text \"PIXEL POOL  pass N  swaps M\"), renderURI() returning data:image/svg+xml;base64. render must build into a preallocated buffer (no repeated abi.encodePacked concatenation) and stay under 15M gas on a full canvas.\n9. No owner, no admin, no upgrade, no post deploy calls. Keep it small and readable; no features beyond this spec.\n\nTESTS (Foundry, against a real v4 PoolManager): swaps paint dots in order with no gaps; a buy is green and a sell red with the quote currency as currency0 AND as currency1; bigger swaps brighter; second pass repaints dots 0 and 1; only one pool; only PoolManager can call the hook; render under the gas limit on a full canvas.\n\nPool parameters for the manifest: tickSpacing 60. Initial price: the launch policy's opening market cap of 2,500 IMD for 1,000,000,000 PIXEL, i.e. 0.0000025 IMD per PIXEL (both 18 decimals). currency0 is the lower address. If currency0 = PIXEL and currency1 = IMD: sqrtPriceX96 = 125270724187523965593206901. If currency0 = IMD and currency1 = PIXEL: sqrtPriceX96 = 50108289675009586237282760313921. If the launch factory sets these itself, use the factory values.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"blocked","createdAt":"2026-10-08T23:22:44.132Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":null,"status":null,"chainId":1},"oracleRequestId":null,"delivery":null,"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"audit_flow","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"audit_judge","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"audit_math","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"audit_permissions","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"build_contract_project","role":"implement","state":"failed","attempt":3,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":"analysis_failed","dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:02:40.996Z","verdict":{"status":"rejected","profile":"foundry","evaluation":"checks","rejectionCode":"analysis_failed","detail":"launch.json is not a valid launch manifest: pool.initialPrice: Invalid input: expected string, received undefined","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"cacbf19d09b0d41423520b46d950475ba5fd07ae","at":"2026-10-09T00:02:40.994Z","failedChecks":[]},"seat":null,"live":null},{"key":"manifest","role":"integrate","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null},{"key":"write_foundry_tests","role":"tests","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T23:22:44.132Z","verdict":null,"seat":null,"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"build_contract_project","agentId":"52009","value":0,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"52282","value":0,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"51890","value":0,"role":"verification:checks"}]}]}