Introduction
Console powered by $ADHD: an onchain gaming console for Ethereans.
Console is a world-computer game console on Ethereum. Ethereans are the players. Cartridges are the games.
What is Console?
Console is an onchain platform where fully onchain NFT identities (Ethereans) slot in token cartridges and play tiny coordination games. Each cartridge defines a transparent distribution method tied to real human effort, not DeFi mechanics or capital size.
$ADHD serves as the universal game credits powering the console. You insert $ADHD to play, and as you consume your credits they are burned.
What are Ethereans?
Ethereans are fully onchain 40x40 pixel art PFPs on Ethereum. Each one is linked to an X (Twitter) handle and comes with its own ERC-6551 Token Bound Account (TBA), a smart contract wallet owned by the NFT itself. Your Etherean is your onchain self: it receives tokens, plays games, and represents you across the Console ecosystem.
Minting is gasless. Users never connect a wallet. A protocol relayer handles everything, funded by the $ADHD treasury. Your Etherean's TBA holds your $ADHD credits.
What are Cartridges?
Cartridges are tiny onchain games that distribute tokens through fun, human coordination. Anyone can build a cartridge, but they are curated carefully and released slowly. A cartridge does not have to launch its own token. More commonly, users bring their own tokens at whatever amounts they like, and the cartridge handles how they get distributed.
When you slot a cartridge into Console, it boots a new onchain game. Your Etherean's TBA earns tokens based on what you do, both onchain and offchain. The function of these games is distributing tokens and attracting communities of people drawn to them.
The Rules
-
>
Every cartridge must be explainable in one or two sentences and playable in under a minute per session.
-
>
Every cartridge must have a clear "this is what we reward humans for doing" (be real, curate, fund, maintain, host).
-
>
Distribution must be transparently tied to that behavior, not hidden math or capital size.
The Vision
Console turns coordination into capital and culture into tokens. Each cartridge bootstraps a new community aligned around a clear behavior. Over time, the ecosystem forms a lattice of communities that all came from human coordination rituals. New kinds of DAOs. New ways to distribute.
Console powered by $ADHD: a world-computer game console for Ethereans. Drop in a cartridge, play a tiny onchain game, and your coordination decides how tokens get distributed.
Overview
Fully onchain 40x40 pixel art PFPs on Ethereum.
Ethereans are fully onchain 40x40 pixel art PFPs on Ethereum. Each Etherean is linked to an X (Twitter) handle and comes with its own ERC-6551 Token Bound Account (TBA), a smart contract wallet owned by the NFT itself.
Key Properties
-
>
Fully onchain SVG: no IPFS, no external dependencies. The pixel data is stored directly in the contract and rendered as SVG at tokenURI time.
-
>
4-color palette system: 8 named palettes inspired by the Game Boy color space (classic, pink, ocean, amber, grayscale, lavender, crimson, mint).
-
>
Gasless minting: users never connect a wallet. A protocol relayer pays gas, funded by the $ADHD treasury.
-
>
ERC-6551 TBA: every token gets a deterministic Token Bound Account created atomically during mint.
-
>
One per handle: each X handle can only mint once (enforced onchain via case-insensitive hash). X user IDs are stored onchain for post-mint analytics and potential airdrop blacklisting.
Current Status
Live on Sepolia testnet. Smart contract, backend, and frontend audit in progress. Mainnet deployment planned after audit completion.
Architecture
End-to-end system design: browser to blockchain.
System Diagram
Key Design Decisions
- No wallet connection required. Users provide a receive address manually.
- EIP-712 typed data signatures bind the verifier attestation to the exact mint parameters (handle, to, svgData, palette, nonce, expiry).
- Separate relayer and verifier keys. The relayer is a funded EOA that submits transactions. The verifier is a separate EOA that signs attestations. These are different keys for security.
- ENS resolution happens client-side via the ensdata.net public API.
Smart Contract
Etherean.sol and SVGRenderer.sol on Ethereum.
Etherean.sol
| Standard | ERC-721 (OpenZeppelin) |
| Chain | Ethereum (Sepolia testnet, Mainnet planned) |
| Compiler | Solidity ^0.8.24 |
| Framework | Foundry (Forge) |
| Symbol | ETRN |
Constructor Parameters
| Parameter | Description |
|---|---|
owner_ | Admin address (can update relayer/verifier) |
relayer_ | Address authorized to call mint() |
verifier_ | Address whose EIP-712 signatures are trusted |
tbaImplementation | ERC-6551 account implementation address |
erc6551Registry | Canonical registry (defaults to 0x000000006551c19487814612e58FE06813775758 if zero) |
Mint Function
function mint(
address to,
string calldata handle,
bytes calldata svgData,
string calldata palette,
bytes32 nonce,
uint256 expiry,
bytes calldata signature
) external onlyRelayer returns (uint256 tokenId, address tba)
Mint Flow (7 Steps)
- Check expiry timestamp
- Check and consume nonce (prevents replay)
- Derive case-insensitive handle hash
- Enforce handle uniqueness
- Verify EIP-712 signature against verifier
- Validate svgData is exactly 400 bytes
- Mint ERC-721 token, store data, create ERC-6551 TBA
EIP-712 Domain
name: "Etherean"
version: "1"
chainId: (current chain)
verifyingContract: (contract address)
EIP-712 Mint Type
Mint(string handle, address to, bytes svgData, string palette, bytes32 nonce, uint256 expiry)
View Functions
| Function | Returns |
|---|---|
totalSupply() | Current token count |
getTokenByHandle(string) | tokenId for a handle (case-insensitive) |
getHandle(uint256) | Original handle string |
getSVGData(uint256) | Raw 400-byte pixel data |
getTBA(uint256) | Deterministic TBA address |
tokenURI(uint256) | Fully onchain data URI with JSON metadata and base64 SVG |
Admin Functions (onlyOwner)
setRelayer(address): update the relayer addresssetVerifier(address): update the verifier addresstransferOwnership(address): transfer contract ownership (inherited from OpenZeppelin Ownable). Recommended: transfer to a hardware wallet before mainnet.
Custom Errors
HandleAlreadyMinted InvalidSignature ExpiredSignature NonceAlreadyUsed InvalidSVGData OnlyRelayer ZeroAddress
SVGRenderer.sol
A pure library that:
- Unpacks 400 bytes of 2-bit packed pixel data (1,600 pixels total)
- Resolves palette colors from a string key (8 palettes hardcoded)
- Renders a complete SVG document with 1,600 rect elements
- Uses assembly-backed buffer writes for gas efficiency
Bit Layout
Pixel index i is in byte i/4, at bit-offset (3 - (i % 4)) * 2 (MSB first).
Token Metadata Format
The tokenURI returns a base64-encoded JSON object:
{
"name": "Etherean #1",
"description": "Fully onchain 40x40 pixel PFP on Ethereum. @handle",
"image": "data:image/svg+xml;base64,...",
"attributes": [
{ "trait_type": "Handle", "value": "gami_vc" },
{ "trait_type": "Palette", "value": "classic" }
]
}
API
Cloudflare Worker endpoints for verification and minting.
API is served from a Cloudflare Worker. Contact the team for the endpoint.
POST /api/verify
Searches X for a verification tweet containing the nonce. The user's tweet must contain all three of: the nonce string, the word "Etherean", and "@gami_vc".
Request
{
"handle": "gami_vc",
"nonce": "A7K2F9"
}
Response (success)
{
"verified": true,
"handle": "gami_vc",
"nonce": "A7K2F9",
"expiry": 1709312400,
"verifyProof": "...",
"message": "Verified! Ready to mint."
}
Response (failure)
{
"verified": false,
"message": "Tweet not found. Please post the tweet and try again."
}
Rate-limited per IP. Returns 429 with Retry-After header if exceeded.
POST /api/mint
Validates the attestation and submits the mint transaction to the blockchain.
Request
{
"handle": "gami_vc",
"to": "0x1234...abcd",
"svgData": "0x...",
"palette": "classic",
"expiry": 1709312400,
"nonce": "A7K2F9"
}
Response (success)
{
"success": true,
"tokenId": 42,
"txHash": "0xdef...",
"tba": "0x789...",
"etherscanUrl": "https://etherscan.io/tx/0xdef..."
}
Attestation expiry: mint must be completed within a short time window after verification.
GET /health
{ "status": "ok", "service": "ethereans-api" }
Frontend
Client-side application hosted on Cloudflare Pages.
console.gami.vc (Cloudflare Pages)
Overview
The frontend is a static site with no build step, served via Cloudflare Pages. It handles image generation, palette selection, Twitter verification, and the mint flow.
Pixel Art Pipeline
- Load image (via unavatar.io for X PFPs, DiceBear fallback, or file upload)
- Downsample to 40x40 with bilinear interpolation (center crop to square)
- Convert to grayscale using ITU-R BT.601 luminance
- Quantize to 4 levels using threshold quantization (dithering disabled by default)
- Render to canvas at display scale (8x) and generate SVG string
2bpp Packing
Packs 1,600 palette indices (each 0-3) into 400 bytes. Bit layout per byte (MSB first):
[ px0 | px1 | px2 | px3 ]
7-6 5-4 3-2 1-0
Output: "0x" + 800 hex digits = 802 chars total.
ENS Resolution
Uses the ensdata.net public API. If the wallet input matches an ENS pattern (word.tld), resolves to a 0x address before submitting the mint request. Shows "Resolving ENS..." spinner during resolution.
Mint Flow
- User enters X handle, generates pixel art preview
- User selects palette and enters receive address (0x or ENS)
- Verification section appears: user posts a tweet containing a 6-char nonce
- User clicks "I've Posted It", frontend calls POST /api/verify
- On success, mint button enables. User clicks "Mint to Ethereum"
- Frontend packs pixel data, calls POST /api/mint
- Progress steps animate: Encoding SVG, Packing data, Minting, Creating TBA, Done
- Result shows tx hash with Etherscan link
Palettes
8 named palettes, each with 4 colors from darkest to lightest. Hardcoded in both the frontend (engine.js) and the contract (SVGRenderer.sol).
Full Reference Table
| Key | Name | Color 0 | Color 1 | Color 2 | Color 3 |
|---|---|---|---|---|---|
classic | Classic Green | #0f380f | #306230 | #8bac0f | #9bbc0f |
pink | Pink Dream | #2b0f38 | #6b2070 | #c060a0 | #f0a0d0 |
ocean | Ocean Blue | #0a1628 | #1a3a5c | #4a8ab0 | #8ac4e0 |
amber | Amber Gold | #1a1000 | #4a3000 | #b08020 | #e8c060 |
grayscale | Grayscale | #1a1a1a | #555555 | #aaaaaa | #e0e0e0 |
lavender | Lavender | #1a0a2e | #3d1f6d | #8b5ec7 | #c9a0f0 |
crimson | Crimson | #2a0a0a | #6b1a1a | #c04040 | #f08080 |
mint | Mint | #0a2a1a | #1a5a3a | #40b070 | #80e0a0 |
Deployed Addresses
Contract addresses and service URLs across networks.
Sepolia Testnet Current
| Contract / Service | Address / URL |
|---|---|
| Etherean.sol | 0x758C6Fa35af696B0472D30A05F830c70Ca231aeD |
| ERC-6551 Registry | 0x000000006551c19487814612e58FE06813775758 (canonical) |
| TBA Implementation | 0x41C8f39463A868d3A88af00cd0fe7102F30E44eC (Tokenbound V3) |
| Frontend | console.gami.vc |
Mainnet Planned
| Contract / Service | Address / URL |
|---|---|
| Etherean.sol | TBD |
| All other addresses | TBD after deployment |
Mainnet Checklist
Items required before mainnet deployment.
-
01
Smart contract audit In Progress
External audit currently reviewing smart contract, backend, and frontend.
-
02
Contract verification on Etherscan Pending
Verify contract source code on Etherscan for transparency.
-
03
Mainnet deployment Pending
Deploy contracts to Ethereum mainnet after audit completion.
Security Considerations
Threat model and mitigation strategies.
- Immutable contract: no proxy, no upgradeability. If a critical bug is found, a new contract must be deployed.
- Permissioned minting: only the relayer can call mint(), and every mint requires an EIP-712 signature from the verifier.
- Separate keys: relayer and verifier use different EOAs. Compromise of one alone cannot mint.
- Nonce replay protection: each nonce can only be used once (mapping in contract).
- Expiry window: attestations expire within a short time window.
- Handle uniqueness: enforced onchain via keccak256 of lowercased handle.
- Rate limiting: API endpoints are rate-limited per IP.
- No wallet connection: users never expose their private keys to the frontend. They provide a receive address only.
Repository
Source code structure and organization.
Private repository. Access is granted to auditors and contributors.
High-Level Structure
The project is organized into three main areas:
- Frontend: static HTML, CSS, and JavaScript served via Cloudflare Pages.
- API: Cloudflare Worker handling verification and minting.
- Contracts: Solidity smart contracts built with Foundry.
Source Code
The repository is private. See GitHub for the latest changes.
Cartridges
Tiny onchain games that distribute tokens through human coordination.
Cartridge documentation is in development. The first cartridge, Game of $GNAR by Gnars DAO, is currently being designed.
What to Expect
Each cartridge will have its own documentation covering:
- Game mechanics and rules
- Token details (if applicable), distribution method, treasury
- Smart contract addresses
- How to play
First Cartridge: Game of $GNAR
Gnars Numerical Assessment of Radness by the Global Network for Attested Reality Systems. An incentive to create verified media at scale, rewarding people who consistently prove they're real and add culture.