Contract map
Everything an indexer needs to pick up every token launched on hartiilabs.com, on one page.
New launches now go through a second factory (V3), so index both factories. Every address
below returned bytecode from quai_getCode and every event topic was matched against real logs on
Quai mainnet (chain 9, Cyprus-1) at block 10366996 (2026-09-30).
1. Index these two factories
Both factories emit the same TokenLaunched event, so one handler covers both. V1 still accepts
launches — keep indexing it.
| Factory | Address | Index from block | Status |
|---|---|---|---|
| TokenFactoryV3 | 0x00249722868732Ee678b88Db668EAf7cC75Ae12A | 10356575 | Live — every new launch from hartiilabs.com |
| TokenFactory (V1) | 0x001AF1BbB40807fcb99C9Eeaa49dF5E91e7Efd42 | 8872950 | Live — the original factory |
2. Events
topic0 is keccak256 of the signature.
| Event | Emitted by | topic0 |
|---|---|---|
TokenLaunched(address indexed token, address indexed curve, address indexed creator, string name, string symbol, bytes32 metadataHash) | V1 and V3 factory | 0x57e2b1dd3b3baad37496efb283e2935bc1cfedc331530404a4530514e5e71356 |
LaunchConfigured(address indexed token, uint256 vestingDurationSecs, uint256 lockStartDelaySecs, uint256 creatorFeeShareBps, uint256 treasuryFeeShareBps, uint256 snipeWindowBlocks, bool autoBuyback) | V3 factory only | 0x87811f92b40333fcc295e685f06b34bc066187e283798479a0ab372528df5b2a |
Buy(address indexed buyer, uint256 quaiIn, uint256 tokensOut, uint256 fee) | each token's curve | 0xbeae048c6d270d9469f86cf6e8fedda3c60ad770f16c24c9fc131c8e9a09101d |
Sell(address indexed seller, uint256 tokensIn, uint256 quaiOut, uint256 fee) | each token's curve | 0x846c37eef631e0943682d87352ec117c20008eb7f425c9b85ac011a6d4774cc0 |
Graduated(address indexed token, uint256 quaiReserve, uint256 tokenReserve) | each token's curve | 0x1c858049e704460ab9455025be4078f9e746e3fd426a56040d06389edb8197db |
LiquidityAdded(address indexed provider, uint256 quaiIn, uint256 tokensIn, uint256 shares) | V3 curves after graduation | 0x64b83944e79c3ce8d4c297411de637c3e102d064677aac0c163976ebdcd6f50e |
LiquidityRemoved(address indexed provider, uint256 quaiOut, uint256 tokensOut, uint256 shares) | V3 curves after graduation | 0x1dc8bb69df2b8e91fbdcbfcf93d951b3f0000f085a95fe3f7946d6161439245d |
3. How a token trades
- Launch. The factory emits
TokenLaunched.tokenis a plain ERC-20 with 18 decimals;curveis where it trades. Both are EIP-1167 clones of the implementations in section 5. - Bonding curve. Buys and sells hit the curve and emit
Buy/Sell. The curve holds the QUAI reserve. - Graduation.
Graduatedfires when the curve fills. The same curve contract then becomes the token's pool:Buy/Sellkeep firing from the same address, so there is no new venue to discover. V3 curves also take LP deposits after graduation (LiquidityAdded/LiquidityRemoved). - Optional HartiiSwap pair. Some tokens also have a Uniswap-V2-style pair on HartiiSwap
(section 4). Resolve it with
factory.getPair(token, WQUAI)— pairs areCREATE-deployed, so there is no init-code hash to compute.
4. HartiiSwap
A Uniswap V2 port, live since 2026-09-23. Pairs emit the standard V2 Mint, Burn, Swap and
Sync events; the factory emits PairCreated. More in HartiiSwap.
| Contract | Address |
|---|---|
| Factory | 0x002E75653C6189087Eb9E512cE7319eC21140956 |
| Router | 0x006B3450cca780066A3A8aA8b508103d25315Ea4 |
| Lens (read helper) | 0x00295dFCA930646abAC327C9CcB2f4e1E206C5Ec |
| WQUAI | 0x006C3e2AaAE5DB1bCd11A1a097cE572312EADdBB |
5. Implementations
For source verification — every launch clones these.
6. Other live HartiiLabs contracts
Not needed for token indexing.
| Contract | Address | From block | Status |
|---|---|---|---|
| LpLocker (time-locks LP, max 90 days) | 0x00276419b3aa2E7d034D2d54d52b59BdfFF4e60E | 10341499 | Live |
| AgentVaultFactory | 0x006C2be96D6Ca90d0105a2Bfa7aC2187f40e899d | 10341473 | Live — see Agent Terminal |
| HartiiProfiles | 0x0015f71de1574c772B6815D25B233C065f42c896 | 10341682 | Live |
| LpArena v2 | 0x00614295C6AC13d3B7d93844b9BacC61a7680820 | 10351500 | Live |
| LpArena v1 | 0x0075B00Ca0313f88b0825BE62bBFB890c9F4C03F | 10341703 | Deprecated — unstake only |
| MiningVaultFactory v2 | 0x0024596369Fc22A22b720B0A959630913d8D680b | 10342308 | Live |
| MiningVaultFactory v1 | 0x0059f740fb9AD9F2Db19DA5Dac3b71bF6BD6B68c | 10341712 | Abandoned — never used, do not integrate |
| AchievementRewards | 0x001d607B22de6ACcFB4adEE62838DED222Aa0c8a | 10352297 | Live |
| QuaiRelay | 0x0031B09e63592B713768761cdDACC603974c10bD | — | Live — see QuaiRelay |
7. Shortcuts
- If you'd rather not scan logs:
GET https://hartiilabs.com/api/tokenslists every indexed token, andGET https://hartiilabs.com/api/token/<address>returns one token with its curve address. See the API reference and how the indexer works. - When scanning yourself: Quai's
quai_getLogsrejects ranges over 10,000 blocks, so page through in windows of 10,000 blocks or fewer.