메인 콘텐츠로 건너뛰기

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 자동 번역입니다. 모든 내용은 영문판을 기준으로 합니다.영문판 보기 →
AMM v4는 모든 작업이 OpenBook 상태에 접근하기 때문에 CPMM이나 CLMM보다 훨씬 더 많은 계정을 필요로 합니다. 이 페이지는 계정을 “풀 소유” 및 “OpenBook 소유” 섹션으로 분류하여 통합자가 어느 쪽이 어느 쪽인지 빠르게 확인할 수 있도록 합니다.

계정 목록

AMM v4 풀은 생성 시 정확히 하나의 OpenBook 마켓에 바인딩됩니다. 전체 현재 상태는 다음과 같습니다:
카테고리계정소유자역할
AmmInfoAMM v4 프로그램풀 상태: 누적된 수수료, 상태, 볼트 및 OpenBook 마켓 참조.
amm_authorityAMM v4 프로그램볼트 이동에 서명하는 프로그램 소유 PDA. 모든 AMM v4 풀에서 공유됩니다.
amm_open_ordersOpenBook이 마켓에 대한 풀의 OpenBook OpenOrders 계정.
amm_target_ordersAMM v4 프로그램OpenBook에 다시 게시할 목표 지정가 주문의 풀 측 그리드.
pool_coin_token_accountSPL 토큰풀의 코인 측 볼트 (amm_authority의 ATA).
pool_pc_token_accountSPL 토큰풀의 pc 측 볼트.
lp_mintSPL 토큰대체 가능한 LP민트.
pool_withdraw_queueAMM v4 프로그램지연된 출금을 위한 레거시 큐; 길이 0으로 유지됩니다.
pool_temp_lpAMM v4 프로그램Initialize 중에 사용되는 보조 LP 계정.
마켓 (OpenBook)serum_marketOpenBook마켓 자체 (기본/견적 민트, 볼트 서명자 등).
마켓serum_bids, serum_asksOpenBook매수 및 매도 큐.
마켓serum_event_queueOpenBook보류 중인 이벤트 (체결, 취소).
마켓serum_coin_vault, serum_pc_vaultSPL 토큰OpenBook의 마켓 수준 볼트.
마켓serum_vault_signerOpenBookserum_*_vault 이동에 서명하는 마켓 수준 PDA.
참고: “serum”은 하위 호환성을 위해 AMM v4의 IDL 및 필드 이름에서 접두사로 유지됩니다. 현재는 OpenBook 마켓을 나타냅니다.

AmmInfo

풀의 루트 상태 계정입니다. 풀과 OpenBook 참조를 모두 인라인으로 포함하기 때문에 규모가 큽니다 (약 752바이트).
// programs/amm/src/state.rs (abridged; field order / names follow the IDL)
pub struct AmmInfo {
    pub status: u64,           // bitmask: swap/deposit/withdraw/crank enabled
    pub nonce:  u64,           // bump used to derive amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // internal state machine
    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 market
    pub pc_lot_size:   u64,
    pub min_price_multiplier: u64,
    pub max_price_multiplier: u64,
    pub sys_decimal_value: u64,

    pub fees: Fees,            // trade/protocol/fund fee rates
    pub state_data: StateData,

    // Pool-owned accounts:
    pub coin_vault: Pubkey,
    pub pc_vault:   Pubkey,
    pub coin_vault_mint: Pubkey,
    pub pc_vault_mint:   Pubkey,
    pub lp_mint:  Pubkey,
    pub open_orders: Pubkey,   // pool's OpenOrders on OpenBook
    pub market: Pubkey,        // OpenBook market
    pub market_program: Pubkey, // OpenBook program ID
    pub target_orders: Pubkey,
    pub withdraw_queue: Pubkey,
    pub lp_vault:       Pubkey, // = pool_temp_lp
    pub owner: Pubkey,          // admin (multisig)
    pub lp_reserve: u64,
    pub padding: [u64; 3],
}

pub struct Fees {
    pub min_separate_numerator:   u64,     // 5
    pub min_separate_denominator: u64,     // 10_000
    pub trade_fee_numerator:      u64,     // 25  → used by OpenBook integration
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → protocol's share OF the swap fee
    pub pnl_denominator:          u64,     // 100 → so 12/100 = 12% of fee, = 0.03% of volume
    pub swap_fee_numerator:       u64,     // 25  → 0.25% gross swap fee
    pub swap_fee_denominator:     u64,     // 10_000
}

pub struct StateData {
    pub need_take_pnl_coin: u64,
    pub need_take_pnl_pc:   u64,
    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_acc_pc_fee:    u64,
    pub swap_pc_in_amount:  u128,
    pub swap_coin_out_amount: u128,
    pub swap_acc_coin_fee:  u64,
}
통합자 관점의 필드:
  • coin_vault, pc_vault — 풀의 SPL 토큰 볼트. Serum/OpenBook 관례에 따라 cointoken_0 (기본), pctoken_1 (견적)입니다.
  • coin_decimals, pc_decimals — 민트와 일치합니다.
  • open_orders, target_orders, market — 모든 스왑/예치/출금 명령어에 전달되어야 합니다.
  • fees.swap_fee_numerator / swap_fee_denominator — 결합된 거래 수수료. 기본값 25 / 10_000 = 0.25%.
  • status — 작업을 제어하는 비트마스크. AdminSetStatus를 통해 관리자가 설정 가능합니다.
  • state_data.need_take_pnl_* — 누적된 총 수수료와 수집된 금액 간의 차이. TakePnl이 이를 0으로 만듭니다.

OpenBook 연결

더 이상 활성화되지 않음. AMM v4 풀은 더 이상 유동성을 OpenBook과 공유하지 않습니다. 지정가 주문 그리드가 비활성화되었습니다. 이 섹션에서 설명하는 OpenBook 계정은 각 풀의 AmmInfo에 남아 있으며 V1 스왑 진입점 및 Initialize, Deposit, Withdraw에 의해 검증되지만 하위 호환성을 위해 참조하는 온-북 상태는 실제로 비어 있습니다. V2 스왑 진입점 (SwapBaseInV2 / SwapBaseOutV2)을 사용하세요. 이들은 이러한 계정을 전혀 필요로 하지 않으며 오늘날의 정규 실행 경로를 나타냅니다.
AMM v4 풀에서 V1 읽기 또는 쓰기 명령어를 호출할 때 OpenBook 계정을 전달해야 합니다. 프로그램이 이들을 다시 파생하고 검증하므로 일치하지 않는 세트를 전달하면 되돌아갑니다. (V2 스왑 변형은 이러한 계정을 전혀 필요로 하지 않습니다.)
const market = ...;  // OpenBook market PublicKey

// Fields OpenBook exposes on its market account:
const marketDecoded = OpenBookMarket.decode(marketAccountData);
const {
  bids:           serumBids,
  asks:           serumAsks,
  eventQueue:     serumEventQueue,
  requestQueue:   serumRequestQueue,
  baseVault:      serumCoinVault,
  quoteVault:     serumPcVault,
  vaultSignerNonce,
} = marketDecoded;

const serumVaultSigner = PublicKey.createProgramAddressSync(
  [market.toBuffer(), u64ToBytes(vaultSignerNonce)],
  OPENBOOK_PROGRAM_ID,
);
AMM의 amm_open_orders는 OpenBook 소유 계정으로 이 마켓에 있는 풀의 지정가 주문 상태를 보유합니다: 활성 주문, 정산된 잔액, 리퍼러 등. amm_target_orders는 AMM 측: 프로그램이 현재 게시된 것과 저렴하게 비교하고 차이를 배치/취소할 수 있도록 AMM의 의도된 그리드 (각 주문 슬롯에 대한 가격/크기)를 보유합니다.

권한 PDA

전체 AMM v4 프로그램에는 정확히 하나의 amm_authority PDA가 있습니다. 그 시드는 간단합니다 (["amm authority"]). 모든 AmmInfo에 저장된 범프입니다. 이 권한이 모든 AMM v4 풀의 모든 토큰 이동에 서명합니다.
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
OpenBook 작업에 서명하기 위해 풀당 파생된 별도의 풀 범위 권한이 있습니다 (amm_authority 위는 실제로 이 프로그램의 설계에서 둘 다를 다루며, 다양한 버전은 다른 파생을 사용했으므로 코드에서 특정 풀의 AmmInfo.nonce를 확인하세요).

볼트

풀의 SPL 토큰 볼트는 owneramm_authority인 표준 토큰 계정입니다. ATA가 아닙니다. 주소는 ["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id] 시드로 Initialize에서 파생된 특정 PDA입니다. 주소는 AmmInfo에 저장되며, 파생은 일회성 호기심 거리입니다. Token-2022는 지원되지 않습니다. 프로그램은 모든 볼트 이동에 대해 SPL 토큰의 프로그램 ID를 하드코딩합니다. AMM v4 풀을 Token-2022 민트에 바인딩하려고 하면 Initialize에서 실패합니다.

LP민트

amm_authority이 권한인 고전적인 SPL 토큰 민트입니다. 총 공급량은 풀의 LP 소유권을 추적합니다. LP를 소각하면 양쪽 볼트에서 토큰을 비례적으로 반환합니다. AMM v4가 CPMM보다 앞서므로 풀 상태에 lp_supply 미러가 없습니다. 민트의 온체인 공급량을 직접 읽으세요.

상태 비트마스크

AmmInfo.status는 작업을 제어합니다. 비트 (위치는 프로그램 버전마다 다를 수 있으니 소스로 확인하세요):
비트플래그효과
0SWAP_DISABLEDSwap*이 거부됩니다.
1DEPOSIT_DISABLEDDeposit이 거부됩니다.
2WITHDRAW_DISABLEDWithdraw이 거부됩니다.
3CLMM_LIKE_MIGRATEops가 사용하는 마이그레이션 게이트 플래그.
Raydium 멀티시그는 AdminCancelOrders, AdminSetParams 등을 통해 이들을 설정합니다.

관찰 / 오라클

AMM v4에는 전용 관찰 계정이 없습니다. 온체인 TWAP이 필요한 다른 프로토콜은 일반적으로 OpenBook의 북 크로싱을 간접적으로 소비하거나 오프체인을 읽습니다. 프로그램 지원으로 Raydium TWAP이 필요하면 CPMM 또는 CLMM을 사용하세요.

처음부터 풀의 계정 파생하기

AMM v4가 결정적 페어당 PDA를 위해 설계되지 않았기 때문에 (이는 그 Solana 관례보다 먼저), 정규 amm_id는 다음으로 파생된 시드 키쌍입니다:
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
같은 시드 키 패턴이 amm_open_orders, amm_target_orders, amm_withdraw_queue, pool_temp_lp, pool_coin_token_account, pool_pc_token_accountlp_mint에 적용됩니다. SDK와 API가 이를 사전 계산합니다. raydium-sdk-v2Liquidity.getAssociatedPoolKeys를 참조하세요. 실제로 통합자는 GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID>에서 또는 SDK에서 풀의 전체 계정 세트를 읽습니다. 수동 파생은 거의 필요하지 않습니다.

수명 주기 빠른 참조

이벤트생성된 계정제거된 계정
Initialize2amm_info, amm_open_orders, amm_target_orders, 볼트, lp_mint, pool_withdraw_queue, pool_temp_lp
Deposit— (사용자 LP ATA 생성 가능)
Withdraw
SwapBaseIn / SwapBaseOut— (사용자 ATA 생성 가능)
TakePnl
MonitorStep (크랭크)
풀과 그 계정은 무기한 지속됩니다. 유동성이 완전히 출금되더라도 AmmInfo는 유지됩니다.

어디서 무엇을 읽을지

출처: