Case study 05
Admon
Turns public GitHub activity into a wallet-owned build record, minted on Monad Mainnet, without letting anyone mint someone else's work.
Problem
Anyone can claim a GitHub profile. A build record only means something if the person minting it controls that profile, and if the record can be reproduced from public data.
Product direction
Verify control first, derive traits deterministically, and keep every privileged key on the server. The wallet owns the record; the chain proves it.
My role
Sole engineer: product, contracts, mint authorisation, GitHub integration and front end.
Engineering approach
- Anyone can inspect a username, but GitHub OAuth must confirm control of the profile before a record can be created or minted.
- Public activity (commits, repositories, streaks, stars) becomes deterministic traits, persisted in PostgreSQL through Prisma.
- The server issues short-lived EIP-712 mint authorisations signed by a server-only key. The browser never holds a privileged key.
- One ERC-721 per GitHub username on Monad Mainnet (chain 143). V2, AdmonTrace, adds weekly records.
Stack and constraints
- Contracts
- SolidityOpenZeppelin ERC-721 + EIP-712Monad Mainnet · 143
- Client
- viemwagmi
- Product
- Next.js 16PrismaSupabase Postgres + StorageGitHub OAuth
- One record per username, enforced onchain.
- No private keys in the browser.
- Traits must be reproducible from public data.
Design decisions
Server-signed authorisation
EIP-712 authorisations bind a mint to a verified GitHub identity and a wallet for a short window, so impersonation fails at the contract.
Deterministic traits
Identical public input always yields an identical record, which keeps the artwork honest and verifiable.
System
Outcome and status
- V1 Genesis: verified contract 0xb6aedBF17a11928A63773F88a9CfD3E252F43a63.
- V2 Trace: 0xCc3fc8b272bca9de775ba7399E3dD7fd7a0173b0.
- Submitted to a Monad hackathon (did not win) and developed further afterwards.