Mojeeb Titilayo

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.

Hackathon submission · continued afterLiveJuly 2026

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

GitHub OAuthproves controlTraitsdeterministic · PostgresEIP-712 authserver-signed · short-livedBuilder walletviem · wagmiMonad · 143ERC-721 V1 + V2
Identity is verified before value moves: GitHub OAuth, deterministic traits, a short-lived EIP-712 authorisation, then a mint on Monad Mainnet.

Outcome and status

  • V1 Genesis: verified contract 0xb6aedBF17a11928A63773F88a9CfD3E252F43a63.
  • V2 Trace: 0xCc3fc8b272bca9de775ba7399E3dD7fd7a0173b0.
  • Submitted to a Monad hackathon (did not win) and developed further afterwards.

Sources: README and contracts/