{"id":"bbfc18fc-1431-4767-a891-3e6fb7ae5b3b","objective":"Release Pixel Wall (ERC-20 symbol PIXL) on Sepolia as an evm_project: the fixed-supply launch token plus one application contract. Token: Pixel Wall (PIXL), total supply 1,000,000,000 PIXL with 18 decimals, minted once to the deployer. Application contract: PixelCanvas. Currency: PIXL is the app's working currency. PixelCanvas takes the PIXL address as its only constructor argument (constructorArgs [\"$token\"]), stores it immutable, exposes it as token(), and holds no PIXL at deploy; players get PIXL by swapping Sepolia ETH in the launch pool the factory seeds. Every payment in is approve + SafeERC20.safeTransferFrom (permit not required). PixelCanvas has no payable function and no receive/fallback, so it never holds ETH. Payouts are pull-based (the recipient calls to collect; nothing is pushed to third parties), follow checks-effects-interactions and are nonReentrant. Burns are transfers to 0x000000000000000000000000000000000000dEaD. No owner, admin, pause or upgrade path. A 32x32 shared canvas paid in PIXL. Pixels: index = y * 32 + x with x, y in 0..31; any other index reverts. A colour is a uint24 0xRRGGBB; the canvas starts all 0x000000. Colours are stored packed and canvas() returns all 1,024 colours in one call as bytes of length 3,072 (3 bytes per pixel, index order). Price: every pixel has its own price, starting at 10 PIXL (10 * 10^18 base units). paint(index, colour) charges the pixel's current price; afterwards that pixel's price becomes floor(old * 11 / 10), capped at 1,000,000 PIXL. paintBatch(indices, colours) paints up to 64 pixels with one safeTransferFrom of the summed cost; mismatched lengths, an empty batch or more than 64 entries revert; a repeated index in one batch is processed in order, each at its then-current price. Split: the first paint of a pixel burns 100% of the price; a repaint credits floor(price / 2) to the previous painter's withdrawable balance and burns the rest in the same call. Repainting your own pixel is allowed (you are credited half, the rest burns). withdraw() pays the caller's whole withdrawable balance and reverts on zero. Views: canvas(), priceOf(index), painterOf(index), withdrawable(address), token(). Events: Painted(index, colour, painter, price), Withdrawn(account, amount). Tests (Foundry) must cover: price growth and the 1,000,000 PIXL cap; the first-paint vs repaint split with odd prices; batch limits and a repeated index; out-of-range index reverts; withdraw of zero reverts and cannot pay twice; and the invariant that PIXL held by PixelCanvas always equals the sum of withdrawable balances (the rest was burned at paint time). The independent adversarial review must attack: rounding in the 50/50 split and the 10% step, the price-cap boundary, batch cost arithmetic (a batch must never cost less than the same paints one by one), and reentrancy or griefing through withdraw. Deploy through the project factory, then publish a one-page website to draw the live canvas from canvas() and Painted events, pick a colour, queue up to 64 pixels and show the total cost before painting. The page reads the PIXL address from PixelCanvas.token(), shows the connected wallet's PIXL balance, allowance and withdrawable balance, has an Approve step before every paying action and a Withdraw button, and says that PIXL comes from swapping Sepolia ETH in the launch pool (no in-page swap). Lists come from contract views and events only (no backend, no indexer). Keep it to one small page; the static export has index.html in dist/.","status":"completed","waitingForHosting":false,"failure":null,"chainId":11155111,"createdAt":"2026-09-27T05:08:17.792Z","updatedAt":"2026-09-27T18:53:39.132Z","contracts":{"id":"48fdb771-69d6-4f52-9dd9-e066a8ef5cf2","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-230-pixelcanvas","commit":"47402819880637849506a175967fa00aa1ba91a6"},"frontend":{"id":"959b62c5-9e80-4b76-b612-bf255a24d7ad","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-306-workflow-frontend-stage-context","commit":"930316b9bc03164997aa35c3ea7bddabc025725c"},"frontendPlan":{"skill":"frontend-for-contract","objective":"One static page, no framework beyond what the skill needs, reading the live deployment's ABI and address. Approve PIXL before paying; show PIXL balance and allowance and the withdrawable balance.","acceptanceCriteria":[]},"launch":{"id":"0ac37315-248f-49a3-b0ae-6087acd07c31","status":"live"},"validation":{"status":"passed","attempts":3,"startedAt":"2026-09-27T17:37:02.811Z","deadlineAt":"2026-09-28T17:37:02.811Z","nextAttemptAt":null,"report":{"scope":"Read-only HTTP checks of the named and immutable entrypoints, declared static asset hashes and HTML references, published deployment configuration and ABI hashes, and operator-RPC chain/code existence. Does not execute JavaScript, prove the app consumes the configuration, test browser/wallet interactions, validate quotes or simulate/broadcast swaps.","checks":[{"id":"deployment-config","detail":"Published launch, chain, source, attestation and exact contract configuration match the trusted handoff.","status":"passed"},{"id":"static-assets","detail":"All 6 declared assets are reachable and match their SHA-256 digests.","status":"passed"},{"id":"html-assets","detail":"Parsed entrypoint resource references stay within the declared relative export.","status":"passed"},{"id":"named-entrypoint","detail":"The named site's index is reachable and matches the immutable IPFS index byte for byte.","status":"passed"},{"id":"named-assets","detail":"The named site's HTML resources, deployment configuration and ABIs are reachable and match the immutable export.","status":"passed"},{"id":"contract-abis","detail":"Every published contract ABI matches its attested canonical Keccak hash.","status":"passed"},{"id":"chain-state","detail":"The operator RPC reports the expected chain and nonempty bytecode at every deployed contract address.","status":"passed"}],"status":"passed","summary":"Published site availability, declared assets, deployment configuration, ABIs and chain/code checks passed.","version":1,"checkedAt":"2026-09-27T18:53:28.921Z","retryable":false}},"brief":"# Approved workflow\n\nRelease Pixel Wall (ERC-20 symbol PIXL) on Sepolia as an evm_project: the fixed-supply launch token plus one application contract. Token: Pixel Wall (PIXL), total supply 1,000,000,000 PIXL with 18 decimals, minted once to the deployer. Application contract: PixelCanvas. Currency: PIXL is the app's working currency. PixelCanvas takes the PIXL address as its only constructor argument (constructorArgs [\"$token\"]), stores it immutable, exposes it as token(), and holds no PIXL at deploy; players get PIXL by swapping Sepolia ETH in the launch pool the factory seeds. Every payment in is approve + SafeERC20.safeTransferFrom (permit not required). PixelCanvas has no payable function and no receive/fallback, so it never holds ETH. Payouts are pull-based (the recipient calls to collect; nothing is pushed to third parties), follow checks-effects-interactions and are nonReentrant. Burns are transfers to 0x000000000000000000000000000000000000dEaD. No owner, admin, pause or upgrade path. A 32x32 shared canvas paid in PIXL. Pixels: index = y * 32 + x with x, y in 0..31; any other index reverts. A colour is a uint24 0xRRGGBB; the canvas starts all 0x000000. Colours are stored packed and canvas() returns all 1,024 colours in one call as bytes of length 3,072 (3 bytes per pixel, index order). Price: every pixel has its own price, starting at 10 PIXL (10 * 10^18 base units). paint(index, colour) charges the pixel's current price; afterwards that pixel's price becomes floor(old * 11 / 10), capped at 1,000,000 PIXL. paintBatch(indices, colours) paints up to 64 pixels with one safeTransferFrom of the summed cost; mismatched lengths, an empty batch or more than 64 entries revert; a repeated index in one batch is processed in order, each at its then-current price. Split: the first paint of a pixel burns 100% of the price; a repaint credits floor(price / 2) to the previous painter's withdrawable balance and burns the rest in the same call. Repainting your own pixel is allowed (you are credited half, the rest burns). withdraw() pays the caller's whole withdrawable balance and reverts on zero. Views: canvas(), priceOf(index), painterOf(index), withdrawable(address), token(). Events: Painted(index, colour, painter, price), Withdrawn(account, amount). Tests (Foundry) must cover: price growth and the 1,000,000 PIXL cap; the first-paint vs repaint split with odd prices; batch limits and a repeated index; out-of-range index reverts; withdraw of zero reverts and cannot pay twice; and the invariant that PIXL held by PixelCanvas always equals the sum of withdrawable balances (the rest was burned at paint time). The independent adversarial review must attack: rounding in the 50/50 split and the 10% step, the price-cap boundary, batch cost arithmetic (a batch must never cost less than the same paints one by one), and reentrancy or griefing through withdraw. Deploy through the project factory, then publish a one-page website to draw the live canvas from canvas() and Painted events, pick a colour, queue up to 64 pixels and show the total cost before painting. The page reads the PIXL address from PixelCanvas.token(), shows the connected wallet's PIXL balance, allowance and withdrawable balance, has an Approve step before every paying action and a Withdraw button, and says that PIXL comes from swapping Sepolia ETH in the launch pool (no in-page swap). Lists come from contract views and events only (no backend, no indexer). Keep it to one small page; the static export has index.html in dist/.\n\nSepolia (11155111) only. GitHub publication and IPFS hosting are approved. Launch token: a separate fixed-supply ERC-20, 18 decimals, no constructor arguments, exactly 1,000,000,000 minted to msg.sender, no mint or admin functions. The factory sends that supply to LP and rewards, so no application contract may need a launch-token balance at deploy. Application contracts are fully configured in nonpayable constructors using only address, uint, bool or bytes32 arguments (no strings, arrays, proxies, delegatecall or selfdestruct); anything else is set at runtime. No owner unless the request names one, and then it is $owner. No external oracles, VRF or keepers: randomness is commit-reveal or a future blockhash read within 256 blocks with a refund path. foundry.toml sets bytecode_hash = \"none\". The website is a static export with index.html in dist/. Site label lab-pixel-canvas.\n\nBuild PIXL and PixelCanvas (PixelCanvas takes constructorArgs [\"$token\"] and charges PIXL) with Foundry tests and an independent adversarial review, deploy them through the project factory, then build the one-page website against the live deployment.\n","handoff":{"chainId":11155111,"repoUrl":"https://github.com/identity-md-launches/launch-230-pixelcanvas","version":1,"launchId":"0ac37315-248f-49a3-b0ae-6087acd07c31","manifest":{"kind":"evm_project","pool":{"fee":3000,"tickSpacing":60,"initialPrice":"79228162514264337593543950336","pairedCurrency":"0x0000000000000000000000000000000000000000"},"notes":"Pixel Wall is intended for Sepolia. Deploy src/LaunchToken.sol:LaunchToken with no constructor arguments, then src/PixelCanvas.sol:PixelCanvas with the launch token address. PixelCanvas stores that address immutably, requires no initial token balance or initialization calls, and has no owner or admin role. Players obtain PIXL through the native ETH launch pool and approve PixelCanvas before painting; repaint credits are collected through withdraw(). The pool has no hook. initialPrice is decimal sqrtPriceX96; the deployer derives the effective opening price from the pinned policy when it specifies initialMarketCapWei. The factory supplies liquidity and MerkleDistributor. Policy and signed artifact linkage are supplied by services.","token":{"name":"Pixel Wall","symbol":"PIXL","contract":"LaunchToken","decimals":18},"contracts":[{"contract":"PixelCanvas","constructorArgs":["$token"]}]},"contracts":[{"name":"LaunchToken","txHash":"0x6833ca4c024d5ccff69aa1ce00576bbe6259e13f43dbf65ee857f4b63b92c6e0","abiHash":"38880b8e56d42ce900f744a7908c7139632a49f1c3f33385c64ceaed29d37bee","address":"0xeb31f50280793b2825a940b37b4294d86b0909d3","blockNumber":11791250,"creationCodeHash":"540eda67f138b76a5949b31d879019d662025a76f34a73a5b742b03fb2a2cfba"},{"name":"PixelCanvas","txHash":"0x6833ca4c024d5ccff69aa1ce00576bbe6259e13f43dbf65ee857f4b63b92c6e0","abiHash":"c8f37b334893c8a6e960024b2b2d3937fd607d59c99fd10a898e167bfb762804","address":"0xfa3c90364d4e74afae464512d80b5602447a3cc3","blockNumber":11791250,"creationCodeHash":"7a96f74aa41278018b268fa27e26b7cc18c319730d9018a5883697b928513faf"}],"sourceCommit":"47402819880637849506a175967fa00aa1ba91a6","abiInstructions":"Build ABIs from this exact source commit; compare canonicalKeccak(abi) with abiHash. Verify deployed code on the stated chain before enabling transactions.","attestationHash":"202907f2ab2191368dfd103fbff9a2734e10ad6cba6803975c5804b93a2d6eb6"},"site":{"status":"named","cid":"bafybeifaewgfis2w6ywgmdn3s45tn2dsiltgki4rdg7mmabrhsmebfarne","ensName":"lab-pixel-canvas.site.identitymd.eth","ensParent":null,"failure":null}}