Skip to content
LitVMSwapDocs
Open app
Developers / Contract addresses
Developers

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

NameAddressNotes
wzkLTC (wrapped zkLTC)0x315374AA9b5536037Cc1Efeea2439CCC0913A77eThe token pools use for zkLTC. deposit() / withdraw(uint256)
Native zkLTC (placeholder)0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeENot a contract. The APIs use it to mean native zkLTC
ZKUSDC0xdf69970B2fE416339187aA41D39882e864984CE9Handy for testing. 18 decimals

Want every listed token with logos? Use the Token List API.

Swaps (aggregator)

ContractAddressWhat it's for
Swap entrypoint0xF664B56933f3cF0d7d69982b5A8eC9101b80059DSend 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

ConstantValue
Pair init code hash0x01888feb01db41d97ad6fb1883d7e286650d46c410b82338aeb4a37554c28bcd
Swap fee0.3% (the standard 997 / 1000 math)

More on V2 pools.

V3 pools

ContractAddress
Factory0xDE6763A041f8Fc94CA2EE5933736F78f6D1A11c5
SwapRouter (the original one, with deadline)0x60F8A7642F0aeC06cE628224E743326B23Fe5208
NonfungiblePositionManager0x1089f046B597f259BeFDC15Bf9C90E33616BA366
V3Migrator (moves V2 LP into V3)0x89dd9B1757C94b1F570090cc6C74B1dE2910429c
ConstantValue
Pool init code hash0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54
Fee tiers500 (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

Computing pool addresses offline

Pool addresses are deterministic, so you can work them out without an RPC call.

TypeScript
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')
// → 0x5Ab5906CFBc21642A7f526521318bA33262E3954

A 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 small parseAbi fragments like the ones in these docs.
  • You can look up every contract above, its transactions and its events on the explorer.