
Enscribe
ENS invoices for freelancers. Clients pay USDC; settlement stays private on Solana.
Demo
About
Enscribe turns freelancer invoices into ENS names. Each invoice mints a subdomain under commons3nse.eth on Sepolia (for example inv-abc123.commons3nse.eth). That name is the public pay link: who it’s for, what the work was, how much is owed, and where the client should send USDC with MetaMask. The important part is what stays off ENS. The freelancer’s Solana receive address never goes on-chain in the name records. Settlement uses Aurora confidential Intents, so the client pays USDC on an EVM chain and funds route privately to Solana. Public metadata stays useful for the client; settlement stays private for the freelancer. How it works Freelancer connects MetaMask, sets a Solana wallet (Phantom or MetaMask Solana), and creates an invoice. Enscribe requests an Intents quote, mints the ENS subdomain, and generates a PDF with the pay URL. Optionally, the PDF and an encrypted profile/ledger are stored on EthSwarm (Bee). Postage batch IDs and Swarm refs stay server-side. The client opens /pay/[ens], Enscribe resolves the Sepolia name, and they pay USDC from MetaMask. Status moves pending → sent → paid. There’s a simple invoice list plus monthly accounting with CSV export. What we built ENS subdomain minting for invoices (ENSv2 Sepolia) Confidential Intents quotes and deposit addresses MetaMask client pay flow Freelancer wallet setup (EVM identity + Solana settlement) Invoice PDFs and optional encrypted Swarm storage Per-wallet encrypted Swarm feed for profile + ledger sync Payment status checks and bookkeeping export Privacy model On ENS: invoice name, client, description, amount, deposit address Off ENS: Solana settlement address, Intents route, Swarm secrets, freelancer ledger
How it's made
Enscribe is a Next.js App Router app (TypeScript on Vercel). Server routes hold the secrets; the browser is mostly MetaMask / Phantom for wallets and the pay UI. Create flow: POST /api/invoice asks Aurora Intents for a confidential quote (USDC on an EVM chain → Solana), mints inv-*.commons3nse.eth on ENSv2 Sepolia with our controller key (UserRegistry proxy + text records for amount, client, deposit address), builds a PDF with pdf-lib, optionally encrypt-uploads it to EthSwarm Bee, and returns /pay/[ens]. The Solana receive address never lands on ENS. Clients resolve the Sepolia name in-app and send USDC with MetaMask via viem. Payment status mixes Intents status with on-chain ERC-20 Transfer checks. Freelancer profile + invoice ledger sync as AES-GCM blobs on Swarm feeds, keyed by MetaMask address and gated with personal_sign. Partner stack: ENS for human-readable invoice identity, Aurora Intents so settlement stays private without putting Solana on the name, EthSwarm so PDFs and ledgers don’t need a normal app database (postage batch stays server-only). Notable hacks: talking to ENSv2 Sepolia (factory proxy, role bitmaps, PermissionedResolver multicall) instead of classic ENS registrars; dealing with Intents bridge minimums (~0.3 USDC); hard-capping Swarm upload time so a slow Bee gateway can’t take down a 30–60s ENS mint on Vercel.