Stable AMM ist ein unabhängiges Programm mit eigener Program ID. Es ist kein Modus des AMM v4 Programms und wird nicht „durch” AMM v4 gehandelt — es wird separat bereitgestellt, aktualisiert und aufgerufen. Es ähnelt AMM v4 nur in Gebühren- und Account-Layout-Konventionen.
Upgrade vom 2026-06-22 — Entfernung von inaktivem OpenBook (Market) Code. Stable AMM hat schon lange keine Aufträge mehr auf OpenBook gepostet; der Orderbook-Market-Making-Pfad ist seit Jahren inaktiv. Dieses Upgrade löscht die verbleibenden marktbezogenen Accounts und Code — es ändert nicht das Live-Trading-Verhalten.Zwei Konsequenzen für Integratoren:
- Kleinere Account-Layouts.
SwapBaseIn / SwapBaseOut (18 → 9), Deposit (14 → 12), und Withdraw (21/22 → 12) entfernen die inaktiven Serum/Market-Accounts. Alte Layouts werden aus Gründen der Rückwärtskompatibilität weiterhin geparst. WithdrawPnl (16 → 10) ist eine harte Breaking Change ohne Kompatibilitätspfad (nur Admin).
- Die meisten Anweisungen werden entfernt. Nur
SwapBaseIn, SwapBaseOut, Deposit, Withdraw und WithdrawPnl bleiben aufrufbar. Alle anderen Anweisungen können nicht mehr aufgerufen werden.
Changelog: reference/changelog.
Anweisungsbestand
Aufrufbar
| Anweisung | Kategorie | Hinweise |
|---|
Deposit | Liquidität | Liquidität hinzufügen, LP erhalten. Neues 12-Account-Layout; altes 14-Account-Layout noch kompatibel. |
Withdraw | Liquidität | LP verbrennen, beide Seiten erhalten. Neues 12-Account-Layout; altes 21/22-Account-Layout noch kompatibel. |
SwapBaseIn | Swap | Exact-Input-Swap. Neues 9-Account-Layout; altes 18-Account-Layout noch kompatibel. |
SwapBaseOut | Swap | Exact-Output-Swap. Neues 9-Account-Layout; altes 18-Account-Layout noch kompatibel. |
WithdrawPnl | Admin | Protokollgebühren einziehen. Neues 10-Account-Layout (harte Breaking Change — keine Kompatibilität mit altem Layout). |
Entfernt (nicht mehr aufrufbar)
Diese wurden beim Upgrade vom 2026-06-22 entfernt und können nicht mehr aufgerufen werden. Siehe Entfernte Anweisungen.
| Anweisung | Frühere Kategorie | Früherer Zweck |
|---|
Initialize | Lebenszyklus | Pool erstellen. |
PreInitialize | Lebenszyklus | Legacy-Vorab-Zuordnungs-Helfer. |
InitModelData | Modelleinrichtung | Lookup-Tabelle erstellen und initialisieren. |
UpdateModelData | Modelleinrichtung | Bis zu 5 Tabellenelemente pro Aufruf einfügen. |
MonitorStep | Crank | OpenBook-Fills abwickeln, Aufträge neu posten. |
SetParams | Admin | Pool-Parameter ändern. |
WithdrawSrm | Legacy | SRM-Gebührenrabatt-Rückerstattungen einziehen. |
SimulateInfo | Diagnose | Read-Only-Quote-Helfer. |
Deposit
Liquidität hinzufügen, LP-Token erhalten.
Argumente
max_coin_amount: u64
max_pc_amount: u64
base_side: u64 // 0 = base on coin, 1 = base on pc
Accounts — neues Layout, 12 Accounts (schreibbar W, Unterzeichner S)
| # | Name | W | S | Hinweise |
|---|
| 0 | token_program | | | SPL Token. |
| 1 | amm | W | | Pool’s AmmInfo. |
| 2 | amm_authority | | | Programmweite PDA. |
| 3 | amm_target_orders | W | | |
| 4 | amm_lp_mint | W | | LP Mint. |
| 5 | amm_coin_vault | W | | Pool Coin Vault. |
| 6 | amm_pc_vault | W | | Pool PC Vault. |
| 7 | model_data_account | | | Read-Only Lookup-Tabelle. |
| 8 | user_source_coin | W | | Coin-Eingabe des Benutzers. |
| 9 | user_source_pc | W | | PC-Eingabe des Benutzers. |
| 10 | user_dest_lp | W | | LP ATA des Benutzers. |
| 11 | user_source_owner | | S | Transaktionsunterzeichner. |
Kompatibilität: amm_open_orders (altes #3) und serum_market (altes #9) werden entfernt. Wenn 14 Accounts übergeben werden, wird die Anweisung mit dem alten 14-Account-Layout geparst; die Serum-Accounts werden ignoriert.
Mathematik — Standard-Pro-Rata unter Verwendung der Lookup-Tabelle zur Berechnung des Verhältnisses. Das SDK berechnet das Coin/PC-Paar für die gewünschte LP-Menge und prüft gegen maximale Obergrenzen.
Withdraw
LP verbrennen, beide Seiten pro-rata erhalten.
Argumente
amount: u64 // LP-Token zum Verbrennen
Accounts — neues Layout, 12 Accounts (schreibbar W, Unterzeichner S)
| # | Name | W | S | Hinweise |
|---|
| 0 | token_program | | | SPL Token. |
| 1 | amm | W | | Pool’s AmmInfo. |
| 2 | amm_authority | | | Programmweite PDA. |
| 3 | amm_target_orders | W | | |
| 4 | amm_lp_mint | W | | LP Mint. |
| 5 | amm_coin_vault | W | | Pool Coin Vault. |
| 6 | amm_pc_vault | W | | Pool PC Vault. |
| 7 | model_data_account | | | Read-Only Lookup-Tabelle. |
| 8 | user_source_lp | W | | LP-Quelle des Benutzers. |
| 9 | user_dest_coin | W | | Coin-Ausgabe des Benutzers. |
| 10 | user_dest_pc | W | | PC-Ausgabe des Benutzers. |
| 11 | user_lp_owner | | S | Transaktionsunterzeichner. |
Kompatibilität: neun Serum-Accounts (amm_open_orders, serum_program, serum_market, serum_coin_vault, serum_pc_vault, serum_vault_signer, serum_event_q, serum_bids, serum_asks) werden entfernt. Die alten 21- oder 22-Account-Layouts werden weiterhin akzeptiert. Beachten Sie jedoch, dass die Referral-Fee-Logik für den 22. optionalen referrer_pc_wallet Account entfernt wurde — er kann weiterhin übergeben werden, hat aber keine Auswirkung mehr.
Vorbedingungen
user_source_lp hält mindestens amount.
Nachbedingungen
amount LP-Token werden verbrannt.
- Der Benutzer erhält Coin- und PC-Beträge gemäß dem aktuellen Pro-Rata, angepasst für aufgelaufene Gebühren.
SwapBaseIn
Exact-Input-Swap unter Verwendung der Lookup-Tabelle für Preisgestaltung.
Argumente
amount_in: u64
minimum_amount_out: u64
Accounts — neues Layout, 9 Accounts (schreibbar W, Unterzeichner S)
| # | Name | W | S | Hinweise |
|---|
| 0 | spl_token program | | | SPL Token. |
| 1 | amm | W | | Pool’s AmmInfo. |
| 2 | amm_authority | | | Programmweite PDA. |
| 3 | amm_coin_vault | W | | Pool Coin Vault. |
| 4 | amm_pc_vault | W | | Pool PC Vault. |
| 5 | model_data_account | | | Read-Only Lookup-Tabelle. |
| 6 | user_source_token | W | | Input-Token-Account des Benutzers. |
| 7 | user_destination_token | W | | Output-Token-Account des Benutzers. |
| 8 | user_source_owner | | S | Benutzer (Transaktionsunterzeichner). |
Kompatibilität: die neun OpenBook-Accounts (amm_open_orders, serum_program, serum_market, serum_bids, serum_asks, serum_event_queue, serum_coin_vault, serum_pc_vault, serum_vault_signer) werden entfernt. Wenn die Anzahl der übergebenen Accounts nicht 9 ist, wird die Anweisung mit dem alten 18-Account-Layout geparst; die Serum-Accounts müssen weiterhin ihre Positionen einnehmen, aber ihr Inhalt wird nicht mehr validiert oder verwendet.
Vorbedingungen
amm.status erlaubt Swap.
user_source_token hält ≥ amount_in.
Nachbedingungen
- Benutzer verliert
amount_in, gewinnt amount_out ≥ minimum_amount_out.
- Pool-Gebühren erhöhen
need_take_pnl_* Zähler.
Mathematik — Lookup-Tabellen-Interpolation wie in products/stable/math beschrieben.
SwapBaseOut
Exact-Output-Swap (Umkehrung von SwapBaseIn). Gleiches 9-Account-Layout, andere Mathematik-Richtung.
Argumente
max_amount_in: u64
amount_out: u64
WithdrawPnl
Nur Admin. Aufgelaufene Protokollgebühren von need_take_pnl_* in designierte PnL-Accounts einziehen.
Harte Breaking Change — kein Kompatibilitätspfad. Diese Anweisung hat kein Parsing für das alte Layout. Das Senden des alten Layouts schlägt mit Validierungsfehlern wie InvalidTokenCoin fehl, da die Accounts nicht ausgerichtet sind (altes #3 war open_orders). Admin-Tools, die WithdrawPnl aufrufen, müssen auf das neue 10-Account-Layout aktualisiert werden.
Argumente — keine (zustandsgesteuert).
Accounts — neues Layout, feste 10 Accounts, nur Admin (schreibbar W, Unterzeichner S)
| # | Name | W | S | Hinweise |
|---|
| 0 | spl_token program | | | SPL Token. |
| 1 | amm | W | | Pool’s AmmInfo. |
| 2 | amm_authority | | | Programmweite PDA. |
| 3 | amm_coin_vault | W | | Pool Coin Vault. |
| 4 | amm_pc_vault | W | | Pool PC Vault. |
| 5 | amm_target_orders | W | | |
| 6 | model_data | | | Lookup-Tabelle. |
| 7 | user_coin | W | | Coin-Account des Admins (erhält Gebühr). |
| 8 | user_pc | W | | PC-Account des Admins (erhält Gebühr). |
| 9 | amm_admin | | S | Pool-Admin (Unterzeichner). |
Logikänderung: wenn die verfügbaren Mittel des Pools nicht ausreichen, um das aufgelaufene PnL abzubuchen, wird der Pool nicht mehr in CancelAllOrdersState / Disabled versetzt; die Anweisung gibt stattdessen direkt TakePnlError zurück. Der optionale referrer_pc_wallet wurde ebenfalls entfernt.
Vorbedingungen
amm_admin muss autorisiert sein.
Nachbedingungen
need_take_pnl_coin und need_take_pnl_pc werden auf die Admin-Accounts übertragen.
- Zähler werden auf Null gesetzt.
Entfernte Anweisungen
Die folgenden Anweisungen wurden beim Upgrade vom 2026-06-22 entfernt und können nicht mehr aufgerufen werden. Sie werden hier nur dokumentiert, damit Integratoren sie in historischen Transaktionen und SDKs erkennen können.
Initialize — bootstrappte früher einen neuen Stable AMM Pool. Entfernt.
PreInitialize — Legacy-Vorab-Zuordnungs-Helfer. Entfernt.
InitModelData — erstellte und initialisierte früher die ModelDataInfo Lookup-Tabelle. Entfernt.
UpdateModelData — füllte früher bis zu 5 Lookup-Tabellen-Elemente pro Aufruf. Entfernt.
MonitorStep — der OpenBook-Crank, der Fills abwickelte und das Auftrags-Grid neu postete. Bereits lange inaktiv, nachdem der Pool aufgehört hatte, auf OpenBook zu posten; jetzt entfernt.
SetParams — Admin-Parameteränderungen (Status, Gebühren, Besitzer, Modell-Datenschlüssel, etc.). Entfernt.
WithdrawSrm — zog SRM-Gebührenrabatt-Rückerstattungen aus frühen Serum-Ära-Pools ein. Entfernt.
SimulateInfo — Read-Only-Quote-Helfer. Entfernt; verwenden Sie stattdessen die Off-Chain-Stable-Curve-Helfer des SDK zum Quoting (siehe Code-Demos).
Nächste Schritte
- Accounts — für Account-Feldlayouts und Größen.
- Mathematik — für die Lookup-Tabellen-Interpolationslogik.
- Code-Demos — um zu sehen, wie diese vom SDK aufgerufen werden.
Quellen:
raydium-stable/program/src/instruction.rs (enum und pack/unpack)
raydium-stable/program/src/processor.rs (Ausführungslogik)