Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
قاعدة المنحنى هي إجابة المنصة على السؤال: “أي عمليات إطلاق أنا مستعد لاستضافتها؟”. يحدد GlobalConfig الحد الأدنى للبروتوكول — توفير 10 ملايين على الأقل، بيع 20% على الأقل من الإمداد على المنحنى، وما إلى ذلك — وهذه الحدود الدنيا متعمدة أن تكون واسعة بحيث تناسب كل منصة. قاعدة المنحنى هي حيث تضيق منصتك هذه الحدود لتناسب الشكل الذي يدعمه منتجك فعلاً.تعيش القواعد في حسابها الخاص PlatformCurveRule، واحدة لكل زوج (منصة، GlobalConfig). يمكنها فقط تضييق ما يسمح به الإعداد بالفعل؛ لا يمكن لقاعدة أن توسع حد البروتوكول أبداً.

النموذج الذهني

ثلاث مستويات، من الخارج إلى الداخل:
المستويان من التداخل هما ما يجعل هذا معبّراً:
  • القيود داخل مجموعة واحدة مرتبطة بـ AND. يجب أن تكون جميعها صحيحة.
  • المجموعات داخل قاعدة واحدة مرتبطة بـ OR. يُسمح بالإطلاق بمجرد استيفائه لأي مجموعة واحدة.
إذاً المجموعة هي شكل واحد مسموح به، والقاعدة هي قائمة الأشكال التي تقدمها. تحتفظ القاعدة بما يصل إلى 10 مجموعات، والمجموعة بما يصل إلى 25 قيداً. هناك حالتا حدود تستحق الحفظ: تسري القاعدة فقط بينما PlatformConfig.restrict_curve_param هو 1. عند 0 البرنامج لا يقرأ القواعس على الإطلاق، وهذا أيضاً هو المفتاح الذي تستخدمه لتفعيل قاعدة والتراجع عنها.

القيود

القيد هو ثلاثية (field, op, value). لا شيء آخر — لا تعبيرات، لا تداخل.
النطاق هو قيدان على نفس الحقل داخل مجموعة واحدة: Gte للحد الأدنى و Lte للحد الأقصى. لا يمكن أن يظهر نفس الزوج (field, op) مرتين في مجموعة واحدة، وهذا ما يمنعك من كتابة حدين أدنى متناقضين.

الحقول

معرفات الحقول دائمة. الحقول الجديدة تُضاف فقط، لذا لا يتغير معنى المعرف أبداً بمجرد أن يحتفظ به حساب القاعدة.
الحقول المشتقة هي التي تجعل القواعد محمولة. تثبيت Supply و TotalFundRaisingB على أرقام دقيقة يثبت شكل إطلاق واحد؛ تقييد FundRaisingRateB يثبت العلاقة بينهما ويسمح للمنشئ باختيار أي إمداد يحافظ عليها.
حقول المعدل قابلة للمقارنة فقط داخل GlobalConfig واحد، لأن مقاماتها تعتمد على رمز الاقتباس في هذا الإعداد وعدد الكسور العشرية. هذا ليس قيداً عملياً: القاعدة مقيدة بإعداد واحد بالبناء.

الاستراتيجيات التسع

كل استراتيجية أدناه هي قاعدة واحدة. تُكتب القيود كـ (field, op, value).

1. فئة معيارية واحدة

أبسط قاعدة، والسلوك الدقيق الذي قدمته قائمة معاملات المنحنى البيضاء المتقاعدة: شكل واحد، مثبت. أي إطلاق ينحرف في أي من الثلاثة يُرفض مع CurveParamNotMatchPlatformRule.

2. نطاق بدلاً من رقم

السبب في وجود النطاقات: يختار المنشئ هدف جمع الأموال الذي تشعر معه بالراحة، دون أن تعدد كل قيمة. مجموعة واحدة، أربعة قيود، والمنشئ لديه ممر 50–200 SOL. تحت القائمة البيضاء القديمة كان هذا يحتاج إلى إدخال واحد لكل قيمة مسموحة، وحد الدخول العشرة جعله مستحيلاً.

3. فئات جنباً إلى جنب

المجموعات مرتبطة بـ OR، لذا كل فئة هي مجموعة. الترتيب مهم للحساب، وليس للدلالات: التقييم يتوقف عند أول مجموعة تطابق، لذا ضع فئتك الأكثر استخداماً أولاً.

4. نطاق تقييم التخرج

FundRaisingRateB هو TotalFundRaisingB / Supply بالملايين. تقييده يحد من مدى ثراء الرمز عند التخرج بغض النظر عن الإمداد الذي اختاره المنشئ. مع إمداد 1e12 ورمز اقتباس بـ 9 كسور عشرية، 85e9 / 1e12 × 1e6 = 85_000 يقع داخل هذا النطاق. يجب على المنشئ الذي يضاعف الإمداد أن يضاعف الهدف تقريباً للبقاء فيه — وهذه هي النقطة. قيدان يحلان محل ما كان سيكون جدول (supply, target) أزواج.

5. حد الهجرة

MigrateRateA هو حصة الإمداد التي تصل فعلاً إلى مجموعة CPMM عند التخرج: Supply − TotalSellA − TotalLockedAmount، على الإمداد. إنه عمق المجموعة المتخرجة، وهو المقبض الوحيد للبروتوكول الذي لا يوجد له معادل من جانب المنصة قبل القواعد. على الأقل 15% من الإمداد يصل إلى المجموعة. لا يمكن للمنشئ بيع 95% على المنحنى وترك كتاب ضحل خلفه.
إذا لم تضف المعاملات — مبلغ مقفول أكبر من ما تبقى بعد بيع المنحنى — لا يمكن حساب القيمة المشتقة والقيد يفشل مغلقاً، لذا يُرفض الإطلاق بدلاً من السماح به بصمت.

6. الاستحقاق الذي تفرضه فعلاً

GlobalConfig.max_lock_rate يحد الاستحقاق من الأعلى. يمكن للقاعدة أن تضع حداً أدنى تحته، وتتطلب منحدراً حقيقياً. بين 5% و 20% من الإمداد مستحق، مع حد أدنى من 30 يوماً. مفيد لمنصة يقول عرضها “لا إطلاقات فتح فوري”.

7. بوابة نوع الرمز

BaseTokenProgram و TransferFeeEnabled مستقلان، وهذا مهم: رمز Token-2022 بدون TransferFeeConfig يبلغ TransferFeeEnabled = 0 تماماً مثل رمز SPL Token.

8. حد رسم نقل مشروط

لا يوجد عامل “if”، ولا يلزم — مجموعتان تعبران عن الشرط. TransferFeeConfig بمعدل صفر لا ينزلق عبر المجموعة 0: الامتداد موجود، لذا TransferFeeEnabled هو 1 وفقط المجموعة 1 يمكنها قبوله.

9. عرض ترويجي محدود بالوقت، مجدول مقدماً

UnixTimestamp هو وقت الكتلة للإطلاق، لذا يمكن لمجموعة أن تحمل نافذة صلاحيتها الخاصة. تكتب كلا المجموعتين اليوم والتبديل يحدث من تلقاء نفسه. لا توجد معاملة مطلوبة عند الحد. التكلفة هي فتحتا مجموعة بدلاً من واحدة.

قيود نوع المنحنى

أربعة حقول تقرأ TotalSellA: TotalSellA، SellRateA، MigrateAmountA، و MigrateRateA. على إعداد منتج ثابت يوفر المنشئ هذا الرقم. على إعداد سعر ثابت أو سعر خطي يشتقه المنحنى بدلاً من ذلك، والقيمة التي يقارنها البرنامج هي 0، وهذا سيرفض كل إطلاق. بدلاً من السماح لك بكتابة قاعدة تحجب إعدادك الخاص بصمت، يرفض البرنامج هذه الحقول الأربعة في وقت الكتابة على إعداد غير منتج ثابت، مع CurveRuleFieldNotSupportedByCurve. توجد فقط إعدادات منتج ثابت اليوم، لذا عملياً لن تواجه هذا الخطأ.

تحقق قبل أن ترسل

كلا اتجاهي الفحص على السلسلة متاحان خارج السلسلة، لذا لا يتعين على المنشئ ولا على المنصة تعلم قاعدة بمراقبة المعاملات المرتدة.
لافتة الإصدار.
  • SDK: @raydium-io/raydium-sdk-v2@0.2.42-alpha هو الإصدار الذي يتم تثبيت كل عرض كود آخر على هذا الموقع عليه. المساعدان أدناه يأتيان مع إصدار SDK الذي يشحن دعم قاعدة المنحنى؛ حتى ذلك الحين، انقل منهما من platform_curve_rule.rs للبرنامج أو اتصل بالبرنامج واقرأ رمز الخطأ.
  • الكتلة: اختبر على Solana devnet أولاً — انظر اختبر على devnet أولاً.
  • معرف البرنامج: انظر reference/program-addresses
كلا المساعدين دوال نقية. لا تلمس أي RPC، لذا من الآمن تشغيلهما على كل ضغطة مفتاح في نموذج.

قبل الإطلاق: هل ستمر هذه المعاملات؟

checkLaunchAgainstCurveRule يعكس فحص وقت الإطلاق للبرنامج بالضبط، بما في ذلك سلوكه الفاشل المغلق. شغّله في نموذج الإطلاق الخاص بك ويمكنك تعطيل زر الإرسال بسبب بدلاً من السماح للمنشئ بدفع معاملة مرتدة.
ثلاثة أشياء يعيد إنتاجها المساعد بدلاً من تقريبها:
  • حساب قاعدة مفقود، وقاعدة بدون مجموعة، كلاهما يمر. كذلك مجموعة بدون قيود. مرر rule: undefined لحساب غير موجود؛ لا تعامله كرفض.
  • القيم غير القابلة للحساب تفشل مغلقة. إمداد صفر ليس له معدلات، ومبلغ مقفول أكبر من ما يتركه بيع المنحنى ليس له مبلغ هجرة. actual يعود undefined والقيد يُحسب كغير مرضٍ، تماماً كما هو الحال على السلسلة.
  • جميع القيود الفاشلة يتم الإبلاغ عنها، وليس فقط الأول. البرنامج يختصر لأنه يحتاج فقط إلى حكم؛ المساعد يجمع كل شيء حتى يتمكن نموذجك من سرد كل مشكلة مرة واحدة.
الشيء الوحيد الذي لا يمكنه معرفته هو وقت الكتلة الذي ستصل معاملتك إليه فعلاً. إذا كانت قاعدة تستخدم UnixTimestamp بالقرب من حد، تعامل مع النجاح كمؤقت.

قبل كتابة قاعدة: هل هذه المجموعة صالحة؟

checkCurveRuleGroupWritable يعكس التحقق من وقت الكتابة من UpdatePlatformCurveRule — معرفات القيود، قاعدة (field, op) المكررة، كلا حدود العد، وقيد نوع المنحنى. شغّله في أداة إدارة منصتك قبل التوقيع.
النجاح في هذا الفحص يعني أن المعاملة لن يتم رفضها لكونها سيئة التكوين. لا يقول شيئاً عما إذا كانت القاعدة هي ما قصدته — يمكن لمجموعة أن تكون صالحة تماماً وتظل ترفض كل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه. هذا ما الفحص من جانب الإطلاق أعلاه: بعد كتابة مجموعة، شغّل كل شكل يمكن لمنتجك إنتاجه عبر checkLaunchAgainstCurveRule وأكد أن كل واحد لا يزال يجد مجموعة.

اختبر على devnet أولاً

تفعيل restrict_curve_param على mainnet يغير ما يمكن لمنشئيك فعله، فوراً، لكل إطلاق. تدرب على التسلسل كله على devnet قبل أن تلمس mainnet:
  1. أنشئ إعداد منصة وقاعدة على devnet، واكتب نفس المجموعات التي تنوي شحنها.
  2. شغّل كل شكل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه عبر checkLaunchAgainstCurveRule، وأكد أن الأحكام هي التي تتوقعها — كل من الأشكال التي يجب أن تمر والأشكال التي يجب رفضها.
  3. فعّل restrict_curve_param، ثم أطلق فعلاً رمزاً يجب أن يمر وواحداً يجب أن يُرفض. الثاني يجب أن يفشل مع CurveParamNotMatchPlatformRule (6025)، وليس مع NotEnoughRemainingAccounts (6018) — الأخير يعني أن منشئك لا يضيف PDA القاعدة والفحص لا يتم تمريره فعلاً.
  4. فقط بعد ذلك كرر على mainnet، بنفس الترتيب.
النقطة 3 هي التي تستحق الإصرار عليها. المساعد خارج السلسلة والبرنامج على السلسلة هما تطبيقان لنفس القواعد، وإطلاق devnet هو ما يثبت أنهما يتفقان على قاعدتك — بما في ذلك أن منشئ الإطلاق الخاص بك يمرر الحساب على الإطلاق.

تشغيل قاعدة

مدير مفوض

تحرير القواعد عمل روتيني؛ مفتاح إدارة المنصة عادة ما يكون multisig. PlatformConfig.curve_rule_manager موجود بالضبط لهذا: اضبطه مرة واحدة عبر UpdatePlatformConfig::CurveRuleManager، وتلك المحفظة الساخنة يمكنها بعد ذلك إنشاء وتحديث وإزالة وإغلاق حسابات القاعدة بمفردها. يحتفظ مسؤول المنصة بنفس السلطة بالتوازي، لذا مفتاح مدير مفقود قابل للاسترجاع — أدره بنداء إدارة آخر. نطاق مفتاح مدير مخترق: يمكنه تخفيف أو حذف قواعد المعاملات الخاصة بك، ويمكنه استرجاع إيجار حساب القاعدة. لا يمكنه لمس محافظ الرسوم، الاستحقاق، إعداد CPMM، لا يمكنه قلب restrict_curve_param، ولا يمكنه كسر حد GlobalConfig. تعامل معه كمفتاح إعداد، وليس مفتاح خزينة.

الإيجار يتبع المحتوى

حساب القاعدة يُنشأ بدون مجموعة ويُعاد تحجيمه على كل تغيير، لذا تدفع للقواعد التي كتبتها فعلاً. إزالة مجموعة تسترجع الفرق للموقّع.

ترتيب التفعيل

  1. تدرب على التسلسل كله على devnet — انظر اختبر على devnet أولاً.
  2. أنشئ حساب القاعدة واكتب مجموعاتها. لا شيء يتغير حتى الآن — مع restrict_curve_param لا يزال 0 البرنامج لا يقرأها.
  3. تحقق من القاعدة خارج السلسلة مع checkLaunchAgainstCurveRule: لكل شكل إطلاق يمكن لواجهة المستخدم الخاصة بك إنتاجه، أكد أن بعض المجموعة تقبله.
  4. اضبط restrict_curve_param على 1. من تلك اللحظة فصاعداً إطلاقات منشئيك يتم فحصها.
  5. للتراجع، اضبطه على 0 مرة أخرى. حساب القاعدة يُترك سليماً.
منشئ الإطلاق الخاص بك يجب أن يضيف PDA القاعدة إلى remaining_accounts بينما restrict_curve_param هو 1. البرنامج يتطلب الحساب ليكون موجوداً حتى عندما لا يكون موجوداً بعد، حتى لا يتمكن المنشئ من تخطي الفحص بحذفه — حساب مفقود هو NotEnoughRemainingAccounts، وليس نجاح. الاشتقاق هو [b"platform_curve_rule", platform_config, global_config].

التكلفة في وقت الإطلاق

الفحص يعمل على كل إطلاق بينما يكون مفعلاً، لذا تكلفته الحسابية هي ضريبة لكل إطلاق. مقاس من البداية إلى النهاية — اشتقاق PDA، مسح remaining_accounts، فك التسلسل، والتقييم: “رخيص” هو قراءة حقل مباشرة مثل Supply؛ “مشتق” هو واحد محسوب مثل MigrateRateA، الذي يكلف حوالي 223 CU لكل قيد مقابل حوالي 48. حتى قاعدة محملة بالكامل من القيود المشتقة تبقى داخل ثلث ميزانية 200 000 CU الافتراضية لكل تعليمة، وقاعدة واقعية بثلاث مجموعات أقل من 6 000. يتم تقييم المجموعات حتى تطابق واحدة، لذا ترتيب فئتك الشائعة أولاً هو توفير مجاني.

أين تذهب بعد ذلك

المصادر:
  • raydium-launch/programs/launchpad/src/states/platform_curve_rule.rsPlatformCurveRule، CurveRuleGroup، ParamConstraint، مساحات معرف الحقل والعملية، و CurveRuleContext::value_of.
  • raydium-launch/programs/launchpad/src/utils/platform_curve_rule.rs — فحص وقت الإطلاق.
  • raydium-launch/programs/launchpad/src/instructions/platform/create، update، remove، و close_platform_curve_rule.