{"workflow":null,"planning":null,"id":"10d36739-0a2c-4388-b19a-753136227683","state":"completed","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 (LP fee 12500, 1.25%).\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 on Ethereum mainnet, kind univ4_hook, paired with IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7): the launch token and its Uniswap v4 pool with our hook, which paints a 32x32 dot canvas on chain, one dot per swap.\n\nTOKEN PixelToken (src/PixelToken.sol): plain ERC20, name \"Pixel Pool\", symbol \"PIXEL\", 18 decimals, no constructor arguments, fixed supply 10^27 units minted once to its deployer, ordinary transfers, no mint, tax, owner or proxy.\n\nHOOK PixelPoolHook (src/PixelPoolHook.sol, Solidity 0.8.26, Foundry, depends only on v4-core):\n1. Implements IHooks directly. Constructor(IPoolManager manager, address token) in that order; validates permissions with Hooks.validateHookPermissions. Permissions: beforeInitialize and afterSwap only (address mask 0x2040). No return deltas, never touches funds.\n2. beforeInitialize: only the PoolManager, only once, only for the pool of this hook with the launch token and IMD; stores poolId and quoteIsCurrency0 (true when currency0 is not the launch token). Any later initialize reverts. Every enabled callback reverts unless msg.sender is the PoolManager; afterSwap reverts for any other pool.\n3. 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 repaints from the top left.\n4. Color: BUY = IMD in, PIXEL out (buy = zeroForOne == quoteIsCurrency0) is GREEN; SELL is RED. Shade by the absolute IMD amount of the swap delta: < 5, < 50, < 500, >= 500 IMD (18 decimals) -> index 0..3. Palette index: 0 empty, 1..4 green #1f7a3d #22b455 #2ee66b #8dffad, 5..8 red #7a1f1f #c42b2b #ff3b3b #ff9a9a, empty #0b0b12.\n5. Storage: 1024 one-byte palette indexes packed 32 per slot in uint256[32], leftmost dot in the least significant byte of each row.\n6. Event Painted(uint256 indexed stroke, uint256 indexed pixel, uint8 color, address indexed painter) with painter = tx.origin.\n7. Views: strokes(), pixelAt(i), canvas() returning uint256[32], quoteIsCurrency0(), render() returning an SVG of the dots built in a preallocated buffer, under 15M gas on a full canvas.\n8. No owner, admin, upgrade, pause or post deploy calls. Keep it small; no features beyond this spec.\n\nTESTS (Foundry, against a real v4 PoolManager): dots paint in order; buy green and sell red with IMD as currency0 AND as currency1; bigger swaps brighter; second pass repaints; only one pool; only PoolManager; render under the gas limit.\n\nLaunch manifest: launch.json must be exactly this JSON:\n{\n  \"kind\": \"univ4_hook\",\n  \"hook\": {\n    \"contract\": \"PixelPoolHook\",\n    \"constructorArgs\": [\"$poolManager\", \"$token\"],\n    \"permissions\": [\"beforeInitialize\", \"afterSwap\"]\n  },\n  \"token\": { \"contract\": \"PixelToken\", \"name\": \"Pixel Pool\", \"symbol\": \"PIXEL\", \"decimals\": 18 },\n  \"pool\": {\n    \"pairedCurrency\": \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",\n    \"fee\": 12500,\n    \"tickSpacing\": 60,\n    \"initialPrice\": \"79228162514264337593543950336\"\n  },\n  \"notes\": \"PIXEL POOL on Ethereum mainnet paired with IMD. PixelPoolHook(IPoolManager $poolManager, address $token) has permissions beforeInitialize and afterSwap (mask 0x2040), no return deltas, no fee, no owner. Every swap paints one dot on a 32x32 on chain canvas in order: green for buys, red for sells, brighter for bigger IMD amounts; after 1024 swaps it repaints from the top. PixelToken has no constructor arguments, 18 decimals and a fixed 10^27 supply minted to its deployer. initialPrice 2^96 is the decimal sqrtPriceX96 for provenance; the launch economics set the actual opening price. Deploy the hook and initialize the pool in one transaction.\"\n}","blockedReason":null,"createdAt":"2026-10-09T00:37:05.718Z","updatedAt":"2026-10-09T01:07:40.540Z","paidBy":"0x6f3511265742aee0160a69653dc1b5beffd3b62b","parentJobId":null,"project":{"id":"10d36739-0a2c-4388-b19a-753136227683","head":"10d36739-0a2c-4388-b19a-753136227683","running":null,"versions":[{"jobId":"10d36739-0a2c-4388-b19a-753136227683","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 (LP fee 12500, 1.25%).\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 on Ethereum mainnet, kind univ4_hook, paired with IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7): the launch token and its Uniswap v4 pool with our hook, which paints a 32x32 dot canvas on chain, one dot per swap.\n\nTOKEN PixelToken (src/PixelToken.sol): plain ERC20, name \"Pixel Pool\", symbol \"PIXEL\", 18 decimals, no constructor arguments, fixed supply 10^27 units minted once to its deployer, ordinary transfers, no mint, tax, owner or proxy.\n\nHOOK PixelPoolHook (src/PixelPoolHook.sol, Solidity 0.8.26, Foundry, depends only on v4-core):\n1. Implements IHooks directly. Constructor(IPoolManager manager, address token) in that order; validates permissions with Hooks.validateHookPermissions. Permissions: beforeInitialize and afterSwap only (address mask 0x2040). No return deltas, never touches funds.\n2. beforeInitialize: only the PoolManager, only once, only for the pool of this hook with the launch token and IMD; stores poolId and quoteIsCurrency0 (true when currency0 is not the launch token). Any later initialize reverts. Every enabled callback reverts unless msg.sender is the PoolManager; afterSwap reverts for any other pool.\n3. 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 repaints from the top left.\n4. Color: BUY = IMD in, PIXEL out (buy = zeroForOne == quoteIsCurrency0) is GREEN; SELL is RED. Shade by the absolute IMD amount of the swap delta: < 5, < 50, < 500, >= 500 IMD (18 decimals) -> index 0..3. Palette index: 0 empty, 1..4 green #1f7a3d #22b455 #2ee66b #8dffad, 5..8 red #7a1f1f #c42b2b #ff3b3b #ff9a9a, empty #0b0b12.\n5. Storage: 1024 one-byte palette indexes packed 32 per slot in uint256[32], leftmost dot in the least significant byte of each row.\n6. Event Painted(uint256 indexed stroke, uint256 indexed pixel, uint8 color, address indexed painter) with painter = tx.origin.\n7. Views: strokes(), pixelAt(i), canvas() returning uint256[32], quoteIsCurrency0(), render() returning an SVG of the dots built in a preallocated buffer, under 15M gas on a full canvas.\n8. No owner, admin, upgrade, pause or post deploy calls. Keep it small; no features beyond this spec.\n\nTESTS (Foundry, against a real v4 PoolManager): dots paint in order; buy green and sell red with IMD as currency0 AND as currency1; bigger swaps brighter; second pass repaints; only one pool; only PoolManager; render under the gas limit.\n\nLaunch manifest: launch.json must be exactly this JSON:\n{\n  \"kind\": \"univ4_hook\",\n  \"hook\": {\n    \"contract\": \"PixelPoolHook\",\n    \"constructorArgs\": [\"$poolManager\", \"$token\"],\n    \"permissions\": [\"beforeInitialize\", \"afterSwap\"]\n  },\n  \"token\": { \"contract\": \"PixelToken\", \"name\": \"Pixel Pool\", \"symbol\": \"PIXEL\", \"decimals\": 18 },\n  \"pool\": {\n    \"pairedCurrency\": \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",\n    \"fee\": 12500,\n    \"tickSpacing\": 60,\n    \"initialPrice\": \"79228162514264337593543950336\"\n  },\n  \"notes\": \"PIXEL POOL on Ethereum mainnet paired with IMD. PixelPoolHook(IPoolManager $poolManager, address $token) has permissions beforeInitialize and afterSwap (mask 0x2040), no return deltas, no fee, no owner. Every swap paints one dot on a 32x32 on chain canvas in order: green for buys, red for sells, brighter for bigger IMD amounts; after 1024 swaps it repaints from the top. PixelToken has no constructor arguments, 18 decimals and a fixed 10^27 supply minted to its deployer. initialPrice 2^96 is the decimal sqrtPriceX96 for provenance; the launch economics set the actual opening price. Deploy the hook and initialize the pool in one transaction.\"\n}","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-09T00:37:05.718Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":"3ff2c26d-01fd-497a-8049-e2643075b77d","status":"live","chainId":1},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-1118-pixel-pool","pullRequestUrl":"https://github.com/identity-md-launches/launch-1118-pixel-pool/pull/1","commit":"661f8bfdeeeafeb31655a0d2714eafd232a7a67d","deliveredAt":"2026-10-09T01:08:09.463Z","media":null},"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:55:52.678Z","verdict":null,"seat":{"tokenId":"1113","agentId":"51250"},"live":null},{"key":"audit_flow","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:53:58.703Z","verdict":null,"seat":{"tokenId":"61","agentId":"51021"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":1,"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-09T01:07:40.540Z","verdict":null,"seat":{"tokenId":"1968","agentId":"52085"},"live":null},{"key":"audit_math","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:54:15.354Z","verdict":null,"seat":{"tokenId":"1199","agentId":"51144"},"live":null},{"key":"audit_permissions","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:54:28.008Z","verdict":null,"seat":{"tokenId":"788","agentId":"52261"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:48:15.624Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"528f701f2826f1c70811591560280f7895634aa6","at":"2026-10-09T00:48:15.628Z","failedChecks":[]},"seat":{"tokenId":"1650","agentId":"52073"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T00:51:43.786Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"a4117be5e749827ba9b2dee04b31f5f4e207ea7e","at":"2026-10-09T00:51:43.792Z","failedChecks":[]},"seat":{"tokenId":"1542","agentId":"52089"},"live":null},{"key":"write_foundry_tests","role":"tests","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T01:01:47.804Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"334d4dcbc41a0f6969f12e4829e82ee8af46e9ef","at":"2026-10-09T01:01:47.827Z","failedChecks":[]},"seat":{"tokenId":"1781","agentId":"51539"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"audit_economics","agentId":"51250","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"51021","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"52085","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"51144","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"52261","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"52073","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"52089","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51539","value":1,"role":"verification:checks"}]}]}