Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
هذه الصفحة هي المرجع الموثوق للتعليمات. للحصول على الكود الذي يؤلف هذه التعليمات فعليًا، انظر 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.
غيّرت كلا تعليمتي جمع رسوم المنشئ قائمتي حساباتهما في 2026-09-19. تكتسب CollectCreatorFee حساب creator_fee_share؛ تكتسب CollectCreatorFeePermissionless حساب amm_config و creator_fee_share. كلاهما مُلحَق بعد system_program، لذا يحتفظ كل حساب يمرّره عميل موجود بموضعه — لكن الحسابات الجديدة إلزامية، لذا تأتي معاملة مبنية على التخطيط الأقدم ناقصة الحسابات وتُرفض بخطأ Anchor AccountNotEnoughKeys (3005). تُضاف تعليمتا مسؤول — CreateCreatorFeeShare و CloseCreatorFeeShare — و تأخذ UpdateAmmConfig معامل جديد param = 8. انظر إدخال السجل 2026-09-19.

ملخص التعليمات

قناع الحالة: 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 جديدة. المعاملات
الحسابات (W = قابل للكتابة، S = موقّع) * يوقّع pool_state فقط على مسار المفتاح العشوائي؛ يعمل مسار PDA القانوني بدون توقيع pool_state. الشروط السابقة
  • يتم فرز الـ mints (token_0_mint < token_1_mint حسب ترتيب البايت).
  • لا يستخدم أي mint امتدادًا خارج قائمة السماح بـ CPMM (TransferFeeConfig، MetadataPointer، TokenMetadata، InterestBearingConfig، ScaledUiAmount) — انظر products/cpmm/accounts. يتخطى mint الذي يوجد PDA SupportMintAssociated الخاص به (البذرة [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 الأصلي قابلاً للاستدعاء، لذا يمكن لمنشئ يريد التوقيع على جمعه الخاص أن يفعل ذلك. المعاملات — لا توجد. الحسابات
الحسابان الجديدان مُلحَقان بعد system_program، لا مُدرجان. يحتفظ كل حساب من payer حتى system_program بالموضع الذي كان له قبل الترقية، لذا الكسر نظيف: لا تسيء معاملة مبنية على تخطيط ما قبل الترقية ذي الأربعة عشر حسابًا قراءة الخزينة كحساب إعدادات — بل تمرّر حسابات أقل من اللازم فحسب، فيرفضها Anchor بخطأ AccountNotEnoughKeys (3005) قبل تشغيل أي قيد. لا تزال الحسابات إلزامية، لذا ألحِق كليهما وحدّث IDL؛ لا يوجد مسار توافق للتخطيط القديم.
التأثير — متطابق مع 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_fee
  • param = 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_share bump، 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 ما لم يعيّن مسؤول UpdateAmmConfig param 8.

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 — إنه مسار مسؤول. شف