Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
تقترن هذه الصفحة بـ products/clmm/accounts (ما هي الحسابات) و products/clmm/math (ما هي الرياضيات). وهي مرجع معتمد للمعاملات وترتيب الحسابات؛ تأتي تخطيطات البايتات المحددة من IDL.أعاد ترقية البرنامج 2026-09 بناء CLMM على Anchor 1.0.2 / Solana 3.1.10، وأضاف تعليمة المسؤول CollectExcessLamports، وغيّر ما تكتبه CreateAmmConfig في owner / fund_owner. لم تغيّر أي تعليمة موجهة للمستخدم حساباتها أو معاملات أو رياضيات. انظر إدخال السجل 2026-09-30.أعاد ترقية البرنامج 2026-10-22 تسمية CreatePermissionedPool إلى CreateCustomizablePoolV2، وتجعلها قابلة للاستدعاء من قبل أي شخص، وتزيل حساب Permission مع تعليماته الإداريتين. انظر إدخال السجل 2026-10-22.

جرد التعليمات

لا توجد تعليمة init-tick-array، ولا حاجة لها. يتم إنشاء مصفوفة علامة داخل OpenPosition* / IncreaseLiquidity* بواسطة TickArrayState::get_or_create_tick_array، مدفوعة من قبل payer. مرر PDA مصفوفة العلامة (ربما لا تزال غير مهيأة، مملوكة للنظام) كـ tick_array_lower / tick_array_upper والبرنامج يخصصها إذا كانت مفقودة. OpenLimitOrder يفعل الشيء نفسه لـ tick_array الواحد الخاص به.
معظم التعليمات الإدارية فقط (CreateAmmConfig، UpdateAmmConfig، UpdatePoolStatus، CreateOperationAccount، UpdateOperationAccount، CloseProtocolPosition) محمية بمفتاح admin المشفر في البرنامج. CreateSupportMintAssociated / CloseSupportMintAssociated تقبل إما مفتاح admin أو مفتاح مالك دعم mint مخصص؛ CollectExcessLamports تقبل إما مفتاح admin أو محفظة كنس lamports مخصصة. تعليمات إدارة تدفق المكافآت (TransferRewardOwner، CollectRemainingRewards) محمية بممول المكافآت، وليس مسؤول البرنامج. لاحقة V2 تعني “يدعم Token-2022 على الخزانات / NFT، يتطلب فتحة امتداد bitmap”. يختار SDK V2 بشكل افتراضي للمجمعات الجديدة.

CreatePool

المعاملات
الحسابات (مختصرة)
الفتحات 10 و 11 هي لكل mint، وليس “SPL Token ثم Token-2022”. كل واحدة مقيدة بـ mint::token_program على mint المطابق، لذا بالنسبة لمجمع token_mint_0 هو Token-2022 و token_mint_1 هو SPL كلاسيكي يجب عليك تمرير Token-2022 في الفتحة 10 و SPL Token في الفتحة 11. CreateCustomizablePool و CreateCustomizablePoolV2 تستخدم نفس الفتحتين.
الشروط المسبقة
  • token_mint_0 < token_mint_1 حسب ترتيب البايت.
  • amm_config.disable_create_pool == false.
  • لم يتم رفض Mints بواسطة قائمة السماح بامتداد Token-2022.
الشروط اللاحقة
  • pool_state.sqrt_price_x64 = sqrt_price_x64، tick_current = floor(log_{1.0001}(price)).
  • pool_state.liquidity = 0 (لا توجد مراكز حتى الآن).
  • pool_state.fee_on = FromInput (الافتراضي القديم).
  • pool_state.dynamic_fee_info مصفر (الرسوم الديناميكية معطلة).

CreateCustomizablePool

موصى به للمجمعات الجديدة. نفس التأثير مثل CreatePool بالإضافة إلى وضع جمع الرسوم لكل مجمع واختيار رسوم ديناميكية اختياري. المعاملات
الحسابات — بالضبط الـ 13 حساب المعلن عنها لـ CreatePool. dynamic_fee_config ليس حساب معلن عنه.
عندما enable_dynamic_fee = true، يجب توفير DynamicFeeConfig للالتقاط كـ آخر remaining_account — يقرأ المعالج ctx.remaining_accounts.last(). أي PDAs تجاوز SupportMintAssociated يجب أن تأتي قبله، وإلا يلتقط البرنامج الحساب الخاطئ ويفشل في فك التسلسل. حذفه بينما العلم مضبوط يفشل مع AccountLack.
الشروط المسبقة — نفس CreatePool. إذا كان enable_dynamic_fee = false، لا يلزم remaining_account وأي يتم تمريره يتم فحصه فقط لسجلات دعم mint. الشروط اللاحقة
  • pool_state.fee_on مضبوط على متغير CollectFeeOn المختار.
  • إذا تم تفعيل الرسوم الديناميكية: يتم تهيئة pool_state.dynamic_fee_info من DynamicFeeConfig المزود (خمسة معاملات معايرة مسخوخة؛ حقول الحالة مصفرة).
  • وإلا: pool_state.dynamic_fee_info مصفر (= الرسوم الديناميكية غير نشطة إلى الأبد لهذا المجمع).
يتم تعيين fee_on وبت تفعيل الرسوم الديناميكية فقط عند إنشاء المجمع. لا يوجد ترقية في المكان — المجمعات التي تم إنشاؤها عبر CreatePool القديم لا يمكنها الحصول بأثر رجعي على رسوم ديناميكية أو رسوم أحادية الجانب. يجب أن تستخدم النشرات الجديدة هذه التعليمة بشكل افتراضي.

CreateCustomizablePoolV2

يشتق كل من CreatePool و CreateCustomizablePool عنوان PDA للمجموعة من ["pool", amm_config, token_mint_0, token_mint_1]، لذا يوجد عنوان مجموعة قانوني واحد بالضبط لكل ثلاثية (config, mint0, mint1) — محاولة init ثانية بنفس البذور تفشل. يرفع CreateCustomizablePoolV2 هذا القيد بدمج seed_index: u16 يوفره العميل في بذور PDA للمجموعة، مما يسمح بـ مجموعات متعددة لنفس الزوج ومستوى الرسوم — كل واحدة بعنوانها الخاص. يمكن لأي شخص استدعاؤها. كل شيء آخر عن المجموعة متطابق مع CreateCustomizablePool: تأخذ نفس CreateCustomizableParams وتدعم الرسوم أحادية الجانب والاختيار الديناميكي للرسوم.
حتى ترقية 2026-10-22، كانت هذه التعليمة تُسمى CreatePermissionedPool وتتطلب من الدافع الاحتفاظ بـ PDA Permission صادرة من المسؤول. أعادت الترقية تسميتها وأزالت حساب permission وحذفت آلية الأذونات. تغيّر المميز مع الاسم، لذا يجب إعادة بناء العملاء المبنيين مقابل CreatePermissionedPool.
الحجج
الحسابات remaining_accounts: PDAs سجل العملات المساعدة عندما تحتاج عملة Token-2022 إليها، و DynamicFeeConfig أخيراً عندما enable_dynamic_fee = true — كما في CreateCustomizablePool. الشروط المسبقة
  • seed_index != 0. يتم رفض seed_index بقيمة 0 لأنها محجوزة للمجموعات القديمة؛ مكون البذرة [0, 0] هو ما يجعل عنوان المجموعة القديمة ينهار إلى الشكل الكلاسيكي ذي البذور الأربع.
  • لا توجد مجموعة بالفعل في العنوان المشتق.
  • نفس قواعد العملات / قائمة السماح مثل CreatePool.
الشروط اللاحقة
  • يوجد pool_state جديد في العنوان المشتق من seed_index، مع pool_state.seed_index = seed_index.
  • جميع حالات ما بعد الأخرى تطابق CreateCustomizablePool (وضع الرسوم، الرسوم الديناميكية الاختيارية).
لأن pool_creator غير مفحوص، يمكن لأي دافع كتابة أي عنوان في pool_state.owner. يمكن لهذا العنوان استدعاء InitializeReward على المجموعة، لكن هذا ليس إثباتاً لمن أنشأ المجموعة. يجب على المدمجين عدم تصنيف أو ترتيب مجموعات V2 حسب owner.

OpenPositionV2 / OpenPositionWithToken22Nft

إنشاء موضع جديد داخل مجموعة موجودة. الحجج
الحسابات — للمتغيرين قوائم حسابات مختلفة. يعلن OpenPositionV2 عن 22؛ OpenPositionWithToken22Nft يعلن عن 20. OpenPositionV2، بالترتيب: OpenPositionWithToken22Nft هي نفس القائمة مع metadata_account (5) و metadata_program (19) محذوفة — تكتب بيانات الموضع من خلال امتداد البيانات الوصفية Token-2022 على عملة NFT بدلاً من ذلك — مما يعطي 20 حساباً. position_nft_mint الخاص به هو Signer عادي و position_nft_account هو UncheckedAccount.
tick_array_bitmap_extension ليس حساباً معلناً على أي من المتغيرين. عندما يقع نطاق الموضع خارج tick_array_bitmap المضمن للمجموعة (±512 مصفوفة tick)، أضف PDA TickArrayBitmapExtension في البذور ["pool_tick_array_bitmap_extension", pool_state] كـ remaining_accounts[0].
الرياضيات — انظر products/clmm/math. بناءً على base_flag، يحل البرنامج إما liquidity أو (amount_0_max, amount_1_max) إلى L الفعلي ومبالغ الرموز الفعلية المستهلكة. الشروط المسبقة
  • tick_lower < tick_upper، كلاهما مضاعفات pool.tick_spacing، ضمن [MIN_TICK, MAX_TICK].
  • يتم تمرير PDA مصفوفتي tick. لا تحتاج إلى أن تكون موجودة بالفعل — get_or_create_tick_array تخصص واحدة مفقودة على حساب payer داخل هذه التعليمة. لا توجد تعليمة init-tick-array منفصلة.
  • المستخدم لديه على الأقل amount_0_max و amount_1_max في ATAs المصدر.
الشروط اللاحقة
  • يوجد personal_position، مع تعيين liquidity، و fee_growth_inside_last مأخوذة لحظة.
  • تم تحديث إدخالات مصفوفة tick في tick_lower و tick_upper (liquidity_gross += L، liquidity_net ± L، لقطات نمو الرسوم المحفوظة).
  • pool_state.liquidity += L إذا كان الموضع ضمن النطاق (tick_lower ≤ tick_current < tick_upper).
  • تسجل عملة NFT pool_state كسلطة تجميد. تتم إزالة سلطة الإصدار بعد صك NFT الواحد. لا يغير تسجيل سلطة التجميد حالة حساب رمز NFT.
  • يبقى حساب رمز NFT غير مجمد ما لم تكن التعليمة OpenPositionV2 أو OpenPositionWithToken22Nft و تطابق سلطة تجميد أي من عملات الخزان قائمة المُصدرين المقيدين بـ CLMM. فقط هذا المسار V2 المطابق يجمد الحساب. لا يجمد OpenPosition V1.
الأخطاء الشائعة — TickInvalidOrder (tick_lower >= tick_upper)، TickAndSpacingNotMatch (نقطة نهاية ليست مضاعفة tick_spacing)، InvalidTickIndex (خارج [MIN_TICK, MAX_TICK])، MissingTickArrayBitmapExtensionAccount (النطاق خارج الخريطة النقطية المضمنة ولم يتم إلحاق الامتداد)، NotApproved (pool_state.status يمنع الفتح)، ZeroAmountSpecified.
تجميد الموضع لا يضيف حسابات تعليمات معلنة أو حجج. يمكن للعملاء فتح هذه المواضع باستخدام تخطيطات V2 الموجودة. يتم اختيار السلوك على السلسلة من vault_0_mint و vault_1_mint.

IncreaseLiquidityV2

إضافة سيولة إلى موضع مفتوح بالفعل. الحجج
الحسابات — 15، و غير قابلة للاشتقاق من OpenPosition: لا توجد rent، لا system_program، لا associated_token_program ولا حساب بيانات وصفية. أضف PDA TickArrayBitmapExtension في البداية كـ remaining_accounts[0] عندما يكون نطاق الموضع خارج الخريطة النقطية المضمنة. التأثير
  • تحويل amount_0_actual / amount_1_actual من المستخدم → الخزانات.
  • زيادة personal_position.liquidity و pool_state.liquidity (إذا كان ضمن النطاق)، و liquidity_gross / liquidity_net لـ tick النقطة النهائية وفقاً لذلك.
  • جمع الرسوم والمكافآت المستحقة منذ آخر لمسة وإضافتها إلى token_fees_owed_{0,1} / reward_amount_owed. يتم دفع هذه فقط على DecreaseLiquidity / DecreaseLiquidityV2، وليس على الزيادة — لا توجد تعليمة جمع منفصلة.

DecreaseLiquidityV2

إزالة السيولة من موضع. الحجج
الحسابات — 16، و ليست بنفس الشكل أو الترتيب مثل IncreaseLiquidityV2: يتم تبديل personal_position و pool_state، تأتي الخزانات قبل مصفوفات tick، يتم تسمية الحسابات من جانب المستخدم recipient_token_account_*، وهناك memo_program إضافي. الحسابات المتبقية — ثلاثة لكل مكافأة نشطة يتم جمعها، بالترتيب reward_token_vault(W)، recipient_token_account(W)، reward_vault_mint. أضف PDA TickArrayBitmapExtension عندما يكون نطاق الموضع خارج الخريطة النقطية المضمنة.
هذه هي أيضاً الطريقة الوحيدة لجمع الرسوم والمكافآت. لجمع دون تغيير الموضع، استدعها مع liquidity = 0، amount_0_min = 0، amount_1_min = 0.
التأثير
  • حساب (amount_0, amount_1) للـ L المحذوف بناءً على sqrt_price_x64 الحالي.
  • تسوية الرسوم/المكافآت المتراكمة منذ آخر لمسة، نفس IncreaseLiquidity.
  • تحويل amount_0 + fees_owed_0 و amount_1 + fees_owed_1 من الخزانات إلى المستخدم.
  • تقليل عدادات السيولة؛ إذا كان personal_position.liquidity == 0 الجديد، يكون الموضع مؤهلاً لـ ClosePosition.
الانزلاق — amount_0_min و amount_1_min هما الحد الأدنى الذي يقبله المستخدم بعد خصم رسوم تحويل Token-2022 على جانب الإخراج.

ClosePosition

حرق NFT الموضع وإغلاق PersonalPositionState. الحسابات المُعلَّنة الحسابات المتبقية
  • NFT غير مجمد: لا يُطلب أي حساب؛ حساب مجموعة إضافي غير ضار لأن المعالج لا يقرأه.
  • NFT مجمد: أضف personal_position.pool_id كأول حساب متبقٍ. يحمّل البرنامج كـ PoolState ويستخدم بذور PDA الخاصة به للتوقيع على إذابة التجميد.
الشروط المسبقة
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • جميع عدادات المكافآت reward_amount_owed == 0.
(أي، اجمع كل شيء وقلل إلى صفر أولاً.) التأثير
  • إذا كان حساب رمز NFT مجمداً، تحقق من أن أول حساب متبقٍ يساوي personal_position.pool_id، ثم أذبه باستخدام PDA المجموعة.
  • احرق NFT.
  • أغلق حساب رمز NFT وpersonal_position، مع استرجاع الإيجار إلى nft_owner. إذا كان موضع NFT يستخدم Token-2022، فإنه يُغلق أيضاً نعت NFT؛ لا يمكن إغلاق نعوت رمز SPL الكلاسيكية وتبقى بإمداد صفر.
إذابة التجميد والحرق والإغلاق ذرية. لا يمكن لـ NFT أن يصبح قابلاً للتحويل بين تلك الخطوات. فاصل عميل مشروط — تخطيط IDL المُعلَّن لم يتغير، لذا يستمر العملاء القدامى في إغلاق المواضع الموجودة وغير المجمدة. منشئ قديم يحذف حساب المجموعة المتبقي يفشل مع AccountLack عند إغلاق موضع مجمد. تمرير المجموعة لكل إغلاق هو أبسط استراتيجية متوافقة.

SwapV2

سر منحنى السيولة؛ إدخال دقيق أو إخراج دقيق حسب is_base_input. الحجج
الحسابات (مختصرة) يمرر المستدعون قائمة مرتبة من مصفوفات التكات التي تغطي سير المبادلة المتوقع؛ يستخدم البرنامج ما يحتاجه. يحسب SDK هذه القائمة عبر PoolUtils.computeAmountOutFormat أو نقطة نهاية الاقتباس في API. الشروط المسبقة
  • pool_state.status يسمح بالمبادلة.
  • now >= open_time.
  • sqrt_price_limit_x64 على الجانب الصحيح من sqrt_price_x64 للاتجاه.
الأخطاء الشائعة — TooLittleOutputReceived (انزلاق الإدخال الدقيق)، TooMuchInputPaid (انزلاق الإخراج الدقيق)، SqrtPriceLimitOverflow، NotEnoughTickArrayAccount، InvalidFirstTickArrayAccount، MissingTickArrayBitmapExtensionAccount، LiquidityInsufficient، NotApproved (بت المبادلة مضبوط على pool_state.status). لا يحتوي CLMM على متغير ExceededSlippage — هذا الاسم خاص بـ CPMM — ولا على TickArrayNotFound. ما يفعله SwapV2 داخلياً مما يجب أن يعرفه المستدعون (بعد إصدار 2025):
  1. رسم ديناميكي إضافي — إذا كان pool.dynamic_fee_info غير صفري، يحدّث البرنامج مراكم التقلب باستخدام مسافة التكات المقطوعة منذ آخر مبادلة (مع قواعد التصفية/الاضمحلال من products/ar/clmm/fees) ويضيف dynamic_fee_component فوق AmmConfig.trade_fee_rate. الرسم الإجمالي مقيد بـ 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. مطابقة أوامر الحد — عندما يعبر سير السعر تكة تحتوي على أوامر حد مفتوحة، يملأ البرنامج أولاً سيولة أوامر الحد المتاحة في تلك التكة (FIFO حسب order_phase)، ثم يمضي على طول منحنى سيولة LP. تحدّث المبالغ المملوءة tick.unfilled_ratio_x64 وtick.part_filled_orders_remaining للتسوية لاحقاً؛ تبقى الأوامر نفسها غير منفقة حتى يستدعي مالكها SettleLimitOrder.
  3. توجيه رسم أحادي الجانب — عندما يكون pool.fee_on = Token0Only أو Token1Only، تحسب خطوة المبادلة نفس الإدخال-الإخراج؛ يُوجَّه الرسم بعد ذلك إلى الجانب المُعيَّن. للاتجاهات حيث الجانب المُعيَّن للرسم هو الإخراج، يُخصم الرسم من إخراج المبادلة (يتلقى المستخدم out − fee)؛ للاتجاهات حيث يكون الإدخال، السلوك يطابق FromInput. انظر is_fee_on_input(zero_for_one) وis_fee_on_token0(zero_for_one) على PoolState.
Swap (V1) ينفذ نفس الرسم الديناميكي وتوجيه الرسم أحادي الجانب ومطابقة أوامر الحد مثل SwapV2؛ الميزة الوحيدة التي ينقصها هي دعم Token-2022 — يجب أن تكون كلا الخزائن رمز SPL كلاسيكي. يجب مبادلة المجموعات التي تحتوي على أي نعت Token-2022 عبر SwapV2. يفضل المجمّع و SDK بالفعل V2 لكل ساق CLMM حتى لا يضطر المستدعون إلى التفرع حسب نوع النعت.

OpenLimitOrder

ضع أمر بيع في تكة محددة. يجلس الأمر في مجموعة FIFO لكل تكة ويملأ عندما يسير السعر بجانبه. الحجج
الحسابات (مختصرة) الحسابات المتبقية — [0] tick_array_bitmap_extension، مطلوب فقط عند تهيئة مصفوفة تكات يقع فهرس البداية الخاص بها خارج الخريطة النقطية المضمنة للمجموعة. لا تمرر شيئاً وإلا.
لا يوجد حساب rent: تنتهي البنية عند system_program، 13 حساب معلن. rent ضائع في الموضع 14 يهبط بالضبط حيث يُقرأ امتداد الخريطة النقطية الاختياري، لذا يبدو الأمر أنه يعمل حتى المرة الأولى التي يجب فيها إنشاء مصفوفة تكات خارج الخريطة النقطية المضمنة — ثم يفشل.
تغيير قائمة الحسابات (إصدار 2026-07). يأخذ OpenLimitOrder الآن أيضاً حسابات جانب الإخراج — output_token_account وoutput_vault وoutput_vault_mint — بالإضافة إلى جانب الإدخال. تُستخدم فقط للتحقق: يرفض البرنامج الأمر إذا كان حساب رمز الإدخال أو الإخراج للمالك مجمداً. هذا يضمن أن الملء يمكن فعلاً تسويته إلى ATA الإخراج للمالك، وهذا مهم لنعوت Token-2022 المجمدة افتراضياً / قائمة السماح (مثل الرموز المرخصة) حيث قد لا يكون الحساب مذاباً بعد. يجب على العملاء المبنيين مقابل قائمة الحسابات أحادية الجانب الأقدم إضافة الحسابات الثلاثة للإخراج.
الشروط المسبقة
  • لا input_token_account ولا output_token_account مجمد (وإلا NotApproved).
  • pool_state.status يسمح بعمليات المبادلة (بت 4) وأوامر الحد (بت 5) (وإلا NotApproved).
  • tick_index % pool.tick_spacing == 0 وضمن [MIN_TICK, MAX_TICK].
  • tick_index على الجانب الأيمن من pool.tick_current للاتجاه المختار (بيع token0 → يجب أن تكون التكة فوق الحالية، والعكس صحيح). البيع في تكة تم عبورها بالفعل سيُطابق فوراً ويُرفض.
الشروط اللاحقة
  • limit_order موجود، يلتقط tick.order_phase وtick.unfilled_ratio_x64 عند وقت الفتح.
  • tick.orders_amount += amount (في المجموعة الحالية).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent مُطلق.
الأخطاء الشائعة — NotApproved (حساب رمز الإدخال أو الإخراج مجمد، أو المجموعة لديها مبادلة / أوامر حد معطلة)، ZeroAmountSpecified (amount == 0 بعد رسم التحويل من جانب الإدخال)، InvalidLimitOrderAmount (المبلغ سينتج إخراج أقل من 1 وحدة أساسية في تلك التكة، أو تجاوز u64)، InvalidTickIndex (خارج [MIN_TICK, MAX_TICK]، أو على الجانب الخاطئ من tick_current للاتجاه المختار)، TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0)، OrderPhaseSaturated.

IncreaseLimitOrder

أضف إلى أمر مفتوح موجود. قابل للاستدعاء فقط من قبل owner الأمر. الحجج
الحسابات — 8، جانب الإدخال فقط. يحذف حساب nonce وجميع حسابات جانب الإخراج الثلاثة و system_program. الشروط المسبقة
  • limit_order.owner == signer.
  • الأمر لا يزال في نفس المجموعة (tick.order_phase == limit_order.order_phase). إذا بدأت المجموعة بالملء بالفعل، يتم تسوية الأمر جزئياً — يجب على المستدعي استدعاء DecreaseLimitOrder أو SettleLimitOrder أولاً للمضي قدماً.
التأثير
  • ينقل amount من ATA المالك إلى input_vault.
  • limit_order.total_amount += amount؛ tick.orders_amount += amount.

DecreaseLimitOrder

قلل أو ألغِ أمراً مفتوحاً بالكامل. يدفع الباقي غير المملوء مرة أخرى إلى المالك، بالإضافة إلى أي إخراج تم تسويته بالفعل من خلال الملء الجزئي السابق. الحجج
الحسابات — جانبا رمز الإدخال والإخراج: التأثير
  • يعيد حساب مبلغ الملء للأمر من unfilled_ratio_x64 المجموعة منذ الفتح.
  • يرسل الإخراج المملوء إلى output_token_account.
  • يرسل amount من الإدخال غير المملوء مرة أخرى إلى input_token_account.
  • يحدّث limit_order وفقاً لذلك. إذا كان الباقي غير المملوء الجديد صفراً، يُغلق البرنامج الحساب ويسترجع الإيجار إلى owner.

SettleLimitOrder

ادفع الرموز المُخرجة المملوءة إلى المالك دون تغيير الجزء غير المملوء من الأمر. مفيد عندما تريد محافظ auto_withdraw الآلية أن تدفع تدريجياً الملء الجزئي طويل الأمد. المُستدعي — إما مالك الأمر owner، أو limit_order_admin للبرنامج (محفظة تشغيلية ساخنة خارج السلسلة تشغّل حلقة keeper آلية). لا توجد سلطة أخرى للـ keeper — لا يمكنه نقل أموال المستخدم خارج دفع المخرجات المملوءة إلى ATA مالك الأمر. الحسابات التأثير
  • يحسب المخرجات المتراكمة المستحقة باستخدام (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64).
  • ينقل الفرق إلى output_token_account.
  • يحدّث limit_order.settled_output.
  • لا يغلق الأمر؛ يبقى مفتوحاً ضد أي مدخلات متبقية.

CloseLimitOrder

أغلق حساب أمر مستهلك بالكامل. يتم دائماً إرجاع الإيجار إلى limit_order.owner بغض النظر عمن يوقّع. المُستدعي — إما owner أو limit_order_admin. الشروط المسبقة
  • الأمر لديه صفر بقايا غير مملوءة (إما تم ملء amount == total_amount وتسويته، أو قلّل المالك الأمر إلى صفر سابقاً ونسي الإغلاق).
التأثير
  • يغلق limit_order؛ يتم إرسال الإيجار إلى limit_order.owner.

CreateDynamicFeeConfig (admin)

أنشئ مجموعة معاملات قابلة لإعادة الاستخدام تحت فهرس u16. الحجج
الحسابات الأخطاء الشائعة — InvalidDynamicFeeConfigParams إذا كان decay_period <= filter_period أو أي حقل بقيمة 0 خارج الحدود.

UpdateDynamicFeeConfig (admin)

عدّل DynamicFeeConfig موجود. المجموعات التي التقطت بالفعل الإعدادات عند وقت الإنشاء لا يتم تحديثها بأثر رجعي؛ فقط المجموعات المُنشأة حديثاً التي تشير إلى هذا الإعداد ستلتقط القيم الجديدة. الحجج — نفس خمسة حقول المعايرة من CreateDynamicFeeConfig (filter_period، decay_period، reduction_factor، dynamic_fee_control، max_volatility_accumulator)؛ index ثابت عند الإنشاء ولا يتم تمريره هنا.

CollectProtocolFee / CollectFundFee

امسح الرسوم المتراكمة للبروتوكول/الصندوق من خزائن المجموعة إلى المستقبِل، مما يصفّر حقول PoolState.protocol_fees_* / fund_fees_* المقابلة. هذا ليس تخطيط CPMM — CLMM لا يحتوي على حساب authority، وحقول المستقبِل مسماة recipient_token_account_{0,1} بدلاً من recipient_token_{0,1}_account. الحجج — amount_0_requested: u64، amount_1_requested: u64.
تم التغيير في 2026-09: الإعدادات الجديدة لم تعد تأخذ مالكي الرسوم من الموقّع. يكتب create_amm_config الآن protocol_fee_owner::ID المُشفّر للبرنامج في owner و fund_fee_owner::ID في fund_owner. سابقاً، كان ينسخ مفتاح موقّع المسؤول إلى كليهما. على mainnet هذه هي نفس المفاتيح المخزنة بالفعل على جميع الإعدادات الـ 21 الموجودة. العناوين موجودة في reference/program-addresses.الموقّعون المقبولون أعلاه لم يتغيروا. يمكن للمسؤول جمع من أي إعداد، وحسابات AmmConfig الموجودة لا يتم إعادة كتابتها. اقرأ owner / fund_owner من الحساب بدلاً من افتراض أي قيمة. معاملات UpdateAmmConfig 3 و 4 لا تزال تدويرهما.

CollectExcessLamports

مسح المسؤول للـ lamports فوق الحد الأدنى المعفي من الإيجار على الحسابات التي يتحكم بها CLMM. تمت إضافته في ترقية 2026-09 لاسترجاع الإفراط في التمويل الذي يتركه SIMD-0437 rent reduction على الحسابات المُنشأة قبل كل خطوة. فقط الفائض ينتقل. أرصدة الرموز، بيانات الحساب، المالكون، حالة المجموعة ومنحنى السعر لم تتغير. الحساب الذي يكون بالفعل عند حده الأدنى يُترك كما هو، لذا يمكن إعادة تشغيل التعليمات بأمان بعد كل خطوة نشر. الحجج: لا توجد. الحسابات النطاق: مجموعة واحدة لكل استدعاء. CLMM لا يحتوي على سلطة خزينة على مستوى البرنامج. خزائن كل مجموعة مملوكة من قبل PoolState الخاص بها. لذلك يجب أن يكون لكل مصدر برنامج رموز pool_state في الفتحة 2 كسلطة له: token_vault_0، token_vault_1، أو أحد خزائن المكافآت لتلك المجموعة. إذا مررت خزينة مجموعة أخرى أو حساب رموز المستخدم، فإن فحص مالك برنامج الرموز يفشل والتعليمة بأكملها تنعكس. لا يتم تخطيها. لا يمكن مسح نقوش NFT للمواضع، لأن سلطة الضرب الخاصة بهم تم إلغاؤها عند فتح الموضع. كيفية التعامل مع كل حساب مصدر يقوم البرنامج بمسح واحد على remaining_accounts: كل CPIs برنامج الرموز أولاً، ثم الخصومات المباشرة. يؤدي التشابك بين الاثنين إلى الإجهاض مع خطأ UnbalancedInstruction في وقت التشغيل، لذا يتم إصلاح الترتيب في البرنامج ولا تضطر إلى فرز القائمة بنفسك.
المسح 2 يغطي الحسابات التي دفع المستخدم إيجارها. PersonalPositionState أو LimitOrderState مُمرر هنا يتخلى عن فائضه مثل أي حساب مملوك من قبل CLMM آخر. يبقى معفياً من الإيجار ويحتفظ ببيانات الحساب. عند إغلاقه لاحقاً، يحصل المالك على ما يحتفظ به الحساب في تلك النقطة، وهو بعد المسح الحد الأدنى الحالي للإيجار.
حجم المعاملة هو الحد الحقيقي على عدد المصادر التي تناسب استدعاء واحد. إنه نفس القيد الموجود في المسح من جانب المحفظة الموصوف في solana-fundamentals/rent-and-reclaimable-rent. الأخطاء الشائعة:
  • NotApproved (6000): موقّع خاطئ.
  • LamportsCalculateError (6052): رحلة wSOL ذهاباً وإياباً لم تصل إلى صفر.
  • خطأ عدم تطابق مالك برنامج الرموز: مصدر رموز لا يملكه pool_state.
  • InsufficientFunds: حساب مملوك من قبل البرنامج يحتفظ بأقل من حده الأدنى للإيجار.
لا يوجد منشئ SDK. @raydium-io/raydium-sdk-v2 لا يشحن منشئاً لهذا المسار الإداري. قم بترميزه يدوياً من IDL.

InitializeReward

أضف تدفق مكافآت جديد إلى مجموعة. قد يكون هناك ما يصل إلى 3 تدفقات نشطة في نفس الوقت. الحجج — هيكل واحد، param: InitializeRewardParam:
ترميز السلك هو الحقول الثلاثة متتالية، لذا فإن التعليمة المبنية يدوياً لا تتأثر — لكن عميل يعتمد على IDL يجب أن يمرر كائن param واحد بدلاً من ثلاث حجج موضعية. الحسابات الشروط المسبقة
  • أقل من 3 تدفقات نشطة حالياً على المجموعة.
  • يودع الممول total_emission = emissions_per_second × (end_time − open_time) من رموز المكافآت في الخزينة كجزء من هذه التعليمة.
  • رموز مكافآت مدرجة في القائمة البيضاء لكل operation_state.

SetRewardParams

مدّد أو أضف إلى أو غيّر معدل الانبعاث على تدفق مكافآت موجود. عادة ما يتم استدعاؤها من قبل منشئ مجموعة أو multisig Raydium. القيود تعيش على السلسلة: يمكنك عادة تمديد end_time أو زيادة الانبعاثات، وليس تقليلها بأثر رجعي. تحقق من قائمة المالكين في operation_state.

UpdateRewardInfos

محاسبة بحتة — تسوي reward_growth_global_x64 للوقت الحالي بضرب emissions_per_second × Δt / liquidity. يتم استدعاؤها داخلياً من قبل كل تعليمة تلمس السيولة. تُعرّض كتعليمة مستقلة لأن الجهات الفاعلة الخارجية (واجهات المستخدم، الـ cranks) تريد أحياناً تشغيلها.

جمع المكافآت

لا توجد تعليمة جمع مكافآت مستقلة. البرنامج لا يعرّض نقطة دخول CollectReward، و IDL المنشور لا يحتوي على واحدة أيضاً.
يتم دفع المكافآت المستحقة لموضع من قبل DecreaseLiquidity / DecreaseLiquidityV2. لجمع دون تغيير الموضع، استدعها مع liquidity = 0، amount_0_min = 0، amount_1_min = 0. تذهب خزائن المكافآت وحسابات المستقبِل في remaining_accounts في مجموعات من ثلاثة لكل مكافأة نشطة، بالترتيب reward_token_vault(W)، recipient_token_account(W)، reward_vault_mint. CollectRemainingRewards شيء مختلف: يسمح لـ ممول المكافآت، بعد end_time للتدفق، بمسح الرموز التي لم يتم تخصيصها أبداً لأي موضع.

مصفوفة تغيير الحالة

الخطوات التالية

المصادر: