Coding
PromptBeginner5 minmarkdown
Markdown Converter
Agent skill for markdown-converter
21
Ethscriptions platform on Base L2. On-chain inscriptions for names, data, and websites.
Sign in to like and favorite skills
Ethscriptions platform on Base L2. On-chain inscriptions for names, data, and websites.
Ethscriptions use transaction calldata for permanent on-chain storage:
to === from) with data: prefixed UTF-8 calldatadata:,name # Plain text name data:image/png;base64,iVBORw... # Base64 image data:text/html;base64,PCFET... # Base64 HTML data:application/json,{"key":...} # JSON data
Base Chain (calldata) → Indexer → Supabase (metadata only) ↓ API Worker → Frontend ↓ Subdomain Worker (*.basescriptions.com)
Key design: Database stores metadata only, NOT content. Content fetched from chain via RPC.
| Directory | Purpose | Deploy |
|---|---|---|
| Static site | |
| REST API (Hono) | |
| *.basescriptions.com | |
| Indexer, registration tools | |
Base URL:
https://basescriptions-api.wrapit.workers.dev
GET /content/:id # Raw content (tx hash or content hash) GET /name/:name # Check name availability GET /hash/:hash # Inscription metadata GET /recent # Recent inscriptions (?limit=&offset=) GET /owned/:address # Owned by address GET /stats # Indexer stats GET /marketplace/listings # Active listings POST /register # Register inscription POST /transfer # Record transfer
base_ethscriptions
id (text, PK) - SHA-256 hashcontent_uri (text) - NULL (content on chain)content_type (text) - MIME typecreator, current_owner (text) - Addressescreation_tx (text) - TX hash for content fetchcreation_block (bigint)inscription_number (int)base_transfers - Transfer history indexer_state - Last indexed block marketplace_* - Listings, offers, sales
Content lives on-chain. To fetch:
// 1. Get TX from RPC const tx = await fetch('https://mainnet.base.org', { method: 'POST', body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'eth_getTransactionByHash', params: [txHash] }) }).then(r => r.json()); // 2. Decode hex calldata const hex = tx.result.input.slice(2); const bytes = new Uint8Array(hex.match(/.{2}/g).map(b => parseInt(b, 16))); const content = new TextDecoder().decode(bytes); // => "data:text/html;base64,..."
Or use API:
GET /content/:id handles this automatically.
cd frontend && npx wrangler pages deploy . --project-name=basescriptions --commit-dirty=true
cd worker && npx wrangler deploy
npx tsx scripts/backfill.ts START_BLOCK=40000000 npx tsx scripts/backfill.ts
curl https://basescriptions-api.wrapit.workers.dev/stats
SSHPASS='Margot25' sshpass -e ssh [email protected] "tail -30 ~/basescriptions/logs/backfill.log" SSHPASS='Margot25' sshpass -e ssh [email protected] "launchctl list | grep base"
SSHPASS='Margot25' sshpass -e ssh [email protected] "launchctl stop com.basescriptions.backfill && launchctl start com.basescriptions.backfill"
SSHPASS='Margot25' sshpass -e scp scripts/backfill.ts [email protected]:~/basescriptions/scripts/
npx tsx scripts/insert-missing.ts
BASE_RPC_URL=https://mainnet.base.org SUPABASE_URL=https://xxx.supabase.co SUPABASE_SERVICE_KEY=eyJ... PRIVATE_KEY=0x... # For registration scripts
/ - Homepage, search, recent inscriptions/item/:hash - Inscription detail/:address - Wallet profile (if 0x...)/:name - Name profile (if not 0x)/register/ - Register name/inscribe/ - Inscribe data/upload/ - Upload website/marketplace/ - Buy/sellmysite name{"basescriptions":{"mysite":{"home":"0xtx..."}}}mysite.basescriptions.com serves the HTMLSubdomain worker flow:
/name/:name APIcreation_txhttps://mainnet.base.org # Primary (rate limited) https://base-mainnet.g.alchemy.com # Fallback https://base.llamarpc.com # Fallback https://base-rpc.publicnode.com # Fallback
staticNetwork: true in ethers.js to skip network detection (prevents blocking when RPC is down)indexer_state table every batchapplication/json and application/text spam from recent displaydata: prefix