Zum Hauptinhalt springen

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.

Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
AMM v4 ist deutlich kontofreudiger als CPMM oder CLMM, da jede Operation OpenBook-Zustand berührt. Diese Seite unterteilt die Konten in „Pool-eigene” und „OpenBook-eigene” Abschnitte, damit ein Integrator schnell sehen kann, welche Seite welche ist.

Bestand

Ein AMM v4 Pool bindet sich bei der Erstellung an genau einen OpenBook Market. Die vollständige aktuelle Ansicht ist:
KategorieKontoBesitzerRolle
PoolAmmInfoAMM v4 ProgrammPool-Zustand: aufgelaufene Gebühren, Status, Referenzen zu Vaults und OpenBook Market.
Poolamm_authorityAMM v4 ProgrammVom Programm verwalteter PDA, der Vault-Bewegungen signiert. Von allen AMM v4 Pools gemeinsam genutzt.
Poolamm_open_ordersOpenBookDas OpenOrders-Konto des Pools auf OpenBook für diesen Market.
Poolamm_target_ordersAMM v4 ProgrammPool-seitige Gitterliste von Limit-Order-Zielen zum Zurückposten auf OpenBook.
Poolpool_coin_token_accountSPL TokenVault auf Coin-Seite des Pools (ATA von amm_authority).
Poolpool_pc_token_accountSPL TokenVault auf PC-Seite des Pools.
Poollp_mintSPL TokenFungibles LP Mint.
Poolpool_withdraw_queueAMM v4 ProgrammLegacy-Warteschlange für verzögerte Abhebungen; wird leer gehalten.
Poolpool_temp_lpAMM v4 ProgrammHilfs-LP-Konto, das während Initialize verwendet wird.
Market (OpenBook)serum_marketOpenBookDer Market selbst (Base/Quote Mints, Vault Signer, etc.).
Marketserum_bids, serum_asksOpenBookDie Bid- und Ask-Warteschlangen.
Marketserum_event_queueOpenBookAusstehende Ereignisse (Fills, Stornierungen).
Marketserum_coin_vault, serum_pc_vaultSPL TokenOpenBooks Market-Level-Vaults.
Marketserum_vault_signerOpenBookMarket-Level PDA, der serum_*_vault Bewegungen signiert.
Hinweis: Das Präfix „serum” wird in AMMs v4 IDL und Feldnamen aus Gründen der Abwärtskompatibilität beibehalten. Es bezieht sich auf den OpenBook Market von heute.

AmmInfo

Das Root-State-Konto des Pools. Groß (≈ 752 Bytes), weil es sowohl Pool- als auch OpenBook-Referenzen inline trägt.
// programs/amm/src/state.rs (gekürzt; Feldordnung / Namen folgen dem IDL)
pub struct AmmInfo {
    pub status: u64,           // Bitmaske: Swap/Deposit/Withdraw/Crank aktiviert
    pub nonce:  u64,           // Bump zur Ableitung von amm_authority
    pub order_num: u64,
    pub depth: u64,
    pub coin_decimals: u64,
    pub pc_decimals:   u64,
    pub state:         u64,    // interne Zustandsmaschine
    pub reset_flag:    u64,
    pub min_size:      u64,
    pub vol_max_cut_ratio: u64,
    pub amount_wave: u64,
    pub coin_lot_size: u64,    // spiegelt 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,            // Handels-/Protokoll-/Gebührensätze
    pub state_data: StateData,

    // Pool-eigene Konten:
    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,   // OpenOrders des Pools auf OpenBook
    pub market: Pubkey,        // OpenBook Market
    pub market_program: Pubkey, // OpenBook Programm 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  → wird von OpenBook Integration verwendet
    pub trade_fee_denominator:    u64,     // 10_000
    pub pnl_numerator:            u64,     // 12  → Anteil des Protokolls AN der Swap-Gebühr
    pub pnl_denominator:          u64,     // 100 → also 12/100 = 12% der Gebühr, = 0,03% des Volumens
    pub swap_fee_numerator:       u64,     // 25  → 0,25% brutto Swap-Gebühr
    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,
}
Felder relevant für Integratoren:
  • coin_vault, pc_vault — die SPL Token Vaults des Pools. coin ist nach Serum/OpenBook Konvention token_0 (Base), pc ist token_1 (Quote).
  • coin_decimals, pc_decimals — entsprechend den Mints.
  • open_orders, target_orders, market — müssen an jede Swap-/Deposit-/Withdraw-Anweisung weitergegeben werden.
  • fees.swap_fee_numerator / swap_fee_denominator — die kombinierte Handelsgebühr. Standard 25 / 10_000 = 0,25%.
  • status — Bitmaske, die Operationen steuert. Von Admin über AdminSetStatus konfigurierbar.
  • state_data.need_take_pnl_* — Differenz zwischen brutto aufgelaufenen Gebühren und dem, was bereits abgerufen wurde. TakePnl setzt diese zurück.

Die OpenBook-Integration

Nicht mehr aktiv. AMM v4 Pools teilen keine Liquidität mehr mit OpenBook — das Limit-Order-Gitter wurde deaktiviert. Die in diesem Abschnitt beschriebenen OpenBook-Konten bleiben auf der AmmInfo jedes Pools und werden immer noch von V1 Swap-Endpunkten validiert (und von Initialize, Deposit, Withdraw) zur Abwärtskompatibilität, aber der On-Book-Zustand, auf den sie verweisen, ist praktisch leer. Verwenden Sie die V2 Swap-Endpunkte (SwapBaseInV2 / SwapBaseOutV2), die diese Konten überhaupt nicht benötigen und den kanonischen Ausführungspfad darstellen.
Wenn Sie eine beliebige V1 Lese- oder Schreibanweisung auf einem AMM v4 Pool aufrufen, müssen Sie die OpenBook-Konten weitergeben. Das Programm leitet diese ab und validiert sie, daher führt das Weitergeben eines nicht übereinstimmenden Satzes zum Rollback. (Die V2 Swap-Varianten benötigen diese Konten überhaupt nicht.)
const market = ...;  // OpenBook Market PublicKey

// Felder, die OpenBook auf seinem Market-Konto verfügbar macht:
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_open_orders des AMM ist ein von OpenBook verwaltetes Konto, das den Limit-Order-Zustand des Pools auf diesem Market enthält: aktive Orders, ausgeglichene Guthaben, Referrer, etc. amm_target_orders ist auf AMM-Seite: es enthält das beabsichtigte Gitter des AMM (Preis/Größe für jeden Order-Slot), damit das Programm günstig mit dem aktuell geposteten Gitter vergleichen und die Differenz platzieren / stornieren kann.

Authority PDAs

Es gibt genau einen amm_authority PDA für das gesamte AMM v4 Programm. Sein Seed ist trivial (["amm authority"]) und sein Bump ist auf jedem AmmInfo gespeichert. Diese Authority signiert alle Token-Bewegungen für alle AMM v4 Pools.
const AMM_V4_PROGRAM_ID = new PublicKey(
  "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8",
);
const [ammAuthority] = PublicKey.findProgramAddressSync(
  [Buffer.from("amm authority")],
  AMM_V4_PROGRAM_ID,
);
Es gibt eine separate Pool-bezogene Authority, die pro Pool abgeleitet wird, um OpenBook-Operationen zu signieren (amm_authority oben deckt tatsächlich beide in diesem Programmdesign ab; verschiedene Versionen verwendeten verschiedene Ableitungen, daher überprüfen Sie den spezifischen AmmInfo.nonce des Pools im Code).

Vaults

Die SPL Token Vaults des Pools sind Standard-Token-Konten, deren owner amm_authority ist. Keine ATAs — ihre Adressen sind spezifische PDAs, die bei Initialize mit Seeds ["amm_associated_seed", coin_mint_or_pc_mint, market, amm_id] abgeleitet werden. Adressen sind auf AmmInfo gespeichert; Ableitung ist eine einmalige Kuriosität. Token-2022 wird nicht unterstützt. Das Programm codiert die Programm-ID des SPL Tokens für alle Vault-Bewegungen hart ein. Der Versuch, einen AMM v4 Pool an einen Token-2022 Mint zu binden, schlägt bei Initialize fehl.

LP Mint

Ein klassisches SPL Token Mint, dessen Authority amm_authority ist. Der Gesamtvorrat verfolgt das LP-Besitztum des Pools; das Verbrennen von LP gibt Token aus beiden Vaults proportional zurück. Da AMM v4 älter als CPMM ist, gibt es keinen lp_supply Mirror im Pool-Zustand — lesen Sie die On-Chain Versorgung des Mints direkt.

Status Bitmaske

AmmInfo.status steuert Operationen. Bits (Position kann sich zwischen Programmversionen unterscheiden — überprüfen Sie über den Quellcode):
BitFlagEffekt
0SWAP_DISABLEDSwap* lehnt ab.
1DEPOSIT_DISABLEDDeposit lehnt ab.
2WITHDRAW_DISABLEDWithdraw lehnt ab.
3CLMM_LIKE_MIGRATEMigrations-Gate-Flag, das von Ops verwendet wird.
Das Raydium Multisig setzt diese über AdminCancelOrders, AdminSetParams, etc.

Beobachtung / Oracle

AMM v4 hat kein dediziertes Beobachtungskonto. Andere Protokolle, die einen On-Chain TWAP benötigen, konsumieren OpenBooks Buch-Crossings indirekt oder lesen Off-Chain. Wenn Sie einen Raydium TWAP mit Programmunterstützung benötigen, verwenden Sie CPMM oder CLMM.

Ableitung der Pool-Konten von Grund auf

Da AMM v4 nicht für deterministische Pro-Paar-PDAs entwickelt wurde (es prägt diese Solana-Konvention), ist die kanonische amm_id ein mit Seed erstellter Keypair, der abgeleitet wird mit:
ammId = createWithSeed(
  owner: ammAuthority,
  seed:  marketPubkey.toBase58().slice(0, 32),
  programId: AMM_V4_PROGRAM_ID,
)
Das gleiche mit Seed erstellte Schlüsselmuster gilt für amm_open_orders, amm_target_orders, amm_withdraw_queue, pool_temp_lp, pool_coin_token_account, pool_pc_token_account und lp_mint. Das SDK und die API berechnen diese im Voraus für Sie; siehe raydium-sdk-v2’s Liquidity.getAssociatedPoolKeys. In der Praxis lesen Integratoren den vollständigen Kontosatz des Pools von GET https://api-v3.raydium.io/pools/info/ids?ids=<POOL_ID> oder vom SDK. Manuelle Ableitung ist selten erforderlich.

Lebenszyklusreferenz

EreignisErstellte KontenGelöschte Konten
Initialize2amm_info, amm_open_orders, amm_target_orders, Vaults, lp_mint, pool_withdraw_queue, pool_temp_lp
Deposit— (kann User LP ATA erstellen)
Withdraw
SwapBaseIn / SwapBaseOut— (kann User ATA erstellen)
TakePnl
MonitorStep (Crank)
Pools und ihre Konten bleiben auf unbestimmte Zeit bestehen. Selbst wenn die Liquidität vollständig abgehoben ist, bleibt AmmInfo erhalten.

Was wo gelesen wird

Quellen: