Skip to main content
IFÁ Labs is deployed natively on Sui as a Move package — not a port of the EVM contracts, but a ground-up Sui implementation using shared objects, Move’s type system, and Sui’s object model. This page gives you the full picture before you write any code.

What Is Deployed on Sui

Four packages are live on Sui Testnet:

Oracle Contract

The core price feed. Stores and exposes stablecoin prices via shared objects. This is what your protocol integrates against.

Faucet

Multi-token testnet faucet. Claim SUI and WAL for development and testing.

Swap Contract

Live heterogeneous liquidity pool. Deposit, withdraw, swap, and sweep across SUI, CNGN, ZARP, and other listed assets — priced directly by the oracle.

HLP Token

Heterogeneous Liquidity Provider token. Issued to liquidity providers in the swap pool. Minted and burned automatically by the swap contract.
The swap contract is now live, not just planned. See Sui Swap Contract for the full integration guide.

Sui Testnet Object IDs

Oracle

Faucet

The oracle package was redeployed. If you have any previously documented object IDs saved, they now point to a stale deployment and must be replaced with the values above.
When reading prices, always pass the Feed Object ID — not the Package ID. The Package ID is only needed when importing ifa_oracle as a dependency in your own Move package’s Move.toml.

How Sui Differs from EVM

This is the most important section for developers coming from the EVM integration. Every one of these differences will cause a bug if you miss it.

1. Shared Objects Instead of Contract Addresses

On EVM you call a function on a contract address. On Sui, the price feed is stored in a shared object — a piece of on-chain state that any transaction can reference.
When building a transaction, you pass the Feed Object ID as an object argument — not as a raw address.

2. Positive Decimal Convention

EVM returns a negative int8 decimal (e.g. -18). Sui returns a positive u8 decimal (e.g. 18). The math is identical — divide by 10^18 — but the sign is different.

3. Timestamps Are in Milliseconds

On EVM, block.timestamp is in seconds. On Sui, clock::timestamp_ms(clock) is in milliseconds.
This affects every staleness check you write. Getting the unit wrong means your freshness check either never triggers (too large) or always triggers (too small).

4. Derived Pair Decimal Is Always 30

On EVM, derived pairs inherit the decimal from the underlying assets. On Sui, all derived pairs always return decimal = 30 — regardless of which assets are involved. derived_price is always scaled by 10^30.

5. Missing Assets Abort — No False Flag

On EVM, getAssetInfo returns exists = false for unsupported assets. On Sui, derived pair functions abort the transaction if either underlying asset is missing. get_asset_info and get_assets_info are safe — they return a bool exists flag. But get_pair_by_id and all batch pair functions abort on missing assets.

6. Asset IDs Use a Different Format

The underlying 32-byte values are identical across all networks. But on Sui they are passed as vector<u8> wrapped in a Bytes32 struct — not as bytes32 hex strings.

7. Built-In Freshness Helper

The Sui contract exposes price_feed::is_fresh directly — you don’t need to implement the staleness subtraction yourself.

Supported Assets on Sui

All feeds available on EVM are also available on Sui Testnet. Asset IDs are identical across chains — only the format differs.

Architecture Overview

Key point: Your protocol only ever interacts with IfaPriceFeed — the bottom shared object. You never interact with the verifier directly. The relayer and verifier are IFÁ Labs infrastructure. The Swap Contract is itself a consumer of the oracle, exactly like any other protocol you’d build.

Integration Checklist

Before writing your first line of Move or TypeScript, confirm these:
1

Sui CLI installed and testnet environment active

2

Testnet SUI available for gas

Price reads via devInspectTransactionBlock are free. You need SUI for deploying your own contracts. Claim from the IFÁ Labs Faucet or faucet.sui.io.
3

Feed Object ID saved — not Package ID

The value you use in transactions is: 0x5d2728b862de08de767e4f8841a38c9452d951c0602e77fc47bfbb3ab03f33f0Not the Package ID. Save this now.
4

Understood the millisecond timestamp convention

All last_update_time values and the max_age parameter in is_fresh are in milliseconds. 3_600_000 = 1 hour.
5

Asset IDs formatted correctly for Sui

No 0x prefix. Use x"..." hex literal syntax in Move. Use Buffer.from("...", "hex") in TypeScript.

What to Integrate Against


Coming Soon on Sui


Next Steps

Read Latest Price

Full code examples for reading prices in Move and TypeScript.

Sui Swap Contract

Deposit, withdraw, swap, and sweep on the live testnet liquidity pool.

Function Reference

Complete reference for every public function in the Sui Move oracle contract.

Testnet Faucet

Claim testnet SUI and WAL for development.