메인 콘텐츠로 건너뛰기

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.

이 페이지는 AI 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
Stable AMM은 AMM v4의 풀 측 계정 구조(AmmInfo, vault, authority)를 공유하며, 조회 테이블을 저장하는 ModelDataInfo 계정을 추가로 필요로 합니다. 이 페이지에서는 둘 다 다룹니다.

계정 목록

Stable AMM 풀은 정확히 하나의 OpenBook 마켓에 연결됩니다. 전체 목록은 AMM v4와 유사합니다:
카테고리계정소유자역할
AmmInfoStable 프로그램풀 상태, vault, OpenBook, 모델 데이터 계정 참조
amm_authorityStable 프로그램vault 이동에 서명하는 프로그램 소유 PDA. 모든 Stable AMM 풀에서 공유됨.
amm_open_ordersOpenBook풀의 OpenBook OpenOrders 계정
amm_target_ordersStable 프로그램지정가 주문 풀 측 그리드
pool_coin_token_accountSPL Token풀의 coin 측 vault
pool_pc_token_accountSPL Token풀의 pc 측 vault
lp_mintSPL Token대체 가능 LP 민트
모델model_data_accountStable 프로그램조회 테이블: 50,000 × DataElement
마켓serum_marketOpenBookOpenBook 마켓
마켓serum_bids, serum_asksOpenBook매수/매도 큐
마켓serum_event_queueOpenBook이벤트 큐
마켓serum_coin_vault, serum_pc_vaultSPL TokenOpenBook 마켓 레벨 vault
마켓serum_vault_signerOpenBook마켓 레벨 vault 서명자

AmmInfo

루트 상태 계정. 레이아웃은 AMM v4와 거의 동일합니다(풀 매개변수, 소수, 수수료, vault/mint 참조)하며, 한 가지 추가 사항이 있습니다: 조회 테이블을 가리키는 model_data_key 필드.
// raydium-stable/program/src/state.rs (축약)
pub struct AmmInfo {
    pub account_type: u64,              // = 0 (AmmAccount)
    pub status: u64,                    // 비트마스크: swap/deposit/withdraw/crank 활성화
    pub nonce: u64,                     // amm_authority의 bump
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals: u64,
    pub state: u64,                     // 상태 머신 (IdleState 등)
    pub reset_flag: u64,
    pub min_size: u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,             // 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,                     // 아래 참조
    pub out_put: OutPutData,            // PnL, 스왑, 페널티 금액
    
    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,         // ← 조회 테이블
    pub open_orders: Pubkey,            // OpenBook OpenOrders
    pub serum_market: Pubkey,
    pub serum_program: Pubkey,
    pub target_orders: Pubkey,
    pub amm_admin: Pubkey,              // 관리자 키
    pub client_order_id: u64,
    pub lp_amount: u64,                 // LP 공급량
    pub lp_net: u64,                    // 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% = 거래량의 0.03%
    pub swap_fee_numerator: u64,        // 25
    pub swap_fee_denominator: u64,      // 10_000
}

pub struct OutPutData {
    pub need_take_pnl_coin: u64,        // 누적 프로토콜 수수료 (coin)
    pub need_take_pnl_pc: u64,          // 누적 프로토콜 수수료 (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,
}
통합자가 관심 있을 주요 필드:
  • model_data_key — 조회 테이블의 주소. 모든 명령어에 전달되어야 합니다.
  • fees — AMM v4와 동일한 구조. 기본값은 0.25% 거래 수수료, 0.22% LP / 0.03% 프로토콜 분할입니다.
  • coin_vault, pc_vault — 풀의 vault입니다.
  • status — swap/deposit/withdraw/crank 활성화를 제어하는 비트마스크입니다.
  • out_put.need_take_pnl_*WithdrawPnl에 의해 제거됩니다.

ModelDataInfo

조회 테이블. 가격/수량 포인트의 큰 희소 배열입니다.
// raydium-stable/program/src/state.rs
pub const ELEMENT_SIZE: usize = 50000;

pub struct DataElement {
    pub x: u64,         // 테이블 X (예: coin 금액)
    pub y: u64,         // 테이블 Y (예: pc 금액)
    pub price: u64,     // (x, y)에서의 가격
}

pub struct ModelDataInfo {
    pub account_type: u64,              // = 2 (ModleDataAccount)
    pub status: u64,                    // Initialized 또는 Uninitialized
    pub multiplier: u64,                // x, y의 스케일 팩터 (예: 10^6)
    pub valid_data_count: u64,          // 채워진 요소의 개수
    pub elements: [DataElement; 50000], // 테이블 자체
}
생명주기:
  1. InitModelData 계정을 생성하고 status = Initialized, multiplier = <관리자-제공>, valid_data_count = 0을 설정합니다.
  2. UpdateModelData(트랜잭션당 최대 5회 호출) 다음을 통해 요소를 채웁니다:
    • 입력: (index: u64, DataElement) 쌍의 배열.
    • 각각을 elements[index]에 씁니다.
    • index >= valid_data_count인 경우 valid_data_count를 증가시킵니다.
  3. Swap/deposit/withdrawelements[0..valid_data_count] 내에서 이진 검색 및 보간하는 조회 함수를 호출합니다.

DataElement

테이블의 원자 항목. 이진 검색이 작동하려면 정렬되어야 합니다(x 오름차순, y 내림차순, price 오름차순).
pub struct DataElement {
    pub x: u64,         // X 좌표 (예: token_a 잔액, multiplier로 스케일됨)
    pub y: u64,         // Y 좌표 (예: token_b 잔액, multiplier로 스케일됨)
    pub price: u64,     // 가격 (스케일된 형식의 x/y, multiplier로 스케일됨)
}
테이블을 채울 때 관리자가 이미 스케일된 값을 지정합니다. 프로그램은 체인 상에서 정렬 순서를 검증하지 않습니다(속도상의 이유), 따라서 정렬 실수는 잘못된 견적을 초래합니다.

Authority 및 vault

AMM v4와 동일:
  • **amm_authority**는 ["amm authority"] 시드로 파생된 단일 프로그램 범위 PDA입니다. 모든 풀의 vault를 소유하고 이동에 서명합니다.
  • Vault는 소유자가 amm_authority인 SPL Token 계정이며 ATA가 아닙니다.
Token-2022는 지원되지 않습니다.

상태 비트마스크

AMM v4와 동일합니다. swap/deposit/withdraw/crank 활성화 여부를 제어합니다.

수수료 및 PnL 추적

AMM v4와 동일합니다. out_put 구조는 다음을 추적합니다:
  • need_take_pnl_coin, need_take_pnl_pc — 누적되었지만 아직 제거되지 않은 프로토콜 수수료. WithdrawPnl이 이들을 제거합니다.
  • swap_coin_in_amount, swap_pc_in_amount 등 — 분석 카운터.

계정 크기

ModelDataInfo는 크습니다(약 1.2 MB, 50,000개 요소 × 요소당 24바이트이므로). 이것이 Stable 풀 생성을 위해 명시적인 렌트 및 계정 사전 할당이 필요한 이유입니다. Raydium SDK 및 도구는 이를 투명하게 처리합니다. 통합자는 거의 수동으로 할당할 필요가 없습니다.

처음부터 계정 파생

AMM v4와 마찬가지로 Stable AMM은 시드 키(순수 PDA가 아님)를 사용합니다. 표준 풀 신원은 다음을 통해 파생됩니다:
ammId = createWithSeed(
  owner: ammAuthority,
  seed: marketPubkey.toBase58().slice(0, 32),
  programId: STABLE_PROGRAM_ID,
)
vault, LP mint, target orders 등도 유사하게 파생됩니다. 실제로는 SDK나 API를 사용하여 사전 계산된 주소를 가져옵니다.

어디서 무엇을 읽을지

출처: