هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
تقترن هذه الصفحة بـ
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
المعاملات
الشروط المسبقة
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 بالإضافة إلى وضع جمع الرسوم لكل مجمع واختيار رسوم ديناميكية اختياري.
المعاملات
CreatePool. dynamic_fee_config ليس حساب معلن عنه.
الشروط المسبقة — نفس 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(وضع الرسوم، الرسوم الديناميكية الاختيارية).
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.
الرياضيات — انظر 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 المطابق يجمد الحساب. لا يجمدOpenPositionV1.
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
إضافة سيولة إلى موضع مفتوح بالفعل.
الحجج
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
إزالة السيولة من موضع.
الحجج
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 الكلاسيكية وتبقى بإمداد صفر.
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):
- رسم ديناميكي إضافي — إذا كان
pool.dynamic_fee_infoغير صفري، يحدّث البرنامج مراكم التقلب باستخدام مسافة التكات المقطوعة منذ آخر مبادلة (مع قواعد التصفية/الاضمحلال منproducts/ar/clmm/fees) ويضيفdynamic_fee_componentفوقAmmConfig.trade_fee_rate. الرسم الإجمالي مقيد بـ 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - مطابقة أوامر الحد — عندما يعبر سير السعر تكة تحتوي على أوامر حد مفتوحة، يملأ البرنامج أولاً سيولة أوامر الحد المتاحة في تلك التكة (FIFO حسب
order_phase)، ثم يمضي على طول منحنى سيولة LP. تحدّث المبالغ المملوءةtick.unfilled_ratio_x64وtick.part_filled_orders_remainingللتسوية لاحقاً؛ تبقى الأوامر نفسها غير منفقة حتى يستدعي مالكهاSettleLimitOrder. - توجيه رسم أحادي الجانب — عندما يكون
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، مطلوب فقط عند تهيئة مصفوفة تكات يقع فهرس البداية الخاص بها خارج الخريطة النقطية المضمنة للمجموعة. لا تمرر شيئاً وإلا.
تغيير قائمة الحسابات (إصدار 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 الأمر.
الحجج
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 في وقت التشغيل، لذا يتم إصلاح الترتيب في البرنامج ولا تضطر إلى فرز القائمة بنفسك.
حجم المعاملة هو الحد الحقيقي على عدد المصادر التي تناسب استدعاء واحد. إنه نفس القيد الموجود في المسح من جانب المحفظة الموصوف في
solana-fundamentals/rent-and-reclaimable-rent.
الأخطاء الشائعة:
NotApproved(6000): موقّع خاطئ.LamportsCalculateError(6052): رحلة wSOL ذهاباً وإياباً لم تصل إلى صفر.- خطأ عدم تطابق مالك برنامج الرموز: مصدر رموز لا يملكه
pool_state. InsufficientFunds: حساب مملوك من قبل البرنامج يحتفظ بأقل من حده الأدنى للإيجار.
@raydium-io/raydium-sdk-v2 لا يشحن منشئاً لهذا المسار الإداري. قم بترميزه يدوياً من IDL.
InitializeReward
أضف تدفق مكافآت جديد إلى مجموعة. قد يكون هناك ما يصل إلى 3 تدفقات نشطة في نفس الوقت.
الحجج — هيكل واحد، param: InitializeRewardParam:
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) تريد أحياناً تشغيلها.
جمع المكافآت
يتم دفع المكافآت المستحقة لموضع من قبل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 للتدفق، بمسح الرموز التي لم يتم تخصيصها أبداً لأي موضع.
مصفوفة تغيير الحالة
الخطوات التالية
products/clmm/code-demos— عينات TypeScript قابلة للتشغيل.products/clmm/fees— تفاصيل حول تراكم الرسوم والمكافآت.reference/error-codes— جدول أخطاء Anchor الكامل لـ CLMM.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

