Lattice Studio
Compose, check and deploy EIP-2535 diamonds
Created on 1st October 2026
•
Lattice Studio
Compose, check and deploy EIP-2535 diamonds
The problem Lattice Studio solves
Composing an EIP-2535 diamond by hand is error-prone. Two facets claim the same selector, inits run in the wrong order, storage namespaces overlap, or nobody ends up holding the authority to upgrade. These mistakes usually surface at deploy time or in an audit, after the expensive part is done.
Lattice Studio moves them to the moment you make them. You place facets from the Lattice library on a sheet, and every edit re-runs the full set of checks (selectors, semantics, core, dependencies, storage, inits, authority, links, network) in about 2 ms for a 30-facet diamond. Each finding names its fix. When the recipe is clean you export it as a Foundry script, an agent brief, a recipe.json or a Safe Transaction Builder batch, or deploy it in one transaction and verify it on Sourcify.
Nothing leaves your machine until you deploy: no backend, no accounts, no analytics. It works offline after first load.
What it does
- Checks a diamond on every edit, with fix commands and a console line for each finding.
- Runs the same pure core in the app, the CLI and CI, so the sheet, the exported script and the pipeline can't disagree.
lattice-studio check recipe.json --jsonhas stable exit codes. - Deploys in one transaction through LatticeFactory or CreateX, predicts the address first, compares the on-chain loupe to the plan afterwards, and verifies on Sourcify.
- When a chain doesn't have Lattice's shared contracts yet, deploys them through Arachnid's proxy at their predicted addresses.
- Exports: Foundry script (compiles on Foundry 1.8.3), agent brief, recipe JSON with schema, Safe batch, project file, share link.
How it's built
Bun monorepo. packages/core is pure TypeScript (no DOM, network, clock or randomness) and holds the analysis, cut plan, init encoding, address prediction and exporters. packages/catalog-gen builds the facet catalog from a pinned Lattice checkout after forge build. packages/cli wraps the core. apps/studio is Vite + React + React Flow, with a lazily loaded viem/wagmi chain module that is the only code that talks to a network.
Tests on the submitted code: about 3,500 unit tests, 1,650 component tests in a real browser, 481 Playwright flows, Anvil chain tests, and golden tests against Lattice's own deploy scripts. WCAG 2.2 AA is the target; axe runs on every dialog and state.
What's real and what's provisional
- Real: everything above, on Sepolia, Base Sepolia and HSKChain Testnet.
- Sepolia: diamond
0xF70f3E9D2183B4e829DB615E08551bafcE6C9755(an ERC20, "First Lattice Token", FLT), deployed from the live app through LatticeFactory0xc192cEa531C8FFb3cBE69A98f4795757E4A2c7bein tx0xc3464766712590e02e70444a0835c46dfd8db1c02cabbbd94aea440dddade969, exact match on Sourcify. The on-chain loupe returns the five facets of the plan in order. - HSKChain Testnet (chain 133): diamond
0x1BAeE0288f04931AbF3E85D7d1704203e7Bcc5e0(a GovernedVault, "Grant vault", gVLT, 14 facets), deployed from the live app in tx0x73d30461c6f0386a3ee4f8daf6f95acdfc0e6772ab3591cfe5ee97c5eae1d80e: https://testnet-explorer.hskchain.net/address/0x1BAeE0288f04931AbF3E85D7d1704203e7Bcc5e0. Studio deployed Lattice's shared contracts there first, and the factory landed at the same address as on Sepolia. The loupe answers on-chain; Sourcify verification had not completed for this address at the time of writing. - Provisional: the catalog is built from Lattice's
devbranch atf4a32c8, not a tagged release. The app and CLI say so. - New and not yet proven live: Etherscan verification alongside Sourcify, with your own API key in Settings, shipped on the last day. It is covered by tests against faked responses only.
- Not in v1: mainnet, upgrading a live diamond, smart-account recipes, the CLI on npm. WalletConnect is not configured in the hosted build; injected wallets work.
- CI on GitHub is red for known reasons that don't fail locally: no Linux screenshot baselines yet, the Foundry jobs fail building the pinned Lattice checkout on the runner, and one performance benchmark misses its budget there.
Tracks
- Application Middleware & Open-Source Tooling (primary).
- AI × Ethereum & Agent Economy: the CLI's
--jsonoutput and the agent brief export exist so coding agents and CI run the same analysis as the app. There is no AI feature inside Studio. - HSK Chain: HSKChain Testnet is a deploy target in the live app, with the diamond above deployed there.
Disclosures
- Lattice (https://github.com/dadadave80/lattice) is my own pre-existing open-source library and predates the event.
- Lattice Studio was built inside the hackathon window: first commit 2026-09-23.
- The repository was built with coding agents under my direction.
AGENTS.mdin the repo describes how.
Roadmap
Upgrades of live diamonds (v2); smart-account recipes once Lattice ships AccountFactory; a re-pin to the canonical Lattice 0.4.0 release; the CLI on npm.
Challenges I ran into
The hardest part was the UX, and it still is. A diamond is dense: one recipe here has 12 facets and 120 selectors, each with an owner, contested routes, inits in a fixed order, storage namespaces and an authority model. Showing all of that on one sheet without burying the one thing that is wrong took more iterations than any of the analysis code.
A few places where that showed up: deciding what belongs on the sheet at all (the loupe and ERC-165 facets started as ordinary cards and ended up as a fixed core cell, a change that landed on the last day); making a selector collision readable at a glance and fixable in one action; and keeping the same information usable from the keyboard alone and on a 375 px phone.
I don't consider it solved. Some surfaces were built without a design pass, a card's trace can still run behind the title block, and first load is heavier than I want. This is the part of Studio I expect to keep improving after the hackathon, with feedback from people composing real diamonds.
Tracks Applied (4)
