Chuyển đến nội dung chính

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
Stable AMM chia sẻ cấu trúc tài khoản phía pool của AMM v4 (AmmInfo, vaults, authority) và bổ sung yêu cầu một tài khoản ModelDataInfo lưu trữ bảng tra cứu. Trang này bao gồm cả hai.

Danh mục tài khoản

Một pool Stable AMM liên kết với đúng một thị trường OpenBook. Danh mục tài khoản đầy đủ phản ánh AMM v4 một cách gần gũi:
Danh mụcTài khoảnChủ sở hữuVai trò
PoolAmmInfoChương trình StableTrạng thái pool, tham chiếu tới vaults, OpenBook và tài khoản model-data.
Poolamm_authorityChương trình StablePDA do chương trình sở hữu ký vào các thao tác vault. Được chia sẻ trên tất cả các pool Stable AMM.
Poolamm_open_ordersOpenBookTài khoản OpenOrders của OpenBook của pool.
Poolamm_target_ordersChương trình StableLưới phía pool cho các lệnh giới hạn.
Poolpool_coin_token_accountSPL TokenVault phía coin của pool.
Poolpool_pc_token_accountSPL TokenVault phía pc của pool.
Poollp_mintSPL TokenMint LP có thể trao đổi được.
Modelmodel_data_accountChương trình StableBảng tra cứu: 50.000 × DataElement.
Thị trườngserum_marketOpenBookThị trường OpenBook.
Thị trườngserum_bids, serum_asksOpenBookHàng đợi giá mua/bán.
Thị trườngserum_event_queueOpenBookHàng đợi sự kiện.
Thị trườngserum_coin_vault, serum_pc_vaultSPL TokenVaults ở cấp độ thị trường OpenBook.
Thị trườngserum_vault_signerOpenBookKý người ký vault ở cấp độ thị trường.

AmmInfo

Tài khoản trạng thái gốc. Cấu trúc hầu như giống hệt AMM v4 — tham số pool, số thập phân, phí, tham chiếu vault/mint — với một bổ sung: trường model_data_key trỏ tới bảng tra cứu.
// raydium-stable/program/src/state.rs (rút gọn)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce: u64,                     // bump cho amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // máy trạng thái (IdleState, v.v.)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // phản ánh OpenBook
    pub pc_lot_size: u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,
    pub abort_trade_factor: u64,
    pub price_tick_multiplier: u64,
    pub price_tick: u64,
    
    pub fees: Fees,                     // xem bên dưới
    pub out_put: OutPutData,            // PnL, swaps, punish amounts
    
    pub coin_vault: Pubkey,
    pub pc_vault: Pubkey,
    pub coin_mint: Pubkey,
    pub pc_mint: Pubkey,
    pub lp_mint: Pubkey,
    pub model_data_key: Pubkey,         // ← BẢNG TRA CỨU
    pub open_orders: Pubkey,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // khóa admin
    pub client_order_id: u64,
    pub lp_amount: u64,                 // cung cấp LP
    pub lp_net: u64,                    // chỉ số giá trị LP
    pub padding: [u64; 61],
}

pub struct Fees {
    pub min_separate_numerator: u64,
    pub min_separate_denominator: u64,
    pub trade_fee_numerator: u64,       // 25
    pub trade_fee_denominator: u64,     // 10_000 → 0.25%
    pub pnl_numerator: u64,             // 12
    pub pnl_denominator: u64,           // 100 → 12% của phí = 0.03% của khối lượng
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // phí giao thức lũy tích (coin)
    pub need_take_pnl_pc: u64,          // phí giao thức lũy tích (pc)
    pub total_pnl_pc: u64,
    pub total_pnl_coin: u64,
    pub pool_open_time: u64,
    pub punish_pc_amount: u64,
    pub punish_coin_amount: u64,
    pub orderbook_to_init_time: u64,
    pub swap_coin_in_amount: u128,
    pub swap_pc_out_amount: u128,
    pub swap_pc_in_amount: u128,
    pub swap_coin_out_amount: u128,
    pub swap_pc_fee: u64,
    pub swap_coin_fee: u64,
}
Các trường quan trọng đối với tích hợp viên:
  • model_data_key — địa chỉ của bảng tra cứu. Phải được truyền tới mọi lệnh.
  • fees — cấu trúc giống hệt AMM v4. Mặc định là phí giao dịch 0.25%, chia tách LP 0.22% / giao thức 0.03%.
  • coin_vault, pc_vault — các vaults của pool.
  • status — bitmask kiểm soát swap/deposit/withdraw/crank.
  • out_put.need_take_pnl_* — được xử lý bởi WithdrawPnl.

ModelDataInfo

Bảng tra cứu. Một mảng thưa lớn các điểm giá/số lượng.
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // bảng X (ví dụ: số lượng coin)
    pub y: u64,         // bảng Y (ví dụ: số lượng pc)
    pub price: u64,     // giá tại (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized hoặc Uninitialized
    pub multiplier: u64,                // hệ số tỷ lệ cho x, y (ví dụ: 10^6)
    pub valid_data_count: u64,          // có bao nhiêu phần tử được điền
    pub elements: [DataElement; 50000], // bảng chính
}
Vòng đời:
  1. InitModelData tạo tài khoản và đặt status = Initialized, multiplier = <admin-provided>, valid_data_count = 0.
  2. UpdateModelData (được gọi tối đa 5 lần trên mỗi giao dịch) điền phần tử thông qua:
    • Đầu vào: mảng các cặp (index: u64, DataElement).
    • Ghi mỗi cặp vào elements[index].
    • Tăng valid_data_count nếu index >= valid_data_count.
  3. Swap/deposit/withdraw gọi các hàm tra cứu tìm kiếm nhị phân và nội suy trong elements[0..valid_data_count].

DataElement

Mục nhập nguyên tử trong bảng. Phải được sắp xếp (x tăng dần, y giảm dần, giá tăng dần) để tìm kiếm nhị phân hoạt động.
pub struct DataElement {
    pub x: u64,         // tọa độ X (ví dụ: số dư token_a, được tỷ lệ theo multiplier)
    pub y: u64,         // tọa độ Y (ví dụ: số dư token_b, được tỷ lệ theo multiplier)
    pub price: u64,     // giá (x/y ở dạng tỷ lệ, được tỷ lệ theo multiplier)
}
Khi điền bảng, admin chỉ định các giá trị này đã được tỷ lệ. Chương trình không xác thực thứ tự sắp xếp trên chuỗi (để tối ưu hóa tốc độ), vì vậy sắp xếp sai gây ra báo giá không chính xác.

Authority và vaults

Giống như AMM v4:
  • amm_authority là một PDA toàn chương trình duy nhất được tính toán với seed ["amm authority"]. Nó sở hữu tất cả các vaults pool và ký các thao tác của chúng.
  • Vaults là các tài khoản SPL Token có chủ sở hữu là amm_authority, không phải ATAs.
Token-2022 không được hỗ trợ.

Bitmask trạng thái

Giống hệt AMM v4. Kiểm soát xem swap/deposit/withdraw/crank có được bật hay không.

Theo dõi phí và PnL

Giống như AMM v4. Struct out_put theo dõi:
  • need_take_pnl_coin, need_take_pnl_pc — phí giao thức lũy tích nhưng chưa được xử lý. WithdrawPnl di chuyển những thứ này ra ngoài.
  • swap_coin_in_amount, swap_pc_in_amount, v.v. — bộ đếm phân tích.

Kích thước tài khoản

ModelDataInfo rất lớn (~1.2 MB, vì 50.000 phần tử × 24 byte trên mỗi phần tử). Đây là lý do tại sao tạo pool Stable yêu cầu tiền cho thuê rõ ràng và phân bổ tài khoản trước. SDK Raydium và các công cụ xử lý điều này một cách minh bạch; những người tích hợp hiếm khi cần cấp phát thủ công.

Tính toán tài khoản từ đầu

Giống như AMM v4, Stable AMM sử dụng seeded keys (không phải pure PDAs). Danh tính pool chính tắc được tính toán thông qua:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
Tương tự cho vaults, LP mint, target orders, v.v. Trong thực tế, hãy sử dụng SDK hoặc API để tìm nạp các địa chỉ được tính toán trước.

Đọc ở đâu

Nguồn: