read-only http cache for IQ on-chain content — Solana + EVM · loading… · /docs · /openapi.json · /health · github

$ what this is

IQ Gateway resolves IQ on-chain content (manifests, table rows, signatures, SNS/ENS records) and serves it over HTTP with a multi-tier cache. One process serves Solana and every supported EVM network at once. Anyone can run their own; data is recoverable from chain so any gateway can serve any id. This deployment is one of multiple cooperating instances.

$ live state

modeloading…
chainsloading…
uptimeloading…
rpc callsloading…
cache entriesloading…
cache sizeloading…

$ networks

The chain is picked per request: a base58 id (Solana sig/pubkey) routes to Solana; a 0x id routes to EVM. Add ?network= to reach an EVM L2; without it, EVM ids resolve to the default network below. Same routes, same response shapes — only the underlying fetch settings differ per chain.

solanabase58 ids · ?network=solana · SNS / sol.site hosting
sepolia (EVM default)chain 11155111 · ETH · 0x246A08D9fdD9b3990A88eD1f2DF1A87239839F07
monadchain 143 · MON · ?network=monad · 0x7ae06f87Cf93606DA2BD6A281afB28028cAE233D
monadTestnetchain 10143 · MON · ?network=monadTestnet · 0x3379883538C068978e199472b5D127055c734867
robinhoodchain 4663 · ETH · ?network=robinhood · 0x88af59e58C7E5DcbE7cc12972B90cff3fEEF7223

EVM networks deployed depend on this operator's config; check /health for the live chains list. ENS forward/reverse lookups run against Ethereum mainnet (needs ENS_RPC_ENDPOINT).

$ sns & sol.site (Solana only)

Set one record on your .sol via sns.id — a URL record pointing at this gateway — and your domain becomes browsable in three places:

<your-name>.sol in Brave with native SNS resolution enabled
<your-name>.sol.site/file any browser, via sol.site DNS materialisation
${0}/sns/<name> any browser, via this gateway directly

The on-chain content is the same across all three. See HOW-IT-WORKS.md for the full spec + the SDK quirk we work around.

$ endpoints (excerpt)

GET /sns/{domain}resolve sns → 302 to /site/<sig>/
GET /sns/{domain}/{path}drill into a specific file
GET /site/{sig}serve the manifest's index
GET /site/{sig}/{path}serve a file from the manifest
GET /meta/{sig}.jsonmetaplex-compatible json metadata
GET /img/{sig}.pngraw image bytes
GET /data/{sig}raw asset data
GET /view/{sig}rendered html view of a text inscription
GET /render/{sig}png/svg render of a text inscription
GET /table/{pda}/rowspaginated rows; ETag 304 + timestamp-gated refresh
GET /table/{pda}/subscribeSSE: hello / row / ping every 30s
GET /table/{feedPda}/thread/{threadPda}resolved op + replies in one call
GET /user/{pubkey}/postsopportunistic signer index
GET /user/{pubkey}/assetsassets uploaded by a wallet
GET /gate/{tablePda}/check/{wallet}server-side token-gate check
GET /cache/infocache stats — entries, size, by-type
GET /cache/entriespaginated disk-cache index for explorers
GET /cache/snapshotstreamed tar.gz of full cache (public; bootstrap a cold peer)

EVM (0x ids, optionally ?network=): /data/{txHash}, /meta/{txHash}.json, /table/{dbRootId}/{tableName}/rows, /ens/{name} (forward/reverse). Same shapes as the Solana routes above.

full schema at /openapi.json · interactive at /docs

$ set sns to point here

Record.URL = ${0}/site/<your-sig>/<your-index-file>

Pick the file path that matches your manifest's index (often gameboy.html, index.html, etc.). The sig in the URL value is the only thing the resolver needs — the rest is stripping fluff.

$ run your own gateway

The whole stack is open source. Operator-agnostic by design: someone running their own instance pointed at the same chain serves the same content.

git clone https://github.com/IQCoreTeam/iq-gateway cd iq-gateway bun install cp .env.example .env # multi (default): set SOLANA_RPC_ENDPOINT + IQETH_RPC_* for the EVM nets you serve # or lock one chain: IQ_CHAIN=solana | evm bun run dev

Containerized via the repo Dockerfile (chain-agnostic image). Unset IQ_CHAIN serves every configured chain at once; set it to lock to one. To bootstrap a cold cache from a peer:

curl -H "X-Cache-Snapshot-Token: $TOK" \ https://<peer-gateway>/cache/snapshot | tar -xz -C ./cache

Pulls the peer's full cache.db + blob dirs. Each entry is keyed by an on-chain identifier so you can verify any subset against chain. Skips the cold-start RPC storm.

$ caching

memory (LRU)500 entries, 5min TTL — hot path
disk (sqlite)10GB cap, evicts LRU when full — survives restarts. Keyed by network so chains never collide.
chain (solana / evm)permanent — source of truth

Negative results cached too (sentinel __none__) so junk lookups don't keep hitting RPC. In-flight dedup means N concurrent cold-cache requests for the same key share one upstream call.