Hartii developer docs

Hartii developer docs

Hartii is a group of independent production apps on Quai Network. Each one deploys its own contracts and runs its own API — there is no shared backend. Pick a product below.

Products

  • HartiiLabs — the token launchpad at hartiilabs.com: one factory, a bonding curve per token that graduates into its own locked pool, and a public read API. New here? Start with Pricing a token — the page that answers the question every integrator asks first.
  • HartiiSwap — the ecosystem's own Uniswap-V2 AMM: pools for any token, swaps, add/remove liquidity, LP farms, and a one-call Lens. 0.30% swap fee.
  • QuaiAxe — mining that burns $QAXE (quaiaxe.com): no-code CREATE2 deposit addresses, an ownerless burn vault with a fixed 0.5% fee, a Lens for one-call reads, and a standard Quainance V2 QAXE/WQUAI pool.
  • QuaiRelay — a single stateless contract that turns a QUAI transfer into a contract call, for wallets that can't send a plain transfer. No backend at all.
  • Hartii Gallery — the NFT marketplace and creator platform at hartiigallery.com. Collection factory, five marketplace venues, public read API.
  • Hartii Games — the skill-game arcade at hartiigames.com (plus the Biome dashboard at hartiibiome.com). Free play, ranked play with on-chain prize pools, cosmetics.

Network facts

NetworkQuai Network mainnet
Chain ID9
Active zoneCyprus-1 (the only zone live on mainnet)
Address prefix0x00 — every valid Cyprus-1 address's first byte is zero
RPC (HTTPS)https://rpc.quai.network/cyprus1
RPC (WSS)wss://rpc.quai.network/cyprus1
Explorerhttps://quaiscan.io
Native currencyQUAI, 18 decimals
SDKquais — never ethers on Quai
Mining reward maturitynew mining rewards are locked ~14 days (2-week base coinbase maturity) before they mature to a spendable balance (docs.qu.ai) — irrelevant to app logic, but it explains why a freshly-mined balance can look smaller than expected

Gotchas every integrator hits

  • usePathing. quais.JsonRpcProvider can append the zone path itself. If your RPC_URL already ends in /cyprus1, construct the provider with { usePathing: false } or the SDK doubles the path. If your RPC_URL is the bare host (no /cyprus1), use { usePathing: true } and let the SDK add it. Both patterns are live in this ecosystem's own code — check which RPC_URL you're holding before picking one.
  • getFeeData needs the zone. Call it as provider.getFeeData(quais.Zone.Cyprus1), not with no argument — some providers return nothing without it. Live example: hartii-labs/src/pages/BlipSend.jsx.
  • eth_getLogs / quai_getLogs block range. The RPC caps how many blocks one getLogs call can scan; this ecosystem's own code treats it defensively rather than relying on a documented cap — e.g. Hartii Gallery's live activity fallback scans only the most recent 1,000 blocks per call rather than the full chain. Unverified: the exact enforced cap was not confirmed against a live RPC error for this doc; chunk your scans and handle a range-too-large error rather than assuming a specific number.
  • Block time. ~5 seconds per Zone block on Cyprus-1 — measured directly: quai_blockNumber minus 1,000 blocks, compared by quai_getBlockByNumber timestamps, gives 4,973s / 1,000 blocks = 4.97s/block (checked 2026-09-23). Plan confirmations accordingly — this is not sub-second finality.
  • Zone-bound addresses. An address that doesn't start 0x00 is not on Cyprus-1. Sending native QUAI to it with a same-zone call is unrecoverable — validate the prefix client-side before you let a user submit.

Contributing to these docs

Every fact here was checked against source code in the product's repo or a live GET/RPC call — see each page's contracts/API tables for the addresses and endpoints used. Conventions for writing more pages: CONVENTIONS.md in this repo.

Quai Network mainnet · chain 9 · Cyprus-1. Figures marked "read on" a date were read from the chain that day; re-read before relying on them.