Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Diese Seite ergänzt products/clmm/accounts (was die Accounts sind) und products/clmm/math (was die Mathematik ist). Sie ist maßgeblich für Argumente und Account-Reihenfolge; spezifische Byte-Layouts stammen aus der IDL.Das Programm-Upgrade 2026-09 hat CLMM auf Anchor 1.0.2 / Solana 3.1.10 neu aufgebaut, die Admin-Anweisung CollectExcessLamports hinzugefügt und geändert, was CreateAmmConfig in owner / fund_owner schreibt. Keine benutzergerichtete Anweisung hat ihre Accounts, Argumente oder Mathematik geändert. Siehe den Changelog-Eintrag vom 2026-09-30.

Anweisungsübersicht

Es gibt keine Init-Tick-Array-Anweisung, und keine ist erforderlich. Ein Tick-Array wird innerhalb OpenPosition* / IncreaseLiquidity* durch TickArrayState::get_or_create_tick_array erstellt, bezahlt von payer. Übergeben Sie die (möglicherweise noch nicht initialisierte, vom System gehörende) Tick-Array-PDA als tick_array_lower / tick_array_upper und das Programm ordnet sie zu, wenn sie fehlt. OpenLimitOrder macht dasselbe für sein einzelnes tick_array.
Die meisten Admin-only-Anweisungen (CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) werden durch den hardcodierten admin-Pubkey des Programms gated. CreatePermissionPda / ClosePermissionPda akzeptieren entweder den admin-Pubkey oder einen dedizierten permission_pda_admin-Schlüssel; CreateSupportMintAssociated / CloseSupportMintAssociated akzeptieren entweder den admin-Pubkey oder einen dedizierten Support-Mint-Eigentümer-Schlüssel; CollectExcessLamports akzeptiert entweder den admin-Pubkey oder ein dediziertes Collect-Lamports-Wallet. Reward-Stream-Admin-Anweisungen (TransferRewardOwner, CollectRemainingRewards) werden durch den Reward-Funder gated, nicht durch den Programm-Admin. V2-Suffix bedeutet „unterstützt Token-2022 auf Vaults / NFT, erfordert Bitmap-Erweiterungs-Slot”. Das SDK wählt V2 standardmäßig für neue Pools.

CreatePool

Argumente
Accounts (gekürzt)
Die Slots 10 und 11 sind pro-Mint, nicht „SPL Token dann Token-2022”. Jeder wird durch mint::token_program auf dem passenden Mint eingeschränkt, also für einen Pool, dessen token_mint_0 Token-2022 ist und token_mint_1 klassisches SPL ist, müssen Sie Token-2022 in Slot 10 und SPL Token in Slot 11 übergeben. CreateCustomizablePool und CreatePermissionedPool verwenden die gleichen zwei Slots.
Vorbedingungen
  • token_mint_0 < token_mint_1 nach Byte-Reihenfolge.
  • amm_config.disable_create_pool == false.
  • Mints werden nicht durch die Token-2022-Erweiterungs-Allowlist abgelehnt.
Nachbedingungen
  • pool_state.sqrt_price_x64 = sqrt_price_x64, tick_current = floor(log_{1.0001}(price)).
  • pool_state.liquidity = 0 (noch keine Positionen).
  • pool_state.fee_on = FromInput (Legacy-Standard).
  • pool_state.dynamic_fee_info ist auf Null gesetzt (dynamische Gebühr deaktiviert).

CreateCustomizablePool

Empfohlen für neue Pools. Gleiche Wirkung wie CreatePool plus Pool-spezifischer Gebührensammlungsmodus und optionales Dynamic-Fee-Opt-in. Argumente
Accounts — genau die 13 deklarierten Accounts von CreatePool. dynamic_fee_config ist nicht ein deklariertes Konto.
Wenn enable_dynamic_fee = true, muss die DynamicFeeConfig zum Abbilden als letztes remaining_account bereitgestellt werden — der Handler liest ctx.remaining_accounts.last(). Alle SupportMintAssociated-Bypass-PDAs müssen daher davor kommen, oder das Programm bildet das falsche Konto ab und schlägt bei der Deserialisierung fehl. Das Weglassen bei gesetztem Flag schlägt mit AccountLack fehl.
Vorbedingungen — gleich wie CreatePool. Wenn enable_dynamic_fee = false, ist kein remaining_account erforderlich und alle übergebenen werden nur auf Support-Mint-Datensätze gescannt. Nachbedingungen
  • pool_state.fee_on auf die gewählte CollectFeeOn-Variante gesetzt.
  • Wenn dynamische Gebühr aktiviert wurde: pool_state.dynamic_fee_info wird aus der bereitgestellten DynamicFeeConfig initialisiert (fünf Kalibrierungsparameter kopiert; Zustandsfelder auf Null gesetzt).
  • Andernfalls: pool_state.dynamic_fee_info ist auf Null gesetzt (= dynamische Gebühr für immer inaktiv für diesen Pool).
fee_on und das Dynamic-Fee-Aktivierungsbit werden nur bei der Pool-Erstellung gesetzt. Es gibt kein In-Place-Upgrade — Pools, die über Legacy-CreatePool erstellt wurden, können nicht rückwirkend dynamische Gebühren oder einseitige Gebühren erhalten. Neue Bereitstellungen sollten standardmäßig diese Anweisung verwenden.

CreatePermissionedPool

Sowohl CreatePool als auch CreateCustomizablePool leiten die Pool-PDA von ["pool", amm_config, token_mint_0, token_mint_1] ab, daher gibt es genau eine kanonische Pool-Adresse pro (config, mint0, mint1)-Triple — ein zweites init bei den gleichen Seeds schlägt fehl. CreatePermissionedPool hebt diese Einschränkung auf, indem ein vom Client bereitgestellter seed_index: u16 in die Pool-PDA-Seeds gefaltet wird, was mehrere Pools für das gleiche Paar und die gleiche Gebührenebene ermöglicht — jeder unter seiner eigenen Adresse. Da eine beliebige Pool-Adresse eine privilegierte Fähigkeit ist, muss der Zahler eine Permission-PDA halten, die ihn autorisiert. Alles andere am Pool ist identisch mit CreateCustomizablePool: Es nimmt die gleichen CreateCustomizableParams und unterstützt einseitige Gebühren und das Dynamic-Fee-Opt-in. Argumente
Accounts (gekürzt) — gleich wie CreateCustomizablePool plus, am Anfang: Die pool_state-PDA wird von ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()] abgeleitet. Vorbedingungen
  • seed_index != 0. Ein seed_index von 0 ist für Legacy-Pools reserviert und wird hier abgelehnt; die [0, 0]-Seed-Komponente ist das, was eine Legacy-Pool-Adresse zum Zusammenbruch in die klassische Vier-Seed-Form führt.
  • Die permission-PDA für payer existiert (erstellt von einem Admin über CreatePermissionPda).
  • Gleiche Mint- / Allowlist-Regeln wie CreatePool.
Nachbedingungen
  • Ein neuer pool_state existiert unter der seed_index-abgeleiteten Adresse, mit pool_state.seed_index = seed_index.
  • Alle anderen Post-State-Matches CreateCustomizablePool (Gebührenmodus, optionale dynamische Gebühr).
Diese Anweisung erweitert nicht den allgemeinen Pool-Erstellungszugriff — erlaubnislose Erstellung läuft weiterhin über CreatePool / CreateCustomizablePool, die einen Pool pro Paar bleiben. CreatePermissionedPool existiert für den spezifischen Fall, in dem ein auf der Whitelist stehender Operator mehrere Pools für das gleiche Paar benötigt (z. B. unterschiedliche Anfangspreise oder Launch-Kohorten) und eine Permission-PDA hält, die vom Admin gewährt wurde.

OpenPositionV2 / OpenPositionWithToken22Nft

Erstellt eine neue Position innerhalb eines bestehenden Pools. Argumente
Accounts — die beiden Varianten haben unterschiedliche Account-Listen. OpenPositionV2 deklariert 22; OpenPositionWithToken22Nft deklariert 20. OpenPositionV2, in Reihenfolge: OpenPositionWithToken22Nft ist die gleiche Liste mit metadata_account (5) und metadata_program (19) entfernt — es schreibt die Metadaten der Position durch die Token-2022-Metadaten-Erweiterung auf dem NFT-Mint statt — ergibt 20 Accounts. Sein position_nft_mint ist ein bloßer Signer und position_nft_account ein UncheckedAccount.
tick_array_bitmap_extension ist auf keiner Variante ein deklariertes Konto. Wenn der Bereich der Position außerhalb der Inline-tick_array_bitmap des Pools (±512 Tick-Arrays) fällt, hängen Sie die TickArrayBitmapExtension-PDA bei Seeds ["pool_tick_array_bitmap_extension", pool_state] als remaining_accounts[0] an.
Mathematik — siehe products/clmm/math. Gegeben base_flag löst das Programm entweder liquidity oder (amount_0_max, amount_1_max) in das tatsächliche L und die tatsächlich verbrauchten Token-Beträge auf. Vorbedingungen
  • tick_lower < tick_upper, beide Vielfache von pool.tick_spacing, innerhalb von [MIN_TICK, MAX_TICK].
  • Die beiden Tick-Array-PDAs werden übergeben. Sie müssen nicht bereits existieren — get_or_create_tick_array ordnet eine fehlende innerhalb dieser Anweisung auf Kosten von payer zu. Es gibt keine separate Init-Tick-Array-Anweisung.
  • Der Benutzer hat mindestens amount_0_max und amount_1_max in den Quell-ATAs.
Nachbedingungen
  • personal_position existiert, liquidity gesetzt, fee_growth_inside_last abgebildet.
  • Tick-Array-Einträge bei tick_lower und tick_upper aktualisiert (liquidity_gross += L, liquidity_net ± L, Gebührenwachstums-Snapshots gepflegt).
  • pool_state.liquidity += L, wenn die Position im Bereich ist (tick_lower ≤ tick_current < tick_upper).
  • Der Positions-NFT-Mint zeichnet pool_state als Freeze-Autorität auf. Die Mint-Autorität wird nach dem Prägen der einzelnen NFT entfernt. Das Aufzeichnen der Freeze-Autorität ändert den Zustand des NFT-Token-Kontos nicht.
  • Das NFT-Token-Konto bleibt aufgetaut, es sei denn, die Anweisung ist OpenPositionV2 oder OpenPositionWithToken22Nft und die Freeze-Autorität eines Vault-Mints entspricht CLMMs Liste der eingeschränkten Aussteller. Nur dieser passende V2-Pfad friert das Konto ein. OpenPosition V1 friert nicht ein.
Häufige Fehler — TickInvalidOrder (tick_lower >= tick_upper), TickAndSpacingNotMatch (ein Endpunkt ist kein Vielfaches von tick_spacing), InvalidTickIndex (außerhalb von [MIN_TICK, MAX_TICK]), MissingTickArrayBitmapExtensionAccount (Bereich außerhalb der Inline-Bitmap und die Erweiterung wurde nicht angehängt), NotApproved (pool_state.status blockiert das Öffnen), ZeroAmountSpecified.
Das Einfrieren von Positionen fügt keine deklarierten Anweisungs-Accounts oder Argumente hinzu. Clients können diese Positionen mit den bestehenden V2-Layouts öffnen. Das Verhalten wird On-Chain aus vault_0_mint und vault_1_mint ausgewählt.

IncreaseLiquidityV2

Fügt Liquidität zu einer bereits offenen Position hinzu. Argumente
Accounts — 15, und nicht ableitbar von OpenPosition: es gibt kein rent, kein system_program, kein associated_token_program und kein Metadaten-Konto. Hängen Sie die TickArrayBitmapExtension-PDA als remaining_accounts[0] an, wenn der Bereich der Position außerhalb der Inline-Bitmap liegt. Effekt
  • Überträgt amount_0_actual / amount_1_actual von Benutzer → Vaults.
  • Erhöht personal_position.liquidity und pool_state.liquidity (wenn im Bereich), und die Endpunkt-Tick-liquidity_gross / liquidity_net entsprechend.
  • Sammelt Gebühren und Rewards, die seit der letzten Berührung fällig sind und schreibt sie token_fees_owed_{0,1} / reward_amount_owed gut. Diese werden nur bei DecreaseLiquidity / DecreaseLiquidityV2 ausgezahlt, nicht bei Erhöhung — es gibt keine eigenständige Collect-Anweisung.

DecreaseLiquidityV2

Entfernt Liquidität aus einer Position. Argumente
Accounts — 16, und nicht die gleiche Form oder Reihenfolge wie IncreaseLiquidityV2: personal_position und pool_state sind vertauscht, die Vaults kommen vor den Tick-Arrays, die Benutzer-seitigen Accounts heißen recipient_token_account_*, und es gibt ein zusätzliches memo_program. Verbleibende Accounts — drei pro aktivem Reward, der gesammelt wird, in der Reihenfolge reward_token_vault(W), recipient_token_account(W), reward_vault_mint. Hängen Sie die TickArrayBitmapExtension-PDA an, wenn der Bereich der Position außerhalb der Inline-Bitmap liegt.
Dies ist auch die einzige Möglichkeit, Gebühren und Rewards zu sammeln. Um zu sammeln, ohne die Position zu ändern, rufen Sie sie mit liquidity = 0, amount_0_min = 0, amount_1_min = 0 auf.
Effekt
  • Berechnet (amount_0, amount_1) für das entfernte L gegeben aktuelles sqrt_price_x64.
  • Setzt Gebühren/Rewards ab, die seit der letzten Berührung aufgelaufen sind, gleich wie IncreaseLiquidity.
  • Überträgt amount_0 + fees_owed_0 und amount_1 + fees_owed_1 aus Vaults zum Benutzer.
  • Verringert Liquiditätszähler; wenn die neue personal_position.liquidity == 0, ist die Position berechtigt für ClosePosition.
Slippage — amount_0_min und amount_1_min sind die Mindestwerte, die der Benutzer netto von Token-2022-Transfergebühren auf der Ausgabeseite akzeptiert.

ClosePosition

Verbrennt die Positions-NFT und schließt PersonalPositionState. Deklarierte Accounts Verbleibende Accounts
  • Aufgetaute NFT: keine erforderlich; ein zusätzliches Pool-Konto ist harmlos, da der Handler es nicht liest.
  • Gefrorene NFT: hängen Sie personal_position.pool_id als erstes verbleibendes Konto an. Das Programm lädt es als PoolState und verwendet seine PDA-Seeds zum Signieren des Auftauens.
Vorbedingungen
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • Alle Reward-Zähler reward_amount_owed == 0.
(D. h., sammeln Sie alles und verringern Sie zuerst auf Null.) Effekt
  • Wenn das NFT-Token-Konto eingefroren ist, überprüft, ob das erste verbleibende Konto personal_position.pool_id entspricht, und taut es dann mit der Pool-PDA auf.
  • Verbrennt die NFT.
  • Schließt das NFT-Token-Konto und personal_position, erstattet Miete an nft_owner. Wenn die Positions-NFT Token-2022 verwendet, schließt es auch den NFT-Mint; klassische SPL Token-Mints können nicht geschlossen werden und bleiben mit Angebot Null.
Das Auftauen, Verbrennen und Schließen sind atomar. Die NFT kann zwischen diesen Schritten nicht übertragbar werden. Bedingter Client-Break — das deklarierte IDL-Layout ist unverändert, daher fahren Legacy-Clients fort, bestehende und aufgetaute Positionen zu schließen. Ein Legacy-Builder, der das Pool-Remaining-Konto weglässt, schlägt mit AccountLack fehl, wenn eine gefrorene Position geschlossen wird. Das Pool für jeden Close zu übergeben ist die einfachste kompatible Strategie.

SwapV2

Geht die Liquiditätskurve entlang; exakte Eingabe oder exakte Ausgabe je nach is_base_input. Argumente
Accounts (gekürzt) Aufrufer übergeben eine geordnete Liste von Tick-Arrays, die den erwarteten Swap-Walk abdecken; das Programm verwendet so viele, wie es braucht. Das SDK berechnet diese Liste über PoolUtils.computeAmountOutFormat oder den Quote-Endpunkt der API. Vorbedingungen
  • pool_state.status erlaubt Swap.
  • now >= open_time.
  • sqrt_price_limit_x64 ist auf der korrekten Seite von sqrt_price_x64 für die Richtung.
Häufige Fehler — TooLittleOutputReceived (Exact-In-Slippage), TooMuchInputPaid (Exact-Out-Slippage), SqrtPriceLimitOverflow, NotEnoughTickArrayAccount, InvalidFirstTickArrayAccount, MissingTickArrayBitmapExtensionAccount, LiquidityInsufficient, NotApproved (Swap-Bit auf pool_state.status gesetzt). CLMM hat keine ExceededSlippage-Variante — dieser Name ist CPMMs — und kein TickArrayNotFound. Was SwapV2 intern macht, das Aufrufer wissen sollten (Post-2025-Release):
  1. Dynamic-Fee-Zuschlag — wenn pool.dynamic_fee_info ungleich Null ist, aktualisiert das Programm den Volatilitäts-Akkumulator unter Verwendung der seit dem letzten Swap durchquerten Tick-Distanz (mit den Filter-/Decay-Regeln aus products/clmm/fees) und fügt eine dynamic_fee_component auf AmmConfig.trade_fee_rate hinzu. Die Gesamtgebühr ist auf 10% begrenzt (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. Limit-Order-Matching — wenn der Preis-Walk einen Tick kreuzt, der offene Limit-Orders hält, erfüllt das Programm zuerst verfügbare Limit-Order-Liquidität bei diesem Tick (FIFO nach order_phase), dann geht es entlang der LP-Liquiditätskurve weiter. Erfüllte Beträge aktualisieren tick.unfilled_ratio_x64 und tick.part_filled_orders_remaining für spätere Abwicklung; Orders selbst bleiben unausgegeben, bis ihr Eigentümer SettleLimitOrder aufruft.
  3. Einseitige Gebührenrouting — wenn pool.fee_on = Token0Only oder Token1Only, berechnet der Swap-Schritt immer noch die gleiche Input-Output-Trade; die Gebühr wird dann zur konfigurierten Seite geleitet. Für Richtungen, bei denen die konfigurierte Gebührenseite die Ausgabe ist, wird die Gebühr von der Swap-Ausgabe abgezogen (der Benutzer erhält out − fee); für Richtungen, bei denen sie die Eingabe ist, entspricht das Verhalten FromInput. Siehe is_fee_on_input(zero_for_one) und is_fee_on_token0(zero_for_one) auf PoolState.
Swap (V1) implementiert die gleiche dynamische Gebühr, einseitige Gebührenrouting und Limit-Order-Matching wie SwapV2; das einzige Feature, das es fehlt, ist Token-2022-Unterstützung — beide Vaults müssen klassisches SPL Token sein. Pools mit einem Token-2022-Mint müssen über SwapV2 getauscht werden. Der Aggregator und das SDK bevorzugen bereits V2 für jeden CLMM-Leg, daher müssen Aufrufer nicht nach Mint-Typ verzweigen.

OpenLimitOrder

Platziert eine Verkaufsorder bei einem bestimmten Tick. Die Order sitzt in einer Pro-Tick-FIFO-Kohorte und wird erfüllt, wenn der Preis vorbeigeht. Argumente
Accounts (gekürzt) Verbleibende Accounts — [0] tick_array_bitmap_extension, erforderlich nur, wenn ein Tick-Array initialisiert wird, dessen Start-Index außerhalb der Inline-Bitmap des Pools liegt. Übergeben Sie andernfalls nichts.
Es gibt kein rent-Konto: die Struktur endet bei system_program, 13 deklarierte Accounts. Ein verirrtes rent in Position 14 landet genau dort, wo die optionale Bitmap-Erweiterung gelesen wird, daher scheint die Order zu funktionieren, bis zum ersten Mal ein Tick-Array außerhalb der Inline-Bitmap zugeordnet werden muss — und dann schlägt es fehl.
Account-Listen-Änderung (2026-07-Release). OpenLimitOrder nimmt jetzt auch die Output-seitigen Accounts — output_token_account, output_vault und output_vault_mint — zusätzlich zur Input-Seite. Sie werden nur zur Validierung verwendet: das Programm lehnt die Order ab, wenn das Eingabe- oder Output-Token-Konto des Eigentümers eingefroren ist. Dies garantiert, dass eine Erfüllung tatsächlich zum Output-ATA des Eigentümers abgewickelt werden kann, was für Allow-List / Standard-gefrorene Token-2022-Mints (z. B. berechtigte Token) wichtig ist, bei denen ein Konto möglicherweise noch nicht aufgetaut ist. Clients, die gegen die ältere einseitige Account-Liste gebaut wurden, müssen die drei Output-Accounts hinzufügen.
Vorbedingungen
  • Weder input_token_account noch output_token_account ist eingefroren (andernfalls NotApproved).
  • pool_state.status erlaubt sowohl Swap (Bit 4) als auch Limit-Order (Bit 5) Operationen (andernfalls NotApproved).
  • tick_index % pool.tick_spacing == 0 und innerhalb von [MIN_TICK, MAX_TICK].
  • tick_index ist auf der rechten Seite von pool.tick_current für die gewählte Richtung (Verkauf von token0 → Tick muss über aktuell sein, und umgekehrt). Der Verkauf bei einem bereits gekreuzten Tick würde sofort erfüllt und wird abgelehnt.
Nachbedingungen
  • limit_order existiert, Snapshot von tick.order_phase und tick.unfilled_ratio_x64 zur Öffnungszeit.
  • tick.orders_amount += amount (in der aktuellen Kohorte).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent emittiert.
Häufige Fehler — NotApproved (Input- oder Output-Token-Konto eingefroren, oder der Pool hat Swap / Limit-Order deaktiviert), ZeroAmountSpecified (amount == 0 nach der Input-seitigen Transfergebühr), InvalidLimitOrderAmount (der Betrag würde eine Ausgabe unter 1 Basiseinheit bei diesem Tick erzeugen, oder u64 überlasten), InvalidTickIndex (außerhalb von [MIN_TICK, MAX_TICK], oder auf der falschen Seite von tick_current für die gewählte Richtung), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.

IncreaseLimitOrder

Fügt zu einer bestehenden offenen Order hinzu. Nur vom owner der Order aufrufbar. Argumente
Accounts — 8, nur Input-Seite. Es lässt das Nonce-Konto, alle drei Output-seitigen Accounts und system_program fallen. Vorbedingungen
  • limit_order.owner == signer.
  • Die Order ist immer noch in der gleichen Kohorte (tick.order_phase == limit_order.order_phase). Wenn die Kohorte bereits mit dem Füllen begonnen hat, ist die Order teilweise abgewickelt — der Aufrufer sollte zuerst DecreaseLimitOrder oder SettleLimitOrder aufrufen, um voranzukommen.
Effekt
  • Überträgt amount von Eigentümer-ATA zu input_vault.
  • limit_order.total_amount += amount; tick.orders_amount += amount.

DecreaseLimitOrder

Reduziert oder storniert vollständig eine offene Order. Zahlt den unerfüllten Rest zurück zum Eigentümer, plus bereits durch frühere Teilerfüllungen abgewickelte Ausgabe. Argumente
Accounts — sowohl Input- als auch Output-Token-Seiten: Effekt
  • Berechnet den erfüllten Betrag der Order aus der unfilled_ratio_x64 der Kohorte seit der Öffnung neu.
  • Sendet erfüllte Ausgabe zu output_token_account.
  • Sendet amount unerfüllter Eingabe zurück zu input_token_account.
  • Aktualisiert limit_order entsprechend. Wenn der neue unerfüllte Rest Null ist, schließt das Programm das Konto und erstattet Miete an owner.

SettleLimitOrder

Schiebt erfüllte Ausgabe-Token zum Eigentümer, ohne den unerfüllten Rest der Order zu ändern. Nützlich, wenn auto_withdraw-Keeper lange laufende Teilerfüllungen tropfenweise zahlen möchten. Aufrufer — entweder der owner der Order oder der limit_order_admin des Programms (ein Off-Chain-Operationshot-Wallet, das eine automatisierte Keeper-Schleife ausführt). Der Keeper hat keine andere Autorität — er kann keine Benutzer-Gelder außerhalb des Schiebens erfüllter Ausgabe zum Order-owner-ATA verschieben. Accounts Effekt
  • Berechnet die kumulierte Ausgabe, die unter Verwendung von (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64) geschuldet wird.
  • Überträgt das Delta zu output_token_account.
  • Aktualisiert limit_order.settled_output.
  • Schließt die Order nicht; sie ist immer noch gegen verbleibende Eingabe offen.

CloseLimitOrder

Schließt ein vollständig verbrauchtes Order-Konto. Miete wird immer an limit_order.owner zurückgegeben, unabhängig davon, wer signiert. Aufrufer — entweder owner oder limit_order_admin. Vorbedingungen
  • Die Order hat einen unerfüllten Rest von Null (entweder amount == total_amount wurde erfüllt und abgewickelt, oder der Eigentümer hat die Order zuvor auf Null verringert und vergessen zu schließen).
Effekt
  • Schließt limit_order; Miete wird an limit_order.owner gesendet.

CreateDynamicFeeConfig (Admin)

Erstellt einen wiederverwendbaren Parametersatz unter einem u16-Index. Argumente
Accounts Häufige Fehler — InvalidDynamicFeeConfigParams, wenn decay_period <= filter_period oder ein Feld mit Wert Null außerhalb der Grenzen liegt.

UpdateDynamicFeeConfig (Admin)

Ändert eine bestehende DynamicFeeConfig. Pools, die die Konfiguration bereits bei der Erstellung abgebildet haben, werden nicht rückwirkend aktualisiert; nur neu erstellte Pools, die auf diese Konfiguration verweisen, werden die neuen Werte aufgreifen. Argumente — gleich fünf Kalibrierungsfelder wie CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); index ist bei der Erstellung festgelegt und wird hier nicht erneut übergeben.

CollectProtocolFee / CollectFundFee

Fegt aufgelaufene Protokoll-/Fondsgebühren aus den Vaults des Pools zu einem Empfänger, setzt die entsprechenden PoolState.protocol_fees_* / fund_fees_*-Felder auf Null. Dies ist nicht CPMMs Layout — CLMM hat kein authority-Konto, und die Empfängerfelder heißen recipient_token_account_{0,1} statt recipient_token_{0,1}_account. Argumente — amount_0_requested: u64, amount_1_requested: u64.
Geändert in 2026-09: neue Konfigurationen nehmen ihre Gebühren-Eigentümer nicht mehr vom Unterzeichner. create_amm_config schreibt jetzt die hardcodierte protocol_fee_owner::ID des Programms in owner und fund_fee_owner::ID in fund_owner. Zuvor kopierte es den Admin-Unterzeichner-Schlüssel in beide. Auf Mainnet sind dies bereits die gleichen Schlüssel, die auf allen 21 bestehenden Konfigurationen gespeichert sind. Adressen sind in reference/program-addresses.Die akzeptierten Unterzeichner oben sind unverändert. Der Admin kann immer noch von jeder Konfiguration sammeln, und bestehende AmmConfig-Konten werden nicht umgeschrieben. Lesen Sie owner / fund_owner vom Konto statt anzunehmen, dass einer der Werte. UpdateAmmConfig-Parameter 3 und 4 drehen sie immer noch.

CollectExcessLamports

Admin-Sweep von Lamports über das Miet-Minimum auf Konten, die CLMM kontrolliert. Es wurde im 2026-09-Upgrade hinzugefügt, um die Über-Finanzierung zurückzufordern, die die SIMD-0437-Mietreduktion auf Konten hinterlässt, die vor jedem Schritt erstellt wurden. Nur der Überschuss bewegt sich. Token-Guthaben, Kontodaten, Eigentümer, Pool-Zustand und die Preiskurve bleiben unverändert. Ein Konto, das bereits bei seinem Minimum ist, wird so gelassen, daher kann die Anweisung nach jedem Rollout-Schritt sicher erneut ausgeführt werden. Argumente: keine. Accounts