هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
هذه الصفحة هي المرجع الموثوق للتعليمات. للحصول على الكود الذي يؤلف هذه التعليمات فعليًا، انظر
products/cpmm/code-demos. لمعاني رموز الأخطاء انظر reference/error-codes.أعاد ترقية البرنامج 2026-09 بناء CPMM على Anchor 1.0.2 / Solana 3.1.10، وأضاف تعليمة المسؤول CollectExcessLamports، وأزال قائمة Token-2022 mint المشفرة بشكل ثابت، وغيّر ما تكتبه CreateAmmConfig في protocol_owner / fund_owner. لم تغيّر أي تعليمة موجهة للمستخدم حساباتها أو معاملات البرنامج أو الرياضيات. انظر إدخال السجل 2026-09-09.ملخص التعليمات
قناع الحالة:
status كل مجموعة هو u8 حيث البت 0 = الإيداع معطل، البت 1 = السحب معطل، البت 2 = المبادلة معطلة (PoolStatusBitIndex { Deposit, Withdraw, Swap } في البرنامج). البت الواضح يعني أن العملية مسموحة؛ البت المعين يعني أنها موقوفة. تأخذ UpdatePoolStatus u8 خام وتستبدل القيمة الموجودة.
تمر الأقسام التالية عبر كل واحدة بالتفصيل. يتبع ترتيب الحساب IDL الخاص بـ CPMM؛ يطابق SDK وعميل Rust في raydium-cp-swap/programs/cp-swap/src/instructions هذا الترتيب.
Initialize
إنشاء مجموعة CPMM جديدة.
المعاملات
* يوقّع pool_state فقط على مسار المفتاح العشوائي؛ يعمل مسار PDA القانوني بدون توقيع pool_state.
الشروط السابقة
- يتم فرز الـ mints (
token_0_mint < token_1_mintحسب ترتيب البايت). - لا يستخدم أي mint امتدادًا خارج قائمة السماح بـ CPMM (
TransferFeeConfig،MetadataPointer،TokenMetadata،InterestBearingConfig،ScaledUiAmount) — انظرproducts/cpmm/accounts. يتخطى mint الذي يوجد PDASupportMintAssociatedالخاص به (البذرة[b"support_mint", mint]) فحص الامتداد — لكن يجب عليك إضافة هذا PDA إلىremaining_accounts. يقوم البرنامج فقط بمسح الحسابات التي تمررها ولا يحمل PDA بنفسه، لذا فإن الاعتماد على السجل بدون توفير الحساب لا يزال يفشل معNotSupportMint(6007). الترتيب لا يهم (المطابقة حسب المفتاح)؛ مرر إدخالاً واحدًا لكل mint يحتاج إلى التجاوز. هذا السجل هو التجاوز الوحيد منذ أزالت ترقية 2026-09 قائمة الـ mint الأربعة المشفرة بشكل ثابت. - يمتلك
creatorعلى الأقلinit_amount_0وinit_amount_1في ATAs الخاصة. amm_config.disable_create_pool == false.
pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1)— الجذر التربيعي الكامل. يتم سكlp_supply − 100للمنشئ؛ يتم حساب 100 وحدة أساسية مقفلة فيlp_supplyلكن لا تُسك أبدًا.- لذا
lp_mint.supply == pool_state.lp_supply − 100لحياة المجموعة. تقسم كل رياضيات حصة LP (الإيداع، السحب) علىlp_supply، لذا استخدم هذا الحقل ولا تستبدل إمداد mint على السلسلة. يعود معInitLpAmountTooLessإذا كانsqrt(...) < 100. - يتم تهيئة
observation_state؛observation_index = 0وpool_id = pool_state.key(). - يتم نقل lamports
create_pool_feeمن المنشئ إلى المستقبل ومزامنتها كـ SOL أصلي (إنها ATA wSOL). - قناع حالة المجموعة هو
0(الإيداع / السحب / المبادلة جميعها مفعلة). enable_creator_fee = falseوcreator_fee_on = BothToken. لا تدعمInitializeتفعيل رسوم المنشئ — هذا المسار هوInitializeWithPermission.- يتم رفع
open_timeإلىblock_timestamp + 1إذا مرر المستدعي قيمة<= block_timestamp. يتم رفض المبادلات قبلopen_time؛ تعمل الودائع والسحوبات فورًا.
reference/error-codes)
InvalidInput— mints غير مرتبة، أو mints متطابقة.NotSupportMint— امتداد Token-2022 محظور.ExceededSlippage— نادرًا؛ إذا أسفرتinit_amount_0/1عن صفر LP بسبب عدم تطابق الكسور العشرية.
Deposit
إضافة السيولة في كلا الرمزين بما يتناسب مع المجموعة.
المعاملات
الرياضيات
vault_amount_without_fee، أي الرصيد الخام مطروحًا منه عدادات البروتوكول والصندوق والمنشئ المتراكمة)، وليس رصيد الخزينة الخام؛ وتُفحص حد الانزلاق مقابل ما يحويله الدافع فعليًا، بعد إضافة رسوم نقل Token-2022، وليس مقابل حركة الخزينة الإجمالية.
لا تغيير في تناسب k — يتم قياس كلا الإجماليين و lp_supply بنفس العامل.
الشروط اللاحقة
lp_supply += lp_token_amount.vault_0 += needed_token_0(بعد خصم أي رسوم نقل Token-2022 على الإدخال).vault_1 += needed_token_1(بعد خصم أي رسوم نقل Token-2022 على الإدخال).
ExceededSlippage، ZeroTradingTokens، InvalidStatus إذا كان الإيداع موقوفًا.
Withdraw
حرق رموز LP واستقبال كلا الرموز الأساسية بنسبة.
المعاملات
الحسابات الـ 13 الأولى متطابقة مع
Deposit، و lp_mint قابل للكتابة لأن رموز LP يتم حرقها. تأخذ Withdraw بالإضافة إلى ذلك حساب 14، memo_program (مقيد address = memo::ID) — لا تأخذ Deposit. يفشل Withdraw بـ 13 حساب في فك تسلسل Anchor، لذا لا يمكن لـ LP الخروج.
الرياضيات
lp_supply -= lp_token_amount.- ترسل الخزائن
out_token_0/out_token_1(إجمالي؛ يستقبل المستخدم بعد خصم أي رسوم نقل Token-2022).
SwapBaseInput
مبادلة بمدخل دقيق.
المعاملات
الترتيب الإدخال → الإخراج حسب اتجاه المستخدم، وليس حسب
token_0 / token_1 القانوني للمجموعة. يكتشف البرنامج أي خزينة هي أي بمطابقة الـ mints.
الرياضيات — انظر products/cpmm/math.
الشروط السابقة
open_time <= now.- تسمح
pool_statusبالمبادلة. - لا يتم إيقاف أي mint أو تجميده لهذه السلطة.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— التجارة تقرب إلى صفر.NotApproved— المجموعة موقوفة للمبادلات عبرUpdatePoolStatus.InvalidInput— الـ mints لا تطابق أيًا من خزائن المجموعة.
SwapBaseOutput
مبادلة بمخرج دقيق.
المعاملات
SwapBaseInput.
الرياضيات — منحنى معكوس مع سقف، انظر products/cpmm/math.
الأخطاء الشائعة — ExceededSlippage (gross_in > max_amount_in)، ZeroTradingTokens، InvalidInput، NotApproved.
CollectProtocolFee
مسح رسوم البروتوكول المتراكمة من الخزائن إلى وجهة البروتوكول.
المعاملات — لا توجد.
الحسابات
التأثير
InvalidOwner (6001) إذا لم يكن الموقّع amm_config.protocol_owner ولا مسؤول البرنامج. (لا يوجد NotApproved على هذا المسار.)
CollectFundFee
نفس شكل CollectProtocolFee لكن موقّع بواسطة amm_config.fund_owner — أو، مرة أخرى، مسؤول البرنامج — وتصفير عدادات fund_fees_*. نفس InvalidOwner على موقّع خاطئ.
CollectCreatorFee
موقّع بواسطة pool_state.pool_creator. يسوي رسوم المنشئ المتراكمة وينقل جزء المنشئ إلى حسابات الرموز الخاصة به.
المعاملات — لا توجد.
الحسابات
التأثير
CollectProtocolFee. تم استبعاد كلا العدادين بالفعل من رؤية المنحنى للخزينة، لذا لا يتحرك سعر المجموعة. الاشتقاق الكامل في products/cpmm/fees.
الأخطاء الشائعة — NoFeeCollect عندما يكون كلا عداد المنشئ صفرًا (يتم الفحص قبل الانقسام)، InvalidInput (6003) إذا تجاوز share_rate المحلول 1_000_000، MathOverflow (6011) إذا كان حجز الحصة سيتجاوز protocol_fees_token_*، وخطأ Anchor ConstraintSeeds إذا لم يكن creator_fee_share PDA القانوني.
CollectCreatorFeePermissionless
يمكن لأي شخص تشغيل جمع رسوم المنشئ. تُرسل التعليمة دائمًا جزء المنشئ إلى حسابات الرموز المرتبطة القانونية المملوكة بواسطة pool_state.pool_creator؛ لا يمكن للمستدعي اختيار منشئ أو وجهة أخرى. إذا كان أي ATA مفقودًا، يمول الدافع إنشاءه.
يبقى CollectCreatorFee الأصلي قابلاً للاستدعاء، لذا يمكن لمنشئ يريد التوقيع على جمعه الخاص أن يفعل ذلك.
المعاملات — لا توجد.
الحسابات
التأثير — متطابق مع
CollectCreatorFee أعلاه: يتم حل الحصة من creator_fee_share أو amm_config، يتم حجز جزء البروتوكول في protocol_fees_token_{0,1}، يتم نقل جزء المنشئ إلى ATAs المنشئ، يتم تصفير كلا عداد المنشئ، ويتم تحديث recent_epoch. يعود NoFeeCollect عندما يكون كلا العداد صفرًا.
UpdatePoolStatus
إيقاف أو استئناف عمليات فردية على مجموعة. حقل status هو قناع بت:
المعاملات
مفتاح المسؤول هو مفتاح عام مُترجم في البرنامج (
crate::admin::ID)، وليس سلطة ترقية BPF — تغييره يتطلب ترقية برنامج. انظر reference/program-addresses للقيمة و security/admin-and-multisig لمن يحتفظ بها.
CreateAmmConfig
إنشاء فئة رسوم جديدة.
المعاملات
الشروط السابقة
- لا يوجد
AmmConfigموجود بنفسindex. protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
تغيّر في 2026-09: لم تعد مالكو الرسوم للإعدادات الجديدة يأتون من الموقّع. تكتب
create_amm_config الآن protocol_fee_owner::ID المشفر بشكل ثابت في البرنامج في protocol_owner و fund_fee_owner::ID في fund_owner، بدلاً من نسخ مفتاح موقّع المسؤول إلى كليهما. العناوين موجودة في reference/program-addresses.العواقب: تهبط الرسوم على AmmConfig المُنشأ حديثًا في محافظ الرسوم المخصصة بدلاً من محفظة المسؤول. يبقى المسؤول موقّعًا مقبولاً لـ الجمع — تقبل CollectProtocolFee / CollectFundFee amm_config.protocol_owner / fund_owner أو crate::admin::ID — لذا لا يتعين تدوير أي شيء لمسح؛ ما تغيّر فقط هو حيث تذهب العائدات بشكل افتراضي. لم يتم إعادة كتابة حسابات AmmConfig الموجودة — ما يتم تخزينه عليها لا يزال يحكم، لذا اقرأ دائمًا protocol_owner / fund_owner من الحساب بدلاً من افتراض أي قيمة. معاملات UpdateAmmConfig 3 و 4 لا تزال تدورها.UpdateAmmConfig
تغيير معدلات الرسوم أو الملكية على AmmConfig موجود. يأخذ param: u8 (أي حقل لتحديثه) و value: u64. جدول الإرسال الكامل:
param = 0→trade_fee_rate(يؤكدtrade_fee_rate + creator_fee_rate < 1_000_000)param = 1→protocol_fee_rate(يؤكد≤ 1_000_000و+ fund_fee_rate ≤ 1_000_000)param = 2→fund_fee_rate(يؤكد≤ 1_000_000و+ protocol_fee_rate ≤ 1_000_000)param = 3→protocol_owner. المفتاح الجديد ليس فيvalue: أضفه كـremaining_accounts[0](القراءة فقط بخير). يجب ألا يكون المفتاح الافتراضي، وحذف الحساب يرمي علىunwrap().param = 4→fund_owner. نفس الآلية كـ3.param = 5→create_pool_feeparam = 6→disable_create_pool(أيvalueغير صفري يعطل)param = 7→creator_fee_rate(يؤكدcreator_fee_rate + trade_fee_rate < 1_000_000)param = 8→creator_fee_share_rate(يؤكد≤ 1_000_000). أضيفت 2026-09-19. حصة البروتوكول الافتراضية من رسوم المنشئ على هذه الفئة؛ انظرproducts/cpmm/fees. لا علاقة لها بـprotocol_fee_rate، الذي ينقسم رسوم التجارة.
param آخر يعود InvalidInput.
يتم توقيع التغييرات من قبل المسؤول وتؤثر على كل مجموعة مرتبطة بهذا AmmConfig على المبادلة التالية. لا هجرة؛ تقرأ المجموعات القيم الجديدة ببساطة.
CreateCreatorFeeShare
تعيين حصة بروتوكول مخصصة من رسوم المنشئ لزوج واحد (creator, amm_config)، مع تجاوز AmmConfig.creator_fee_share_rate لكل مجموعة ينشئها هذا المنشئ على تلك الفئة. أضيفت في ترقية حصة رسوم المنشئ 2026-09-19.
المعاملات
الشروط السابقة
share_rate <= 1_000_000، وإلاInvalidInput(6003).- يجب ألا يكون PDA موجودًا بالفعل — يفشل
initالخاص بـ Anchor على استدعاء ثانٍ لنفس الزوج. لتغيير معدل، أغلق الحساب وأنشئه مرة أخرى.
- يخزن
creator_fee_sharebump،creator،amm_configوshare_rate. - كل
CollectCreatorFee/CollectCreatorFeePermissionlessلاحق على مجموعة أنشأهاcreatorتحتamm_configيحل الحصة من هذا الحساب بدلاً من الإعدادات.
منشئ المجموعة ليس طرفًا في هذه التعليمة ولا يوقّعها. يتم قراءة المعدل في وقت الجمع، لذا يتم تطبيق تجاوز تم إنشاؤه بعد تراكم الرسوم بالفعل على هذا الرصيد المتراكم أيضًا.
CloseCreatorFeeShare
إزالة التجاوز. يعود الزوج إلى AmmConfig.creator_fee_share_rate.
المعاملات — لا توجد.
الحسابات
الشروط اللاحقة
- يتم إغلاق الحساب وتذهب lamports الخاصة به إلى
owner. - تحل الجمع لهذا الزوج الحصة من
amm_config.creator_fee_share_rateمرة أخرى — وهي0ما لم يعيّن مسؤولUpdateAmmConfigparam8.
CollectExcessLamports
مسح المسؤول لـ lamports الجالسة فوق الحد الأدنى المعفي من الإيجار على الحسابات التي يتحكم فيها CPMM. أضيفت في ترقية 2026-09 حتى يتمكن البروتوكول من استرجاع الإفراط في التمويل الذي يتركه SIMD-0437 rent reduction خلفه على الحسابات المُنشأة قبل كل خطوة.
يتحرك الفائض فقط. أرصدة الرموز وبيانات الحساب والمالكون وحالة المجموعة والمنحنى لم تتغير، والتعليمة هي عدم عملية ضد حساب بالفعل في الحد الأدنى — لذا من الآمن إعادة التشغيل بعد كل خطوة نشر.
المعاملات — لا توجد.
الحسابات
إصلاح الترتيب، 2026-09-19. يقوم البرنامج الآن بمسحتين على
remaining_accounts — كل CPI برنامج رموز أولاً، ثم الخصومات المباشرة لـ PDAs المملوكة لـ CPMM. كان الفصل بينهما يُجهض مع UnbalancedInstruction (“مجموع أرصدة الحساب قبل وبعد التعليمة لا تتطابق”) كلما تم خصم PDA قبل CPI، لأن التغييرات المعلقة lamport للمستدعي يتم تفريغها فقط في الحسابات التي تحملها CPI فعليًا. لا يتعين على المستدعين تجميع أو فرز القائمة بأنفسهم.
لأنها تأخذ قائمة
remaining_accounts غير محدودة، حجم المعاملة هو الحد الحقيقي — نفس القيد كما في مسح جانب المحفظة الموصوف في solana-fundamentals/rent-and-reclaimable-rent.
الأخطاء الشائعة — InvalidOwner (6001، موقّع خاطئ)، LamportsCalculateError (6015، لم تصل رحلة wSOL ذهابًا وإيابًا إلى صفر)، و InsufficientFunds من مسار المملوك للبرنامج عندما يحمل حساب أقل من الحد الأدنى للإيجار الخاص به.
لا منشئ SDK. لا تشحن @raydium-io/raydium-sdk-v2 منشئًا لهذه التعليمة، ولا تشحن مستودع raydium-sdk-V2-demo — إنه مسار مسؤول. شف
