Contract addresses
All on LitVM, chain id 4441. Click an address to open it in the explorer, or hit the icon to copy it.
Only take addresses from this page or from the app itself. If someone DMs you a "new router", it's a scam.
Tokens
| Name | Address | Notes |
|---|---|---|
| wzkLTC (wrapped zkLTC) | 0x315374AA9b5536037Cc1Efeea2439CCC0913A77e | The token pools use for zkLTC. deposit() / withdraw(uint256) |
| Native zkLTC (placeholder) | 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE | Not a contract. The APIs use it to mean native zkLTC |
| ZKUSDC | 0xdf69970B2fE416339187aA41D39882e864984CE9 | Handy for testing. 18 decimals |
Want every listed token with logos? Use the Token List API.
Swaps (aggregator)
| Contract | Address | What it's for |
|---|---|---|
| Swap entrypoint | 0xF664B56933f3cF0d7d69982b5A8eC9101b80059D | Send routed swaps here, and approve this one when selling a token. Emits SwapExecuted |
The calldata for the entrypoint (a compact "program" describing the route) is built for you by the Swap API. Use that rather than encoding it yourself, since the route format is internal and can change.
V2 pools
| Contract | Address |
|---|---|
| Factory | 0x4680BCe1632824d30D2F53656dD610736c3e312e |
| Router (Router02 interface) | 0xF456737D17C2Bbb348fd4F7D1b000D62A46FB3b5 |
| Constant | Value |
|---|---|
| Pair init code hash | 0x01888feb01db41d97ad6fb1883d7e286650d46c410b82338aeb4a37554c28bcd |
| Swap fee | 0.3% (the standard 997 / 1000 math) |
More on V2 pools.
V3 pools
| Contract | Address |
|---|---|
| Factory | 0xDE6763A041f8Fc94CA2EE5933736F78f6D1A11c5 |
SwapRouter (the original one, with deadline) | 0x60F8A7642F0aeC06cE628224E743326B23Fe5208 |
| NonfungiblePositionManager | 0x1089f046B597f259BeFDC15Bf9C90E33616BA366 |
| V3Migrator (moves V2 LP into V3) | 0x89dd9B1757C94b1F570090cc6C74B1dE2910429c |
| Constant | Value |
|---|---|
| Pool init code hash | 0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54 |
| Fee tiers | 500 (0.05%, tick spacing 10), 3000 (0.3%, spacing 60), 10000 (1%, spacing 200) |
There's no on-chain Quoter. For prices, use the Swap API or simulate the swap, see V3 pools.
Utilities
| Contract | Address |
|---|---|
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 |
Computing pool addresses offline
Pool addresses are deterministic, so you can work them out without an RPC call.
import { encodeAbiParameters, encodePacked, getCreate2Address, keccak256, type Address } from 'viem'
const sort = (a: Address, b: Address): [Address, Address] =>
a.toLowerCase() < b.toLowerCase() ? [a, b] : [b, a]
export function v2PairAddress(tokenA: Address, tokenB: Address) {
const [t0, t1] = sort(tokenA, tokenB)
return getCreate2Address({
from: '0x4680BCe1632824d30D2F53656dD610736c3e312e',
salt: keccak256(encodePacked(['address', 'address'], [t0, t1])),
bytecodeHash: '0x01888feb01db41d97ad6fb1883d7e286650d46c410b82338aeb4a37554c28bcd',
})
}
export function v3PoolAddress(tokenA: Address, tokenB: Address, fee: 500 | 3000 | 10000) {
const [t0, t1] = sort(tokenA, tokenB)
return getCreate2Address({
from: '0xDE6763A041f8Fc94CA2EE5933736F78f6D1A11c5',
salt: keccak256(encodeAbiParameters([{ type: 'address' }, { type: 'address' }, { type: 'uint24' }], [t0, t1, fee])),
bytecodeHash: '0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54',
})
}
// wzkLTC / ZKUSDC
v2PairAddress('0x315374AA9b5536037Cc1Efeea2439CCC0913A77e', '0xdf69970B2fE416339187aA41D39882e864984CE9')
// → 0x5Ab5906CFBc21642A7f526521318bA33262E3954A computed address only tells you where the pool would be. Check it has code (or ask the factory with
getPair / getPool) before you trust it.
ABIs
The V2 and V3 contracts use the standard interfaces, so these work out of the box:
- viem ships
erc20Abi, and you can paste the standard Uniswap V2/V3 ABIs or write smallparseAbifragments like the ones in these docs. - You can look up every contract above, its transactions and its events on the explorer.