{"id":"fc3809bb-054e-4e98-bdc6-5044325a3236","objective":"Release Swarmlings ($LING) on Sepolia through IMD: a Unipeg-style DN404 token where every 300,000 LING held is one of 3,333 fully onchain riso-printed robots, and a Uniswap v4 hook that charges 1.25% in ETH on every swap and pays all of it to Swarmling holders. Build, test and independently review the token and hook, deploy them as a univ4_hook launch paired with ETH, then build and publish the Swarmlings website against the live deployment. Access: nobody can change anything after deployment; anyone may call distribute(); holders call claim() for their own ETH; any wallet may opt in to NFTs with setSkipNFT(false). Site pages: home with live stats, the full 3,333 collection with trait filters, a page per Swarmling, a wallet page and an about page with every address. A connected wallet can see its LING and Swarmlings, claim its ETH, enable NFTs, push waiting fees with distribute(), and follow a link to buy LING; the site does no swaps itself.","status":"blocked","waitingForHosting":false,"failure":"preflight failed: the launch needs 59602603 gas and one transaction may use at most 16777216 (EIP-7825); deploy fewer or smaller contracts","chainId":11155111,"createdAt":"2026-10-07T14:42:05.184Z","updatedAt":"2026-10-07T16:43:14.352Z","contracts":{"id":"c211c39f-5a78-42ac-a92e-3fedc56dca72","state":"completed","failure":null,"repoUrl":"https://github.com/identity-md-launches/launch-916-workflow-contract-stage-context","commit":"1f937c80fae35111f8ccf61561bdb3ef0f57058a"},"frontend":null,"frontendPlan":{"skill":"frontend-for-contract","objective":"SITE. The Swarmlings dapp, hash-routed, one static export. Visual direction is authoritative: it must look like a sibling page of imd.fun, not a template. Copy imd.fun's system exactly: IBM Plex Mono 400/500/600 bundled locally as woff2; tokens light --ink #000 --paper #fff --dim #555 --faint #999 --mute #bbb --soft #e6e6e6 --hover #f4f4f4 --ok #1f9d55 --alarm #b3261e --seg-light #cfcfcf --seg-mid #666; dark (default, toggle in header) --ink #fff --paper #000 --dim #9a9a9a --faint #666 --mute #4a4a4a --soft #262626 --hover #141414 --ok #3ecf7a --alarm #ff6b62 --seg-light #3a3a3a --seg-mid #8a8a8a; rules 1.5px solid var(--ink); labels 11px uppercase letter-spacing .06em; controls 40px tall; gutter clamp(16px,4vw,34px); square corners. Layout like imd.fun/token: boxed grids sharing 1.5px rules, a header of bordered nav boxes with the active one inverted, footer rows with arrows. Loading values are flat --soft skeleton bars, never invented numbers.\n\nPages: #/ home: one-line pitch, live stats (Swarmlings powered x/3,333, ETH paid to holders, fees waiting in the hook, LING price), three boxed cards (Hold to mint / Earn ETH / Run a seat?) and a strip of live Swarmlings. #/collection: all 3,333 ids in a grid of tiles from RENDERER, filters by each of the 7 traits and by powered/dormant, sorted by id or rarity. #/id/N: large art, traits with rarity %, owner or dormant, rewards earned. #/me: the wallet's LING, a 300,000-LING segmented meter to the next Swarmling, its Swarmlings via ownedIds, pending ETH with Claim, Enable Swarmlings via setSkipNFT(false) for code-bearing wallets, and a sell warning listing which ids power down. Distribute fees (distribute()) appears when the hook holds at least MIN_DISTRIBUTE. Get LING: show the exact LING needed and deep-link the swap to the Uniswap app for the launch pool; no in-app swap in this version. Seat claim: if api.imdnotdead.fun/launches/:id answers cross-origin, show the wallet's allocation and claim against the MerkleDistributor with its proof; otherwise link to explorer.imdnotdead.fun and say why. #/about: how it works, every address from dist/imd-deployment.json, LaunchRegistry provenance, risks in plain words.\n\nArt and logo come only from RENDERER (tokenURI, logoSVG) exactly as returned (vector SVG; never pixelated or re-encoded). Writing: short, plain, sentence case, no hype words, no emoji.","acceptanceCriteria":["Source contains no gradients, box-shadow, backdrop-filter, border-radius above 0, emoji or stock imagery; every color comes from the stated tokens in both themes","IBM Plex Mono is bundled in dist/ as woff2; the export makes no network request except the chain RPC, api.imdnotdead.fun and explorer links","Every number shown is read from chain or api.imdnotdead.fun; while loading it is a --soft skeleton bar; no placeholder or sample data anywhere","All art and the logo come from RENDERER tokenURI and logoSVG, drawn exactly as returned (vector SVG; never pixelated or re-encoded)","Each transaction button has its own pending, success and error state and stays disabled on the wrong chain, without a wallet, or when its preconditions fail","Addresses, chain and ABIs are loaded only from dist/imd-deployment.json; Vite base is ./ and routing is hash-based","No horizontal scroll at 375px or 1280px; every control is keyboard reachable with a visible focus ring; text meets WCAG AA contrast","The #/me sell warning names the ids that would power down, and code-bearing wallets see Enable Swarmlings before any NFT can appear"]},"launch":{"id":"aa97fc16-15a2-44a7-a5fc-c1f9d0e73039","status":"parked"},"validation":null,"brief":"# Approved workflow\n\nRelease Swarmlings ($LING) on Sepolia through IMD: a Unipeg-style DN404 token where every 300,000 LING held is one of 3,333 fully onchain riso-printed robots, and a Uniswap v4 hook that charges 1.25% in ETH on every swap and pays all of it to Swarmling holders. Build, test and independently review the token and hook, deploy them as a univ4_hook launch paired with ETH, then build and publish the Swarmlings website against the live deployment. Access: nobody can change anything after deployment; anyone may call distribute(); holders call claim() for their own ETH; any wallet may opt in to NFTs with setSkipNFT(false). Site pages: home with live stats, the full 3,333 collection with trait filters, a page per Swarmling, a wallet page and an about page with every address. A connected wallet can see its LING and Swarmlings, claim its ETH, enable NFTs, push waiting fees with distribute(), and follow a link to buy LING; the site does no swaps itself.\n\nSepolia only; a mainnet IMD-paired release follows if this works. GitHub publication and IPFS hosting under the site label swarmlings are approved. No owner, admin, proxy, pause or upgrade anywhere. The art renderer is already deployed by the requester and must not be rewritten. The website must follow the visual system stated in its step exactly.\n\nSPEC. Release 'Swarmlings' (LING) + SwarmlingsHook as univ4_hook on Sepolia, paired with native ETH. A Unipeg-style token: every whole 300,000 LING a wallet holds is one fully onchain Swarmling NFT (a hand-drawn risograph portrait, rendered fully onchain), minted and burned automatically by balance; the hook takes a fixed 1.25% ETH fee on every swap, all of it for NFT holders, on top of the IMD pool's own 1.25% LP fee. No owner, no admin, no proxy, no pause, no upgrade. Prior art to study, not copy: Unipeg (uPEG), Claus NFT vaults, and the ManumissionHook fee path in github.com/identity-md-launches/launch-775-ransom-for-seat-1376.\n\n1) Token Swarmlings: Solady DN404 (ERC-20 base) + DN404Mirror (ERC-721), vendored under lib/ or src/ with license. Zero-arg constructor deploys its own DN404Mirror and calls _initializeDN404 minting EXACTLY 1e27 (1,000,000,000 * 1e18) to msg.sender; 18 decimals; name \"Swarmlings\", symbol \"LING\". _unit() = 300_000e18, so at most 3,333 NFTs (the last 100,000 LING never form one). No mint after construction, no burnFrom by others, no owner, no blacklist, no fee or burn on transfer: every transfer moves exactly the amount stated. Keep DN404's default skipNFT for contracts so the factory, PoolManager, MerkleDistributor and hook never receive NFTs; any wallet may call setSkipNFT(false). If creating the mirror inside the constructor is refused by the launch floor, stop and report that blocker; do not switch to a proxy or an initializer.\n\n2) Art lives in a separate, already deployed renderer: public constant RENDERER = 0x07C6380C3Aab0208c7cDd76791530c4d2A2d389F. tokenURI(id) on the mirror returns exactly IRenderer(RENDERER).tokenURI(id) via staticcall (RENDERER also has logoSVG() for the site; the token never calls it); the token stores no art and never calls RENDERER outside tokenURI, so the renderer can never affect balances, transfers, fees or rewards. If RENDERER has no code or reverts, tokenURI returns a minimal valid data:application/json placeholder instead of reverting. Do not write, change or redeploy the renderer; treat it as a fixed external dependency and test against a mock with the same interface. For README only: the renderer is immutable with no owner, derives 7 traits (Background, Chassis, Head, Visor, Signal, Headgear, Accessory) from seed = uint256(keccak256(abi.encode(uint256 id, bytes32 SALT, uint8 nonce))) with nonce 0 except a fixed table of 21 ids, and SALT = 0x011ecad7d0b8a52e4b5e3edd97a38fa83743a5db7ab4446105af4dd40086eacd, and together they make all 3,333 ids distinct; traits are cosmetic and never change rewards. Every contract must fit EIP-170 at optimizer runs 200.\n\n4) README and NatSpec state plainly: the hook fee is 1.25% per swap in ETH and all of it goes to NFT holders, on top of the IMD pool's 1.25% LP fee (1% to the launch payer, 0.25% to IMD), 2.5% in total; no admin can change anything; traits are cosmetic, fixed per id and rendered fully onchain by the immutable RENDERER; smart-contract wallets get no NFTs unless they opt in; this Sepolia release is a test of the mechanism before an IMD-paired mainnet version.\n\nSections A-C (hook, distribution, rewards) are in the contracts and review steps; section D (tests) is in the tests step.\n","handoff":null,"site":null}