Chuyển đến nội dung chính
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 là một chương trình riêng; cấu trúc tài khoản phía pool của nó tương tự AMM v4 (AmmInfo, vaults, authority), và nó còn có một tài khoản ModelDataInfo lưu trữ bảng tra cứu. Trang này bao gồm cả hai.

Danh sách tài khoản

Thuần AMM. Stable AMM giữ tất cả thanh khoản trong các vault riêng của nó và không phụ thuộc vào OpenBook. Nó từng có một đường dẫn market-making OpenBook vào đầu cuộc đời của nó, nhưng đường dẫn đó đã không hoạt động trong nhiều năm, và bản nâng cấp 2026-06-22 đã loại bỏ mã còn sót lại. Do đó, các tài khoản thị trường serum_*amm_open_orders dưới đây là di sản: chúng có thể vẫn xuất hiện trong các giao dịch bố cục cũ để tương thích ngược, nhưng chương trình không xác thực hoặc đọc chúng, và các hướng dẫn bố cục mới sẽ bỏ qua chúng hoàn toàn.
Danh sách tài khoản hoạt động hiện nay hoàn toàn ở phía pool:
Danh mụcTài khoảnChủ sở hữuVai trò
PoolAmmInfoChương trình StableTrạng thái pool, tham chiếu đến vaults và tài khoản dữ liệu mô hình.
Poolamm_authorityChương trình StablePDA do chương trình sở hữu ký các lần di chuyển vault. Được chia sẻ trên tất cả các pool Stable AMM.
Poolamm_target_ordersChương trình StableTài khoản lưới phía pool (được giữ lại trong bố cục; không còn điều khiển các lệnh OpenBook).
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.
Mô hìnhmodel_data_accountChương trình StableBảng tra cứu: 50.000 × DataElement.
Di sảnamm_open_ordersOpenBookTài khoản OpenOrders OpenBook cũ của pool. Không sử dụng.
Di sảnserum_marketOpenBookThị trường OpenBook. Không sử dụng.
Di sảnserum_bids, serum_asksOpenBookHàng đợi bid/ask. Không sử dụng.
Di sảnserum_event_queueOpenBookHàng đợi sự kiện. Không sử dụng.
Di sảnserum_coin_vault, serum_pc_vaultSPL TokenVaults cấp thị trường OpenBook. Không sử dụng.
Di sảnserum_vault_signerOpenBookNgười ký vault cấp thị trường. Không sử dụng.

AmmInfo

Tài khoản trạng thái gốc. Bố cục gần như giống hệt AMM v4 — các 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ỏ đến bảng tra cứu.
// raydium-stable/program/src/state.rs (abridged)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce: u64,                     // bump for amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // state machine (IdleState, etc.)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // mirrors 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,                     // see below
    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,         // ← THE LOOKUP TABLE
    pub open_orders: Pubkey,            // legacy: OpenBook OpenOrders (unused post-decoupling)
    pub serum_market: Pubkey,           // legacy: unused post-decoupling
    pub serum_program: Pubkey,          // legacy: unused post-decoupling
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // admin key
    pub client_order_id: u64,
    pub lp_amount: u64,                 // LP supply
    pub lp_net: u64,                    // LP value metric
    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% of fee = 0.03% of volume
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // accrued protocol fee (coin)
    pub need_take_pnl_pc: u64,          // accrued protocol fee (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 người tích hợp:
  • model_data_key — địa chỉ của bảng tra cứu. Phải được truyền cho mọi hướng dẫn.
  • 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 vault của pool.
  • status — bitmask kiểm soát swap/deposit/withdraw/crank.
  • out_put.need_take_pnl_* — được quét 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,         // table X (e.g., coin amount)
    pub y: u64,         // table Y (e.g., pc amount)
    pub price: u64,     // price at (x, y)
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized or Uninitialized
    pub multiplier: u64,                // scale factor for x, y (e.g., 10^6)
    pub valid_data_count: u64,          // how many elements are populated
    pub elements: [DataElement; 50000], // the table itself
}
Vòng đời: Các hướng dẫn thiết lập đã xây dựng các bảng này — InitModelData (tạo tài khoản) và UpdateModelData (điền các phần tử, đặt valid_data_count) — đã bị xóa trong bản nâng cấp 2026-06-22. Các bảng trên các pool hiện có hiện đã cố định. Tại thời chạy, các hướng dẫn có thể gọi còn lại vẫn tiêu thụ chúng:
  • Swap / deposit / withdraw gọi các hàm tra cứu thực hiện 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,         // X coordinate (e.g., token_a balance, scaled by multiplier)
    pub y: u64,         // Y coordinate (e.g., token_b balance, scaled by multiplier)
    pub price: u64,     // price (x/y in scaled form, scaled by multiplier)
}
Khi điền bảng, quản trị viên chỉ định các giá trị này đã được chia tỷ lệ. Chương trình không xác thực thứ tự sắp xếp trên chuỗi (để tăng 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 duy nhất trên toàn chương trình được lấy từ seed ["amm authority"]. Nó sở hữu tất cả các vault pool và ký các lần di chuyển 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 ATA.
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

Struct out_put theo dõi:
  • need_take_pnl_coin, need_take_pnl_pc — phí giao thức tích lũy nhưng chưa được quét. WithdrawPnl di chuyển những phí này ra ngoài.
  • swap_coin_in_amount, swap_pc_in_amount, v.v. — các bộ đếm phân tích.
Tính toán tài sản pool (sau khi tách rời). Vì không còn quỹ nào được ký quỹ dưới dạng các lệnh mở OpenBook nữa, tổng tài sản của pool hiện được tính toàn bộ từ các vault:
Cũ: tổng tài sản = số dư vault + quỹ lệnh mở (native_coin_total / native_pc_total) − PnL đang chờ (need_take_pnl)
Mới: tổng tài sản = số dư vault − PnL đang chờ (need_take_pnl)
Các indexer và mã báo giá đã tái cấu trúc giá trị pool từ số dư OpenOrders phải loại bỏ thuật ngữ đó.

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 việc tạo một pool Stable yêu cầu cấp phát rent và tài khoản rõ ràng. SDK và công cụ Raydium 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 phân bổ thủ công.

Lấy tài khoản từ đầu

Giống như AMM v4, Stable AMM sử dụng khóa được seed (không phải PDA thuần). Danh tính pool chính tắc được lấy thông qua:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
Tương tự đối với 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: