{"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":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","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":"waiting"},{"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":"waiting"},{"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":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","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":"waiting"},{"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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"waiting"}],"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.","parentJobId":null,"planHash":"43d21edb5b28c4708c5263c4fe1108c9835d509d87cffd8a65aea0f69c9f8cb0","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5478dd56-b9ce-4e93-aad6-3f3f2f879443","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1108-pixel-pool"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52009","feedbackHash":"a2795e2d73c5978b1d26b890547eca96e923fc621d9bfa0f5bada32367561b06","nodeKey":"build_contract_project","submissionHash":"b6ec023adf6b8896f36253304ab8e59cec83b7ca324000dd9e76f81e2e7269e0","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"52282","feedbackHash":"096568e91514660d0ab1bc604639ac4f2f6cf57a1a8361506e014da5cd74dea3","nodeKey":"build_contract_project","submissionHash":"fc28c67b33aa7613299e71ab8cce6d6efa1b205bfcab55994a190d416ebd7752","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51890","feedbackHash":"686d24a53176e2dfcc83545216a7e4fae60ce5eb6dc851593ce5a78f7de30b72","nodeKey":"build_contract_project","submissionHash":"adebbf681379918987211616003b4fcfde3d5ffe597631cdad5fa66876848033","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"3c0fa5fb1e4cd498755243eba738fd6dd3954cf142d8baaaaa3e54809bb338af","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"2b662469f7498ee79ee7bbe806adc026aa28b5127de5e4de60b18d8156358722","device":"e66f9bf5eca15ea2","findings":[],"hash":"adebbf681379918987211616003b4fcfde3d5ffe597631cdad5fa66876848033","nodeId":"66818ea3-da78-4a78-8e83-36d66901b5e4","outcome":"completed","summary":"Implemented the hook, PIXEL token, SVG renderer, vendored dependencies, tests, and deployment documentation. Manifest corrected to `kind: \"univ4_hook\"`.\n\n- Clean offline build passed with Solidity 0.8.26.\n- All 44 tests passed.\n- `forge fmt --check` passed.\n- Full-canvas rendering: **4,675,677 gas**, below 15M.\n\nDeployment must select the opening price for the resolved currency address order, as documented in README.md.","treeHash":"8fba78126ac690edad0e201398255007bd821943","usage":{"cachedInputTokens":1489280,"inputTokens":106537,"model":"gpt-6-astra","outputTokens":26140,"runtime":"codex","turns":7,"wallClockMs":676775}},{"artifacts":[],"attempt":3,"bundleHash":"4f3eecd09e584dd8207d08bce38aaf47990702910bac5ae1ff6a696218f14f45","device":"6ce0cec991d77172","findings":[],"hash":"b6ec023adf6b8896f36253304ab8e59cec83b7ca324000dd9e76f81e2e7269e0","nodeId":"66818ea3-da78-4a78-8e83-36d66901b5e4","outcome":"completed","summary":"Implemented the hook, fixed-supply PIXEL token, SVG renderer, vendored dependencies, manifest, and documentation.\n\n- `forge build`, `forge test`, and `forge fmt --check` pass.\n- All 48 tests pass offline.\n- Full-canvas rendering uses 4,468,661 gas, below 15M.\n- Manifest uses `univ4_hook` and the lowercase IMD address.\n\nDeployment parameters and atomic initialization requirements are documented in README.md.","treeHash":"cacbf19d09b0d41423520b46d950475ba5fd07ae","usage":{"cachedInputTokens":899200,"inputTokens":428110,"model":"gpt-6-astra","outputTokens":23681,"runtime":"codex","turns":6,"wallClockMs":568891}},{"artifacts":[],"attempt":1,"bundleHash":"44c3b911f2c0689696b0287a540235472894d9c63ef392bf7ffc61ea8e817488","device":"7b7c27166477ddd8","findings":[],"hash":"fc28c67b33aa7613299e71ab8cce6d6efa1b205bfcab55994a190d416ebd7752","nodeId":"66818ea3-da78-4a78-8e83-36d66901b5e4","outcome":"completed","summary":"Implemented the hook, PIXEL token, SVG/Base64 renderer, vendored dependencies, launch manifest, and price resolver.\n\nValidation passed:\n\n- `forge build`, 31 tests, and `forge fmt --check`\n- 11 supplied admission checks and 3 manifest tests\n- Offline rebuild with a cleared environment\n\nFull-canvas rendering uses **4,934,053 gas**, below 15M.\n\n[Deployment instructions](README.md) cover address-order price selection and atomic initialization. No transactions were broadcast.","treeHash":"524fb5dd647f2e6a10a6f77c07a25e86bf9932c3","usage":{"cachedInputTokens":3350656,"inputTokens":244109,"model":"gpt-6-astra","outputTokens":38301,"runtime":"codex","turns":9,"wallClockMs":1073131}}],"verification":[{"checks":[{"durationMs":2498,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.38s\nCompiler run successful!\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PixelRenderer.sol:18:9\n   │\n18 │         revert InvalidColor();\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:75:43\n   │\n75 │             buffer[p + --digits] = bytes1(uint8(48 + value % 10));\n   │                                           ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/PixelRenderer.sol:84:57\n   │\n84 │         bytes memory result = new bytes(prefix.length + 4 * ((data.length + 2) / 3));\n   │                                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/PixelRenderer.sol:86:25\n   │\n86 │         for (uint256 i; i < data.length; i += 3) {\n   │                         ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:92:75\n   │\n92 │             result[p++] = i + 1 < data.length ? alphabet[(n >> 6) & 63] : bytes1(\"=\");\n   │                                                                           ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:93:68\n   │\n93 │             result[p++] = i + 2 < data.length ? alphabet[n & 63] : bytes1(\"=\");\n   │                                                                    ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:74:24\n   │\n74 │         uint256 size = uint256(quote < 0 ? -quote : quote);\n   │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:93:16\n   │\n93 │         return uint8(pixels[i / 32] >> ((i % 32) * 8));\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PixelPoolHook.sol:101:48\n    │\n101 │                 result[slot * 32 + j] = bytes1(uint8(packed));\n    │                                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":402,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/PixelToken.t.sol:PixelTokenTest\n[PASS] testFuzz_transfersConserveSupply(uint256) (runs: 256, μ: 157587, ~: 159304)\nLogs:\n  Bound result 15533579860\n\n[PASS] test_adminAndMintSelectorsUnavailable() (gas: 136992)\n[PASS] test_infiniteApprovalZeroAndSelfTransfer() (gas: 204795)\n[PASS] test_invalidTransfersAndApprovalsRevert() (gas: 201150)\n[PASS] test_metadataAndFactorySupply() (gas: 45286)\n[PASS] test_transferAndApprovalEventsAndAmounts() (gas: 226809)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.23ms (5.61ms CPU time)\n\nRan 2 tests for test/PixelRender.t.sol:PixelRendererUnitTest\n[PASS] testFuzz_base64AllPaddingCases(bytes) (runs: 256, μ: 37443, ~: 31797)\n[PASS] test_maximumFooterFitsBuffer() (gas: 4360458)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.75ms (13.72ms CPU time)\n\nRan 13 tests for test/PixelPoolSecurity.t.sol:PixelPoolSecurityTest\n[PASS] testFuzz_callbackUsesQuoteSideOnly(int128,int128,bool) (runs: 256, μ: 117558, ~: 117570)\n[PASS] test_absoluteInt128MinAndZeroDeltaHaveDefinedColors() (gas: 174695)\n[PASS] test_cannotPaintBeforeInitialization() (gas: 55563588)\n[PASS] test_constructorRejectsWrongFlags() (gas: 14837)\n[PASS] test_everyCallbackAuthenticatesIncludingDisabledCallbacks() (gas: 520060)\n[PASS] test_nativeCurrencyIsRecognizedAsQuote() (gas: 56281423)\n[PASS] test_onlyOnePoolViaRealManager() (gas: 290181)\n[PASS] test_paintedEventUsesOriginNotRouterOrHookData() (gas: 216566)\n[PASS] test_permissionsAndAddressMatch() (gas: 16257)\n[PASS] test_pixelsUse32ConsecutivePackedSlots() (gas: 11466360)\n[PASS] test_revertedFirstInitializationDoesNotLockPool() (gas: 55849968)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 4482044)\n[PASS] test_secondInitializationCallbackAndWrongPoolRejected() (gas: 95873)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 66.24ms (150.52ms CPU time)\n\nRan 10 tests for test/PixelPoolSwap.t.sol:PixelPoolQuote1Test\n[PASS] testFuzz_actualSwapColorAndConservation(bool,bool,uint96) (runs: 256, μ: 309999, ~: 307874)\nLogs:\n  Bound result 1999999999039306575086\n\n[PASS] test_buysAndSellsPaintInOrderAcrossSlotBoundaries() (gas: 15589311)\n[PASS] test_exactOutputBuyAndExactInputSellUseActualQuoteDelta() (gas: 451987)\n[PASS] test_failedSettlementRollsBackPaintAndPrice() (gas: 214963)\n[PASS] test_fullCanvasAndSecondPassPreserveUntouchedDots() (gas: 160143738)\n[PASS] test_initializationAndEmptyCanvas() (gas: 470687)\n[PASS] test_noHookFundsOrDeltasAndLiquidityCanBeRemoved() (gas: 728420)\n[PASS] test_openingMarketCapPriceAccepted() (gas: 55631406)\n[PASS] test_priceLimitedSwapShadesExecutedQuoteNotRequestedInput() (gas: 246406)\n[PASS] test_quoteThresholdsBothSignsAndBrighterSwaps() (gas: 2892000)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 163.18ms (210.54ms CPU time)\n\nRan 10 tests for test/PixelPoolSwap.t.sol:PixelPoolQuote0Test\n[PASS] testFuzz_actualSwapColorAndConservation(bool,bool,uint96) (runs: 256, μ: 310410, ~: 311523)\nLogs:\n  Bound result 123271460336879327832\n\n[PASS] test_buysAndSellsPaintInOrderAcrossSlotBoundaries() (gas: 15587495)\n[PASS] test_exactOutputBuyAndExactInputSellUseActualQuoteDelta() (gas: 450245)\n[PASS] test_failedSettlementRollsBackPaintAndPrice() (gas: 221582)\n[PASS] test_fullCanvasAndSecondPassPreserveUntouchedDots() (gas: 160741976)\n[PASS] test_initializationAndEmptyCanvas() (gas: 470688)\n[PASS] test_noHookFundsOrDeltasAndLiquidityCanBeRemoved() (gas: 734761)\n[PASS] test_openingMarketCapPriceAccepted() (gas: 55631435)\n[PASS] test_priceLimitedSwapShadesExecutedQuoteNotRequestedInput() (gas: 252391)\n[PASS] test_quoteThresholdsBothSignsAndBrighterSwaps() (gas: 2905590)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 165.56ms (220.26ms CPU time)\n\nRan 3 tests for test/PixelRender.t.sol:PixelRenderTest\n[PASS] test_emptySVGAndURI() (gas: 66504715)\n[PASS] test_fullCanvasRenderBelow15MillionGasAndURI() (gas: 265861753)\nLogs:\n  full canvas render gas: 4675677\n\n[PASS] test_paletteAndViewBounds() (gas: 113236)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 300.86ms (391.05ms CPU time)\n\nRan 6 test suites in 301.88ms (708.83ms CPU time): 44 tests passed, 0 failed, 0 skipped (44 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PixelPoolHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PixelPoolHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"PixelToken.approve(address,uint256)\",\"PixelToken.transfer(address,uint256)\",\"PixelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":11,\"README.md\":85,\"foundry.toml\":16,\"launch.json\":21,\"remappings.txt\":3,\"src/PixelPoolHook.sol\":201,\"src/PixelRenderer.sol\":97,\"src/PixelToken.sol\":55,\"test/PixelPoolSecurity.t.sol\":195,\"test/PixelPoolSwap.t.sol\":159,\"test/PixelRender.t.sol\":113,\"test/PixelToken.t.sol\":95,\"test/helpers/PixelFixture.sol\":119,\"test/helpers/PoolDriver.sol\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":822,"exitCode":0,"name":"slither","output":"[medium/medium] divide-before-multiply at src/PixelRenderer.sol:80: PixelRenderer.uri(string) (src/PixelRenderer.sol#80-96) performs a multiplication on the result of a division:","passed":true},{"durationMs":323,"exitCode":0,"name":"aderyn","output":"[high] unsafe-casting at src/PixelPoolHook.sol:101: Unsafe Casting of integers\n[low] internal-function-used-once at src/PixelRenderer.sol:8: Internal Function Used Only Once\n[low] large-numeric-literal at src/PixelToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/PixelPoolHook.sol:75: Literal Instead of Constant (37 places)\n[low] missing-inheritance at src/PixelToken.sol:5: Missing Inheritance\n[low] require-revert-in-loop at src/PixelRenderer.sol:30: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PixelPoolHook.sol:50: State Change Without Event\n[low] uninitialized-local-variable at src/PixelRenderer.sol:30: Uninitialized Local Variable (3 places)\n[low] unused-public-function at src/PixelPoolHook.sol:91: Public Function Not Used Internally","passed":true}],"detail":"launch.json is not a valid launch manifest: pool.pairedCurrency: expected a lowercase EVM address","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"adebbf681379918987211616003b4fcfde3d5ffe597631cdad5fa66876848033","verifiedTreeHash":"8fba78126ac690edad0e201398255007bd821943","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2984,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.85s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:11:14\n   │\n11 │             [bytes7(\"#0b0b12\"), \"#1f7a3d\", \"#22b455\", \"#2ee66b\", \"#8dffad\", \"#7a1f1f\", \"#c42b2b\", \"#ff3b3b\", \"#ff9a9a\"];\n   │              ━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes7' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PixelRenderer.sol:62:9\n   │\n62 │         require(pos + value.length <= out.length);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n  ╭▸ src/PixelRenderer.sol:9:24\n  │\n9 │         if (index > 8) revert InvalidPaletteIndex();\n  │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  │\n  ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:77:36\n   │\n77 │             out[--cursor] = bytes1(uint8(48 + value % 10));\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/PixelRenderer.sol:85:33\n   │\n85 │         uint256 encodedLength = 4 * ((svg.length + 2) / 3);\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/PixelRenderer.sol:88:25\n   │\n88 │         for (uint256 i; i < svg.length; i += 3) {\n   │                         ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:96:65\n   │\n96 │             out[pos++] = second ? alphabet[(chunk >> 6) & 63] : bytes1(\"=\");\n   │                                                                 ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelRenderer.sol:97:57\n   │\n97 │             out[pos++] = third ? alphabet[chunk & 63] : bytes1(\"=\");\n   │                                                         ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:68:26\n   │\n68 │         uint256 amount = uint256(quote < 0 ? -quote : quote);\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:87:16\n   │\n87 │         return uint8(pixels[index / 32] >> ((index % 32) * 8));\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:95:51\n   │\n95 │                 data[slot * 32 + offset] = bytes1(uint8(packed));\n   │                                                   ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":386,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/PixelToken.t.sol:PixelTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 119332, ~: 119298)\nLogs:\n  Bound result 285823583947435149789488560\n\n[PASS] test_metadataAndSupply() (gas: 45286)\n[PASS] test_noAdminOrMintSelectorsEvenForDeployer() (gas: 253862)\n[PASS] test_selfZeroAndMaximumAllowance() (gas: 187251)\n[PASS] test_transferAndTransferFrom() (gas: 203368)\n[PASS] test_transferFailuresRollback() (gas: 186579)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.38ms (5.98ms CPU time)\n\nRan 8 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testFuzz_base64MatchesIndependentEncoder(bytes) (runs: 256, μ: 30174, ~: 24463)\n[PASS] test_afterSwapBeforeInitializationReverts() (gas: 37689)\n[PASS] test_constructorRejectsWrongAddressFlags() (gas: 7569)\n[PASS] test_emptyRenderAndBase64PaddingVectors() (gas: 22793386)\n[PASS] test_exactPermissionsAndAddress() (gas: 15841)\n[PASS] test_factoryCanInitializeAtBothOpeningPrices() (gas: 21862213)\n[PASS] test_nativeQuoteBuyAndSell() (gas: 1590118)\n[PASS] test_runtimeSizeAndForbiddenOpcodes() (gas: 3246299)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 178.07ms (92.87ms CPU time)\n\nRan 17 tests for test/PixelPoolHook.t.sol:PixelPoolQuote1Test\n[PASS] testFuzz_deltaUsesOnlyQuoteAndHandlesMinimumInt128(int128,int128,bool) (runs: 256, μ: 103247, ~: 103260)\n[PASS] testFuzz_realSwapsMatchQuoteDelta(bool,bool,uint96) (runs: 256, μ: 221262, ~: 222544)\nLogs:\n  Bound result 999999999990000011147\n\n[PASS] test_allCallbacksRejectNonManager() (gas: 296638)\n[PASS] test_buysSellsExactInputAndOutputPaintInOrder() (gas: 24573333)\n[PASS] test_disabledCallbacksRejectManager() (gas: 244045)\n[PASS] test_failedSettlementRollsBackPaint() (gas: 622368)\n[PASS] test_fullCanvasRenderGasAndURI() (gas: 187632732)\nLogs:\n  Full canvas render gas: 4468661\n\n[PASS] test_initializationAndEmptyCanvas() (gas: 492263)\n[PASS] test_minimumQuoteDelta() (gas: 113660)\n[PASS] test_noHookFeeComparedWithIdenticalControlPool() (gas: 2629109)\n[PASS] test_painterIsOriginNotRouterOrSender() (gas: 211130)\n[PASS] test_paletteAndBounds() (gas: 104947)\n[PASS] test_partialFillShadesActualDelta() (gas: 205903)\n[PASS] test_quoteThresholdsOnRealSwaps() (gas: 2279589)\n[PASS] test_rejectsRepeatedCallbackAndWrongPool() (gas: 84250)\n[PASS] test_rejectsSecondPoolThroughManager() (gas: 75121)\n[PASS] test_secondPassRepaintsOnlyFirstTwoPixels() (gas: 137844691)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 277.67ms (466.93ms CPU time)\n\nRan 17 tests for test/PixelPoolHook.t.sol:PixelPoolQuote0Test\n[PASS] testFuzz_deltaUsesOnlyQuoteAndHandlesMinimumInt128(int128,int128,bool) (runs: 256, μ: 103247, ~: 103259)\n[PASS] testFuzz_realSwapsMatchQuoteDelta(bool,bool,uint96) (runs: 256, μ: 221191, ~: 218845)\nLogs:\n  Bound result 172256480924632767004\n\n[PASS] test_allCallbacksRejectNonManager() (gas: 296274)\n[PASS] test_buysSellsExactInputAndOutputPaintInOrder() (gas: 24570673)\n[PASS] test_disabledCallbacksRejectManager() (gas: 243861)\n[PASS] test_failedSettlementRollsBackPaint() (gas: 631692)\n[PASS] test_fullCanvasRenderGasAndURI() (gas: 188380105)\nLogs:\n  Full canvas render gas: 4468661\n\n[PASS] test_initializationAndEmptyCanvas() (gas: 492264)\n[PASS] test_minimumQuoteDelta() (gas: 113464)\n[PASS] test_noHookFeeComparedWithIdenticalControlPool() (gas: 2624867)\n[PASS] test_painterIsOriginNotRouterOrSender() (gas: 217758)\n[PASS] test_paletteAndBounds() (gas: 104947)\n[PASS] test_partialFillShadesActualDelta() (gas: 211961)\n[PASS] test_quoteThresholdsOnRealSwaps() (gas: 2290442)\n[PASS] test_rejectsRepeatedCallbackAndWrongPool() (gas: 84068)\n[PASS] test_rejectsSecondPoolThroughManager() (gas: 75122)\n[PASS] test_secondPassRepaintsOnlyFirstTwoPixels() (gas: 138454762)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 278.35ms (480.92ms CPU time)\n\nRan 4 test suites in 279.25ms (739.47ms CPU time): 48 tests passed, 0 failed, 0 skipped (48 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PixelPoolHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PixelPoolHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"PixelToken.approve(address,uint256)\",\"PixelToken.transfer(address,uint256)\",\"PixelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"LICENSE\":21,\"README.md\":80,\"dependencies.lock.json\":20,\"docs/DEPENDENCIES.md\":11,\"foundry.toml\":18,\"launch.json\":20,\"remappings.txt\":3,\"src/HookFlags.sol\":31,\"src/PixelPoolHook.sol\":184,\"src/PixelRenderer.sol\":101,\"src/PixelToken.sol\":56,\"test/Deployment.t.sol\":125,\"test/PixelPoolHook.t.sol\":345,\"test/PixelToken.t.sol\":93,\"test/helpers/HookDeployment.sol\":25,\"test/helpers/PoolRouter.sol\":92,\"test/mocks/MockERC20.sol\":19},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1060,"exitCode":0,"name":"slither","output":"[medium/medium] divide-before-multiply at src/PixelRenderer.sol:82: PixelRenderer.uri(bytes) (src/PixelRenderer.sol#82-100) performs a multiplication on the result of a division:","passed":true},{"durationMs":352,"exitCode":0,"name":"aderyn","output":"[high] unsafe-casting at src/PixelPoolHook.sol:95: Unsafe Casting of integers\n[low] empty-require-revert at src/PixelRenderer.sol:62: Empty `require()` / `revert()` Statement\n[low] internal-function-used-once at src/HookFlags.sol:24: Internal Function Used Only Once (2 places)\n[low] large-numeric-literal at src/PixelToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/PixelPoolHook.sol:69: Literal Instead of Constant (32 places)\n[low] missing-inheritance at src/PixelToken.sol:5: Missing Inheritance\n[low] require-revert-in-loop at src/PixelRenderer.sol:28: Loop Contains `require`/`revert` (2 places)\n[low] state-change-without-event at src/PixelPoolHook.sol:50: State Change Without Event\n[low] uninitialized-local-variable at src/PixelRenderer.sol:28: Uninitialized Local Variable (3 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: pool.initialPrice: Invalid input: expected string, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"b6ec023adf6b8896f36253304ab8e59cec83b7ca324000dd9e76f81e2e7269e0","verifiedTreeHash":"cacbf19d09b0d41423520b46d950475ba5fd07ae","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":1882,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.76s\nCompiler run successful!\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n  ╭▸ src/PixelCanvas.sol:9:20\n  │\n9 │         if (i > 8) revert IndexOutOfBounds();\n  │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n  │\n  ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelCanvas.sol:39:21\n   │\n39 │                 if (uint8(words[i >> 5] >> ((i & 31) * 8)) != color) continue;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/PixelCanvas.sol:66:54\n   │\n66 │         bytes memory out = new bytes(prefix.length + 4 * ((data.length + 2) / 3));\n   │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/PixelCanvas.sol:68:25\n   │\n68 │         for (uint256 i; i < data.length; i += 3) {\n   │                         ━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelCanvas.sol:74:80\n   │\n74 │             out[cursor++] = i + 1 < data.length ? alphabet[(word >> 6) & 63] : bytes1(\"=\");\n   │                                                                                ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelCanvas.sol:75:73\n   │\n75 │             out[cursor++] = i + 2 < data.length ? alphabet[word & 63] : bytes1(\"=\");\n   │                                                                         ━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes1' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelCanvas.sol:96:32\n   │\n96 │             out[--at] = bytes1(uint8(48 + value % 10));\n   │                                ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:68:26\n   │\n68 │         uint256 amount = uint256(quote < 0 ? -quote : quote);\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:87:16\n   │\n87 │         return uint8(pixels[i >> 5] >> ((i & 31) * 8));\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PixelPoolHook.sol:95:48\n   │\n95 │                 result[slot * 32 + j] = bytes1(uint8(word >> (j * 8)));\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":538,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/PixelPoolToken.t.sol:PixelPoolTokenTest\n[PASS] testFuzz_transfersConserveSupply(uint256) (runs: 256, μ: 159247, ~: 159263)\n[PASS] test_allowanceConsumptionAndInfiniteApproval() (gas: 303182)\n[PASS] test_invalidTransferRollsBackAllowance() (gas: 235704)\n[PASS] test_metadataAndFixedSupply() (gas: 36682)\n[PASS] test_noAdminMintOrUpgradeSurface() (gas: 481863)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.50ms (4.88ms CPU time)\n\nRan 20 tests for test/PixelPoolHook.t.sol:PixelPoolHookTest\n[PASS] testFuzz_signedQuoteExtremesAndZeroReturnDelta(int128,bool,bool) (runs: 256, μ: 100005, ~: 100011)\n[PASS] test_allTenCallbacksAuthenticateAndDisabledOnesRefuseManager() (gas: 504525)\n[PASS] test_cannotInitializeSecondPoolAndOriginalStillWorks() (gas: 261893)\n[PASS] test_constructorRejectsWrongAddressPermissions() (gas: 14350)\n[PASS] test_failedSwapRollsBackPaint() (gas: 388799)\n[PASS] test_hookHoldsNoFundsClaimsOrDeltasAndOtherActionsDoNotPaint() (gas: 1281797)\n[PASS] test_initializationAndPermissions() (gas: 571442)\n[PASS] test_invalidInitializeRollsBackPoolBinding() (gas: 852512)\n[PASS] test_launchOpeningPricesBothOrderings() (gas: 2021243)\n[PASS] test_minimumSignedAmountDoesNotOverflow() (gas: 98576)\n[PASS] test_nativeQuote() (gas: 1332828)\n[PASS] test_painterIsTransactionOriginNotRouter() (gas: 208339)\n[PASS] test_partialFillUsesDeltaRatherThanRequestedAmount() (gas: 203612)\n[PASS] test_realSwapsBothOrderingsAndBothExactnessModes() (gas: 1378588)\n[PASS] test_rowMajorPackingAndSecondPassRepaintOnlyFirstTwo() (gas: 36393558)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 1923362)\n[PASS] test_sequenceHasNoGapsAcrossStorageWords() (gas: 17458269)\n[PASS] test_shadeBoundariesUseActualQuoteDelta() (gas: 4064770)\n[PASS] test_viewsRejectOutOfRange() (gas: 27478)\n[PASS] test_wrongPoolAndUninitializedPoolRefused() (gas: 735092)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 183.20ms (107.65ms CPU time)\n\nRan 6 tests for test/PixelCanvas.t.sol:PixelCanvasTest\n[PASS] testFuzz_base64MatchesIndependentEncoder(bytes) (runs: 256, μ: 32716, ~: 25449)\n[PASS] test_base64PaddingVectors() (gas: 14442)\n[PASS] test_exactPaletteAndEmptySvg() (gas: 383171374)\n[PASS] test_fullCanvasRenderBelow15MillionGasAndExactGeometry() (gas: 269759043)\nLogs:\n  full canvas render gas: 4934053\n\n[PASS] test_rendererMaximumCounterCapacity() (gas: 21308009)\n[PASS] test_repaintedSvgAndUri() (gas: 70739346)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 453.20ms (702.33ms CPU time)\n\nRan 3 test suites in 454.28ms (640.89ms CPU time): 31 tests passed, 0 failed, 0 skipped (31 total tests)\n","passed":true},{"durationMs":44,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PixelPoolHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PixelPoolHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"PixelPoolToken.approve(address,uint256)\",\"PixelPoolToken.transfer(address,uint256)\",\"PixelPoolToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":108,\"foundry.toml\":18,\"launch.json\":59,\"remappings.txt\":3,\"script/prepare_launch.py\":56,\"src/HookFlags.sol\":31,\"src/PixelCanvas.sol\":100,\"src/PixelPoolHook.sol\":183,\"src/PixelPoolToken.sol\":55,\"test/PixelCanvas.t.sol\":110,\"test/PixelPoolHook.t.sol\":314,\"test/PixelPoolToken.t.sol\":100,\"test/helpers/PoolFixture.sol\":145,\"test/launch_manifest_test.py\":59,\"test/mocks/MockERC20.sol\":47},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":961,"exitCode":0,"name":"slither","output":"[medium/medium] divide-before-multiply at src/PixelCanvas.sol:63: PixelCanvas.uri(bytes) (src/PixelCanvas.sol#63-78) performs a multiplication on the result of a division:","passed":true},{"durationMs":301,"exitCode":0,"name":"aderyn","output":"[low] internal-function-used-once at src/HookFlags.sol:24: Internal Function Used Only Once (3 places)\n[low] large-numeric-literal at src/PixelPoolToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/PixelCanvas.sol:9: Literal Instead of Constant (34 places)\n[low] missing-inheritance at src/PixelPoolToken.sol:5: Missing Inheritance\n[low] require-revert-in-loop at src/PixelCanvas.sol:31: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PixelPoolHook.sol:50: State Change Without Event\n[low] uninitialized-local-variable at src/PixelCanvas.sol:34: Uninitialized Local Variable (2 places)\n[low] unused-public-function at src/PixelPoolHook.sol:85: Public Function Not Used Internally","passed":true}],"detail":"launch.json is not a valid launch manifest: kind: Invalid discriminator value. Expected 'univ4_hook' | 'evm_project' | 'custom_token' | 'evm_contracts'","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"fc28c67b33aa7613299e71ab8cce6d6efa1b205bfcab55994a190d416ebd7752","verifiedTreeHash":"524fb5dd647f2e6a10a6f77c07a25e86bf9932c3","verifierVersion":"0.1.0+ad90ce4c"}]}