Add .igra resolution in 5 minutes.
INS is the permanent name service native to Igra L2 (chain 38833, native iKAS). Every name is an ERC-721 with on-chain SVG art. Resolve a name to an address with one fetch() — the API unions the V1 + V2 registries automatically. No SDK, no indexer, no infrastructure on your side.
Quick start — REST API
Free, public, CORS-enabled, no auth, no rate limit. The fastest path — hit it from your wallet's existing fetch layer.
// Forward resolve (name -> address) — works for V1 + V2, no flags
async function resolveIgra(name) {
const r = await fetch(
"https://insdomains.org/api/resolve?name=" + encodeURIComponent(name)
);
if (!r.ok) return null;
const d = await r.json();
if (!d.exists) return null;
return d.address; // also: d.owner, d.registry_version,
// d.tenure ("forever"|"annual"), d.expires_at
}
// in your send-flow:
const to = await resolveIgra("alice.igra");
if (to) sendTransaction(to);// Reverse (address -> primary name) for tx history / contacts
async function displayName(addr) {
const r = await fetch("https://insdomains.org/api/reverse?address=" + addr);
const { primary } = await r.json();
return primary ?? (addr.slice(0, 6) + "\u2026" + addr.slice(-4));
}Live endpoints
Click any example — they return real JSON from chain right now.
| /api/resolve?name=igranetwork.igra | name → address (+ tenure, expires_at, registry_version) |
| /api/reverse?address=0x7447F0e5CDfa55ceF123F8d2E0B2c981d1807aA1 | address → primary name |
| /api/names/by-owner?address=0x7447F0e5CDfa55ceF123F8d2E0B2c981d1807aA1 | all names owned by an address |
| /api/names/recent?limit=5 | most-recent registrations (V1 + V2) |
| /api/stats | supply, volume, fees, V2 breakdown |
| /api/nft-image/100?size=400&v=2 | rendered NFT card PNG (pass v=2 for V2 token ids) |
Three ways to integrate
1REST API — 5 min, zero infra
2Read contracts directly — no HTTP layer
import { createPublicClient, http } from "viem";
const client = createPublicClient({
transport: http("https://rpc.igralabs.com:8545"),
chain: { id: 38833, name: "Igra",
nativeCurrency: { name: "iKAS", symbol: "iKAS", decimals: 18 } },
});
// resolve(label) returns the target address directly. Label only — no ".igra".
// Query V2 first, fall through to V1 on a zero result (matches the dApp).
const addr = await client.readContract({
address: "0x7E7018959bf44045F01D176D8db1594894CBf4E9",
abi: [{ name: "resolve", type: "function", stateMutability: "view",
inputs: [{ name: "label", type: "string" }],
outputs: [{ type: "address" }] }],
functionName: "resolve",
args: ["alice"],
});V2 adds priceAnnualFor, expiresAt, isExpired, and isInGrace for Annual names (Forever names report expiresAt = 0).3ENS-compatible namehash — for ENS-only tooling
addr(bytes32 node) / text(bytes32, string) with trustless node→label binding (poisoning impossible by construction; expired names resolve to address(0)). Use only if you have an existing ENS pipeline — otherwise Path 1 or 2 is simpler.Contracts on Igra mainnet
All explorer-verified. V2 is canonical; V1 is legacy read-only.
RPC: https://rpc.igralabs.com:8545 · Explorer: explorer.igralabs.com · strip the .igra suffix before calling label-based functions.
Audit posture
Reverse resolution is stale-safe, fees are capped in code (even a compromised owner can't exceed 5%), and registration overpayment is refunded in-tx. Reproduce with cd contracts && forge test.
What we'd love your help with
- Send-flow resolution — type
alice.igrain the to-field, resolve, send. Show the name next to the 0x on confirmations. - Reverse-resolve display — render
alice.igrawherever you show a raw address. - “My names” tile — on connect, fetch
/api/names/by-owner. - Annual expiry reminders — for
tenure === "annual", nudge whenexpires_atis within 60 days. - Native NFT art —
tokenURI()returns a Base64 SVG; no extra fetch.
Get a hand integrating
Happy to do a 15-minute walk-through, debug a call against the live RPC, or open a PR into your wallet repo. The API is free forever and there are real users + volume on chain today.
Full source (MIT) is on GitHub — private during launch; ping @GoonBoyCrypto for read access.