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.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
Vorbedingungen
token_mint_0 < token_mint_1nach Byte-Reihenfolge.amm_config.disable_create_pool == false.- Mints werden nicht durch die Token-2022-Erweiterungs-Allowlist abgelehnt.
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_infoist 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
CreatePool. dynamic_fee_config ist nicht ein deklariertes Konto.
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_onauf die gewählteCollectFeeOn-Variante gesetzt.- Wenn dynamische Gebühr aktiviert wurde:
pool_state.dynamic_fee_infowird aus der bereitgestelltenDynamicFeeConfiginitialisiert (fünf Kalibrierungsparameter kopiert; Zustandsfelder auf Null gesetzt). - Andernfalls:
pool_state.dynamic_fee_infoist 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
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. Einseed_indexvon0ist 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ürpayerexistiert (erstellt von einem Admin überCreatePermissionPda). - Gleiche Mint- / Allowlist-Regeln wie
CreatePool.
- Ein neuer
pool_stateexistiert unter derseed_index-abgeleiteten Adresse, mitpool_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
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.
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 vonpool.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_arrayordnet eine fehlende innerhalb dieser Anweisung auf Kosten vonpayerzu. Es gibt keine separate Init-Tick-Array-Anweisung. - Der Benutzer hat mindestens
amount_0_maxundamount_1_maxin den Quell-ATAs.
personal_positionexistiert,liquiditygesetzt,fee_growth_inside_lastabgebildet.- Tick-Array-Einträge bei
tick_lowerundtick_upperaktualisiert (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_stateals 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
OpenPositionV2oderOpenPositionWithToken22Nftund die Freeze-Autorität eines Vault-Mints entspricht CLMMs Liste der eingeschränkten Aussteller. Nur dieser passende V2-Pfad friert das Konto ein.OpenPositionV1 friert nicht ein.
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
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_actualvon Benutzer → Vaults. - Erhöht
personal_position.liquidityundpool_state.liquidity(wenn im Bereich), und die Endpunkt-Tick-liquidity_gross/liquidity_netentsprechend. - Sammelt Gebühren und Rewards, die seit der letzten Berührung fällig sind und schreibt sie
token_fees_owed_{0,1}/reward_amount_owedgut. Diese werden nur beiDecreaseLiquidity/DecreaseLiquidityV2ausgezahlt, nicht bei Erhöhung — es gibt keine eigenständige Collect-Anweisung.
DecreaseLiquidityV2
Entfernt Liquidität aus einer Position.
Argumente
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.- Berechnet
(amount_0, amount_1)für das entfernteLgegeben aktuellessqrt_price_x64. - Setzt Gebühren/Rewards ab, die seit der letzten Berührung aufgelaufen sind, gleich wie
IncreaseLiquidity. - Überträgt
amount_0 + fees_owed_0undamount_1 + fees_owed_1aus Vaults zum Benutzer. - Verringert Liquiditätszähler; wenn die neue
personal_position.liquidity == 0, ist die Position berechtigt fürClosePosition.
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_idals erstes verbleibendes Konto an. Das Programm lädt es alsPoolStateund verwendet seine PDA-Seeds zum Signieren des Auftauens.
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Alle Reward-Zähler
reward_amount_owed == 0.
- Wenn das NFT-Token-Konto eingefroren ist, überprüft, ob das erste verbleibende Konto
personal_position.pool_identspricht, und taut es dann mit der Pool-PDA auf. - Verbrennt die NFT.
- Schließt das NFT-Token-Konto und
personal_position, erstattet Miete annft_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.
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
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.statuserlaubt Swap.now >= open_time.sqrt_price_limit_x64ist auf der korrekten Seite vonsqrt_price_x64für die Richtung.
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):
- Dynamic-Fee-Zuschlag — wenn
pool.dynamic_fee_infoungleich Null ist, aktualisiert das Programm den Volatilitäts-Akkumulator unter Verwendung der seit dem letzten Swap durchquerten Tick-Distanz (mit den Filter-/Decay-Regeln ausproducts/clmm/fees) und fügt einedynamic_fee_componentaufAmmConfig.trade_fee_ratehinzu. Die Gesamtgebühr ist auf 10% begrenzt (MAX_FEE_RATE_NUMERATOR / 1_000_000). - 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 aktualisierentick.unfilled_ratio_x64undtick.part_filled_orders_remainingfür spätere Abwicklung; Orders selbst bleiben unausgegeben, bis ihr EigentümerSettleLimitOrderaufruft. - Einseitige Gebührenrouting — wenn
pool.fee_on = Token0OnlyoderToken1Only, 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ältout − fee); für Richtungen, bei denen sie die Eingabe ist, entspricht das VerhaltenFromInput. Sieheis_fee_on_input(zero_for_one)undis_fee_on_token0(zero_for_one)aufPoolState.
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
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.
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.- Weder
input_token_accountnochoutput_token_accountist eingefroren (andernfallsNotApproved). pool_state.statuserlaubt sowohl Swap (Bit 4) als auch Limit-Order (Bit 5) Operationen (andernfallsNotApproved).tick_index % pool.tick_spacing == 0und innerhalb von[MIN_TICK, MAX_TICK].tick_indexist auf der rechten Seite vonpool.tick_currentfü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.
limit_orderexistiert, Snapshot vontick.order_phaseundtick.unfilled_ratio_x64zur Öffnungszeit.tick.orders_amount += amount(in der aktuellen Kohorte).limit_order_nonce.order_nonce += 1.OpenLimitOrderEventemittiert.
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
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 zuerstDecreaseLimitOrderoderSettleLimitOrderaufrufen, um voranzukommen.
- Überträgt
amountvon Eigentümer-ATA zuinput_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
Effekt
- Berechnet den erfüllten Betrag der Order aus der
unfilled_ratio_x64der Kohorte seit der Öffnung neu. - Sendet erfüllte Ausgabe zu
output_token_account. - Sendet
amountunerfüllter Eingabe zurück zuinput_token_account. - Aktualisiert
limit_orderentsprechend. Wenn der neue unerfüllte Rest Null ist, schließt das Programm das Konto und erstattet Miete anowner.
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_amountwurde erfüllt und abgewickelt, oder der Eigentümer hat die Order zuvor auf Null verringert und vergessen zu schließen).
- Schließt
limit_order; Miete wird anlimit_order.ownergesendet.
CreateDynamicFeeConfig (Admin)
Erstellt einen wiederverwendbaren Parametersatz unter einem u16-Index.
Argumente
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.
