Back to skills
extension
Category: Development & EngineeringNo API key required

flowx

This skill should be used when the user asks about FlowX Finance, FlowX DEX, FlowX AMM, FlowX CLMM, FlowX swap, FlowX liquidity, or wants to integrate with FlowX on Sui. Covers AMM V1 constant-product swaps, CLMM concentrated liquidity swaps, multi-hop routing, liquidity provision, LP tokens, flash loans, position management, and pool queries.

personAuthor: jakexiaohubgithub

FlowX Finance on Sui

FlowX Finance is a DEX on Sui with two AMM models: a classic constant-product AMM (V1) and a Uniswap V3-style concentrated liquidity market maker (CLMM). The V1 AMM uses PairMetadata<X, Y> pools stored in a shared Container, while the CLMM uses tick-based Pool<X, Y> objects stored in a shared PoolRegistry.

Package IDs

| Package | Original ID | Description | |---------|------------|-------------| | AMM V1 (Core) | 0xba153169476e8c3114962261d1edc70de5ad9781b83cc617ecc8c1923191cae0 | Factory, Pair, Router, swap_utils for constant-product AMM | | CLMM (Core) | 0x25929e7f29e0a30eb4e692952ba1b5b65a3a4d65ab5f2a32e1ba3edcb587f26d | Pool, PoolManager, SwapRouter, PositionManager for concentrated liquidity |

Source Files

Decompiled Move source:

  • AMM V1: packages/mainnet_most_used/0xba/153169476e8c3114962261d1edc70de5ad9781b83cc617ecc8c1923191cae0/decompiled_modules/
  • CLMM (latest v7): packages/mainnet_most_used/0xde/2c47eb0da8c74e4d0f6a220c41619681221b9c2590518095f0f0c2d3f3c772/decompiled_modules/

Architecture

AMM V1

  • Container (shared object): Holds all pairs in a Bag, keyed by LP name string. Created at init, one global instance.
  • PairMetadata<X, Y>: Constant-product pool with reserve_x, reserve_y, lp_supply, fee_rate. Stored inside Container.pairs.
  • LP<X, Y>: Fungible LP token type with Supply managed by the pair. Minimum 1000 locked on first mint.
  • Treasury: Holds the fee recipient address for protocol fees.
  • Token ordering: Pairs are always stored in canonical order determined by swap_utils::is_ordered<T0, T1>() (lexicographic comparison of type names).
  • Default fee rate: 30 basis points (0.3%) set on pair creation. Fee denominator is 10000.

CLMM

  • PoolRegistry (shared object): Manages all CLMM pools as dynamic object fields. Pools are keyed by (coin_type_x, coin_type_y, fee_rate).
  • Pool<X, Y>: Concentrated liquidity pool with sqrt_price, tick_index, liquidity, tick bitmap, observations (TWAP), reward infos, reserves. Uses SwapReceipt pattern for payment.
  • Position (owned NFT): Represents a concentrated liquidity range with tick_lower_index, tick_upper_index, liquidity, accrued fees and rewards. Display name: "FlowX CLMM Liquidity Positions".
  • PositionRegistry (shared object): Tracks total number of open positions.
  • Versioned: Version gating object for upgradeable contracts.
  • Fee rate denominator: 1_000_000. Pre-configured tiers: 100 (0.01%, tick spacing 2), 500 (0.05%, tick spacing 10), 3000 (0.3%, tick spacing 60), 10000 (1%, tick spacing 200).
  • Flash loans via pool::flash / pool::repay with FlashReceipt.

Key Modules

AMM V1

| Module | Purpose | |--------|---------| | factory | Container creation, pair management, fee rate admin | | pair | PairMetadata struct, swap, mint (add liquidity), burn (remove liquidity), LP token management | | router | Entry points: swap_exact_input, swap_exact_output, add_liquidity, remove_liquidity, multi-hop swaps | | swap_utils | get_amount_out, get_amount_in, quote, is_ordered | | treasury | Protocol fee recipient management | | math | sqrt, min/max, pow helpers | | comparator | Byte-level comparison for type ordering | | type_helper | Type name string conversion |

CLMM

| Module | Purpose | |--------|---------| | pool | Pool struct, swap, flash loan, modify_liquidity, collect fees/rewards, state queries | | pool_manager | PoolRegistry, pool creation, pool borrowing, admin operations | | swap_router | swap_exact_input, swap_exact_output (handles token ordering) | | position_manager | open_position, increase_liquidity, decrease_liquidity, collect, close_position | | position | Position NFT struct, field accessors | | tick_math | Tick-to-sqrt-price conversions, min/max bounds | | liquidity_math | Liquidity calculations from amounts and price ranges | | sqrt_price_math | Price-based amount calculations | | oracle | TWAP observation management | | tick, tick_bitmap | Tick state and initialized tick traversal |

Common Integration Patterns

AMM V1: Swap Exact Input (entry point)

// Single-hop swap with exact input amount
// Container is the shared FlowX AMM object
router::swap_exact_input<TokenIn, TokenOut>(
    clock,          // &Clock
    container,      // &mut Container
    coin_in,        // Coin<TokenIn>
    min_amount_out, // u64
    recipient,      // address
    deadline,       // u64 (timestamp_ms)
    ctx,            // &mut TxContext
);

// Programmable: returns Coin<TokenOut> directly
let coin_out = router::swap_exact_input_direct<TokenIn, TokenOut>(
    container, coin_in, ctx
);

// Multi-hop (2 hops): TokenIn -> Mid -> TokenOut
router::swap_exact_input_doublehop<TokenIn, Mid, TokenOut>(
    clock, container, coin_in, min_amount_out, recipient, deadline, ctx
);

// Multi-hop (3 hops)
router::swap_exact_input_triplehop<T0, T1, T2, T3>(
    clock, container, coin_in, min_amount_out, recipient, deadline, ctx
);

AMM V1: Add / Remove Liquidity

// Add liquidity (auto-creates pair if needed)
router::add_liquidity<TokenX, TokenY>(
    clock, container, coin_x, coin_y,
    amount_x_min,  // u64
    amount_y_min,  // u64
    recipient,     // address -- receives LP tokens
    deadline, ctx,
);

// Remove liquidity
router::remove_liquidity<TokenX, TokenY>(
    clock, container,
    lp_coin,         // Coin<pair::LP<TokenX, TokenY>>
    amount_x_min,    // u64
    amount_y_min,    // u64
    recipient, deadline, ctx,
);

CLMM: Swap

// Exact input swap via swap_router (handles ordering automatically)
let coin_out = swap_router::swap_exact_input<TokenIn, TokenOut>(
    pool_registry,    // &mut PoolRegistry
    fee_rate,         // u64 (e.g., 3000 for 0.3%)
    coin_in,          // Coin<TokenIn>
    min_amount_out,   // u64
    sqrt_price_limit, // u128 (0 for no limit)
    deadline,         // u64 (seconds)
    versioned,        // &Versioned
    clock, ctx,
);

// Exact output swap
let coin_out = swap_router::swap_exact_output<TokenIn, TokenOut>(
    pool_registry, fee_rate, coin_in,
    exact_amount_out, sqrt_price_limit, deadline,
    versioned, clock, ctx,
);

CLMM: Open Position + Add Liquidity

// 1. Open position with tick range
let position = position_manager::open_position<TokenX, TokenY>(
    position_registry, pool_registry,
    fee_rate,          // u64
    tick_lower,        // i32::I32
    tick_upper,        // i32::I32
    versioned, ctx,
);

// 2. Add liquidity to the position
position_manager::increase_liquidity<TokenX, TokenY>(
    pool_registry, &mut position,
    coin_x, coin_y,
    amount_x_min, amount_y_min,
    deadline, versioned, clock, ctx,
);

// 3. Transfer position to user
transfer::public_transfer(position, sender);

CLMM: Flash Loan

let (balance_x, balance_y, receipt) = pool::flash<T0, T1>(
    pool, amount_x, amount_y, versioned, ctx
);
// ... use balances ...
// Must repay with fee
pool::repay<T0, T1>(pool, receipt, repay_balance_x, repay_balance_y, versioned, ctx);

Pool Queries

// AMM V1
let (reserve_x, reserve_y) = pair::get_reserves<X, Y>(pair_metadata);
let fee = pair::fee_rate<X, Y>(pair_metadata);
let lp_supply = pair::total_lp_supply<X, Y>(pair_metadata);

// CLMM
let (reserve_x, reserve_y) = pool::reserves<X, Y>(pool);
let sqrt_price = pool::sqrt_price_current<X, Y>(pool);
let tick = pool::tick_index_current<X, Y>(pool);
let liquidity = pool::liquidity<X, Y>(pool);
let fee_rate = pool::swap_fee_rate<X, Y>(pool);

Related Skills

  • sui-framework -- Core Sui types (Coin, Balance, Clock, TxContext)
  • cetus -- Alternative CLMM DEX on Sui (similar CLMM architecture)
  • turbos -- Alternative CLMM DEX
  • kriya -- Alternative AMM/PMM DEX
  • deepbook -- CLOB DEX on Sui