هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
يكشف LaunchLab عن مجموعة تعليمات محكمة: ستة استدعاءات موجهة للمستخدمين بالإضافة إلى عدد قليل من البدائيات الإدارية. يغلف SDK جميعها؛ تتناول هذه الصفحة السطح الخام للمجمعات وأدوات المراقبة والبرامج التي تحتاج إلى CPI.أعاد ترقية البرنامج 2026-09 بناء LaunchLab على Anchor 1.0.2 / Solana 3.1.10 وأزال ثلاث آليات انتقالية:
Initialize المهجور الآن يفشل دائمًا، فقد MigrateToAmm ثلاث وسائط وكل حساب OpenBook، وذهبت بوابة get_upgrade_timestamp التي جعلت عدة فحوصات مشروطة بالساعة. كما يضيف تعليمة إدارية واحدة، CollectExcessLamports. انظر إلى إدخال السجل 2026-09-09.جرد التعليمات
ينعكس الانقسام “ExactIn/ExactOut” في
SwapBaseInput / SwapBaseOutput الخاص بـ CPMM — على السلسلة يكونان مميزات تعليمات منفصلة برقم تقريبي مختلف قليلاً.
اختيار مسار التخرج. يجب على كل استدعاء InitializeV2 و InitializeWithToken2022 جديد تعيين migrate_type = 1 (CPSWAP). أي محاولة لتهيئة مجموعة مرتبطة بـ AMM v4 جديدة تُرجع MigrateTypeNotMatch. amm_creator_fee_on يختار فقط ما إذا كانت رسوم منشئ CPMM الناتجة تنطبق على رمز الاقتباس أو كلا الرمزين؛ فهو لا يختار البرنامج المستهدف. لا يمكن لـ Initialize القديم إنشاء إطلاق على الإطلاق بعد الآن (انظر أدناه).
يبقى MigrateToAmm قابلاً للاستدعاء لـ PoolState موجود تم تهيئته مع migrate_type = 0 قبل هذا التقييد. لا تعيد الإصدار كتابة حالة المجموعة الموجودة أو تزيل التعليمة القديمة.
برنامج رمز الاقتباس. قد تكون عملة الاقتباس مملوكة لبرنامج SPL Token أو Token-2022. كل تعليمة تلمسها — CreateConfig و InitializeV2 و InitializeWithToken2022 وجميع التعليمات التجارية الأربع و CollectFee و CollectMigrateFee و ClaimCreatorFee و ClaimPlatformFee و ClaimPlatformFeeFromVault — تأخذ البرنامج المالك في فتحة حسابها برنامج الاقتباس. لم تتغير مواضع الحساب؛ فقط القيمة المقبولة. مرر البرنامج الذي يمتلك فعلاً GlobalConfig.quote_mint، والذي يمكنك قراءته من بت PoolState.token_program_flag 1 لإطلاق موجود (انظر accounts) أو من مالك حساب العملة بخلاف ذلك.
Initialize المهجور غير ذي صلة هنا: حساب برنامج الاقتباس الخاص به لا يزال مكتوبًا إلى SPL Token، وبما أن ترقية 2026-09 تفشل التعليمة قبل قراءة أي حساب. قم بالإطلاق من خلال InitializeV2 أو InitializeWithToken2022.
MigrateToCpswap هو الاستثناء الآخر، في الاتجاه المعاكس — فهو يأخذ كلا البرنامجين بدون شروط بدلاً من واحد لكل عملة. انظر حسابات الهجرة أدناه.
Initialize
إنشاء إطلاق جديد. InitializeV2 يضيف فقط وسيط amm_fee_on على Initialize المهجورة؛ فعدد الحسابات وترتيبها متطابقان، والفرق الوحيد على مستوى الحسابات هو أن quote_token_program مكتوب كـ Interface<TokenInterface> بحيث تُقبل عملة اقتباس من Token-2022.
الوسائط
أربعة وسائط موضعية، وليست هيكلاً واحداً. (تُلحق InitializeWithToken2022 وسيطاً خامساً هو transfer_fee_extension_param: Option<TransferFeeExtensionParams>؛ أما Initialize المهجورة فتُسقط amm_fee_on.)
global_config.curve_type وإلا عادت التعليمة بخطأ InputNotMatchCurveConfig (6003). ولا يوجد open_time، ولا وسيط quote_mint (فهو يأتي من global_config)، ولا هيكل fees، ولا post_graduation_lp_policy — إذ يُحدَّد التصرف في LP على PlatformConfig، وليس لكل إطلاق.
الحسابات — 18 في المجموع (16 مُعلَناً بالإضافة إلى الإلحاقين من #[event_cpi])
الشروط المسبقة
quote_mint ∈ launch_config.allowed_quote_mints.base_supply_graduation ≤ base_supply_max.- معاملات الرسوم تمرر فحوصات
launch_config.max_*_fee_rate. open_time ≥ now − slop(SDK يفرض≥ now؛ البرنامج يتسامح مع التأخير البسيط).curve_typeمعروف.
base_mintلهsupply = curve_param.supply، الكل فيbase_vault.- تُلغى سلطة الصك في هذه التعليمة نفسها (
set_authority(MintTokens, None)) مباشرة بعد صك العرض — وليس عند التخرج. لذا فإن عملة الأساس ثابتة العرض بشكل دائم، ولا يمكن لأي تعليمة لاحقة صك المزيد. PoolStateمهيأ معstatus = Fund(0)،real_a = 0،real_b = 0.total_fund_raising_bيأتي مباشرة منcurve_param.total_quote_fund_raising.- لـ
InitializeWithToken2022معTransferFeeConfigمرفق:transfer_fee_config_authority = launch_authority، وwithdraw_withheld_authority = PlatformConfig.transfer_fee_extension_authعندما يتم تعيين هذا الحقل، وإلاlaunch_authority. يتم كتابة جانب السحب عند إنشاء العملة بالضبط حتى تتمكن المنصة من مسح الرسوم المحتفظ بها قبل التخرج. انظرplatform-config.
NotApproved (6000، دون شرط، لـ Initialize المهجورة)، InvalidInput (6002، انتهاك حد عرض / معدل / جمع تمويل من GlobalConfig)، InputNotMatchCurveConfig (6003، متغير curve_param لا يطابق global_config.curve_type)، MigrateTypeNotMatch (6007، migrate_type != 1)، MathOverflow (6008)، VestingRatioTooHigh (6010)، NoSupportExtension (6017)، NotEnoughRemainingAccounts (6018)، InvalidPlatformAllowConfig (6022)، CurveParamNotMatchPlatformRule (6025). أما فحص Anchor الفاشل من نوع address = / constraint = فيظهر برمز 2xxx، لا بأحد هذه الرموز — ولا وجود لأي من InvalidQuoteMint أو FeeRateTooHigh أو InvalidCurveParams في تعداد أخطاء البرنامج.
Buy (المتغير الأساسي: BuyExactIn)
يوفر المستخدم مبلغ إدخال ثابتًا؛ ويحسب المنحنى المخرَج.
الوسائط
الحسابات المتبقية — تمديدات الرسوم، تُقرأ بهذا الترتيب بالضبط:
share_fee_receiver— فقط عندماshare_fee_rate > 0.system_program— دائمًا؛ يُفحص أنه== System::id()، وإلاInvalidInput.platform_fee_vault— PDA[platform_config, quote_token_mint]؛ يُنشأ عند أول استخدام.creator_fee_vault— PDA[creator, quote_token_mint]؛ يُنشأ عند أول استخدام.
NotEnoughRemainingAccounts (6018). ولا توجد خانة associated_token_program،
و system_program هو حساب متبقٍّ وليس حسابًا مُعلَنًا.
الشروط المسبقة
launch_state.status == Active.now ≥ open_time.user_quote_ata.balance ≥ quote_in.quote_in > 0.
- قسّم
quote_inإلىquote_in_after_feeوأجزاء الرسوم. - حل Newton للمنحنى لـ
base_outبالنظر إلى الاقتباس بعد الرسوم. require(base_out ≥ minimum_base_out)وإلا عكسExceededSlippage.- انقل
quote_inالمستخدم → الخزان. انقلbase_outالخزان → المستخدم. - حدّث
base_sold += base_out،quote_reserve_real += quote_in_after_fee × (lp_share / total_share). - حدّث عدادات الرسوم (
protocol_fees_quote،creator_fees_quote). state_data.num_buys += 1.- إذا كان
quote_reserve_real ≥ quote_reserve_targetبعد التحديث، فإن SDK عادة ما يسلسلGraduateix في نفس المعاملة. البرنامج لا يتخرج تلقائيًا داخلBuy— يلزمGraduateلاحق.
BuyExactOut
يحدد المستخدم base_out الدقيق؛ يحسب البرنامج quote_in.
الوسائط
BuyExactIn. يستخدم التكامل التربيعي بالشكل المغلق (أو معكوس CPMM، لـ curve_type 1) بدلاً من تكرار Newton.
Sell / SellExactIn / SellExactOut
مرآة Buy. يعيد المستخدم base_in إلى المنحنى ويتلقى quote_out. يتم خصم الرسوم من quote_out، لذا يتلقى المستخدم أقل من العائدات المتكاملة الخام.
الشروط المسبقة —
user_base_ata.balance ≥ base_in.- البيع لا يمكن أن يدفع
base_soldتحت 0 (زائد مع ما ورد أعلاه بالنظر إلى أن المحاسبة متسقة). - الإطلاق هو
Active.
Buy. base_sold ينخفض، quote_reserve_real ينخفض. الرسوم لا تزال تتراكم.
رسوم نقل جانب الاقتباس
عندما تحمل عملة الاقتباسTransferFeeConfig، يختلف المبلغ الذي ينقله الخزان والمبلغ الذي يتم خصمه أو إضافته للدافع، وتُفحص حد الانزلاق مقابل جانب الدافع. على عملة اقتباس بدون الامتداد، كل حالة أدناه متطابقة مع عملة قديمة عادية.
نتيجتان للاقتباس:
- يتم رفض حد محسوب كما لو كانت العملة خالية من الرسوم. تمرير التكلفة الخالية من الرسوم كـ
maximum_amount_in، أو العائدات الخالية من الرسوم كـminimum_amount_out، ينعكس معExceededSlippage. real_quoteيتقدم فقط بما وصل إلى الخزان.BuyExactInمنamount_inعلى عملة اقتباس 5٪ ينقلreal_quoteبـamount_in × 0.95.
10000 نقطة أساس) وتنعكس مع CalculateOverflow على مسارات exact-out.
كلا عملات جانب التداول مقيدة أيضًا بالبرنامج الذي تم تمريره في فتحتها المطابقة، لذا فإن base_token_program غير المتطابق الآن يفشل بدلاً من تجاهله. انظر algorithms/token-2022-transfer-fees لرياضيات الرسوم الأساسية.
حسابات التداول المتبقية
تأخذ جميع التعليمات التجارية الأربع أنابيب الرسوم الخاصة بها من خلالremaining_accounts، بهذا الترتيب:
تم التغيير في 2026-09: الثلاثة الأخيرة الآن غير مشروطة، و
system_program تم التحقق منه. قبل هذا الإصدار، كان البرنامج يقرأها فقط عندما unix_timestamp >= get_upgrade_timestamp()، وتخطى تقسيم رسوم المنصة/المنشئ بالكامل قبل تلك اللحظة. الطابع الزمني بعيد جدًا، لذا السلوك على mainnet لم يتغير عمليًا — لكن الفرع اختفى من الكود، والمنشئ الذي لا يزال يحذف الحسابات الثلاثة الآن يفشل دائمًا مع NotEnoughRemainingAccounts (6018) بدلاً من فقط بعد القطع. يتم التحقق من فتحة system_program بالإضافة إلى ذلك مقابل System::id() وتُرجع InvalidInput (6002) إذا كانت تحتوي على أي شيء آخر، حيث تم قبول أي حساب في هذا الموضع سابقًا.MigrateToAmm / MigrateToCpswap
تخرج إطلاق إلى مجموعة قابلة للتداول بمجرد أن يصل المنحنى إلى total_quote_fund_raising. الإطلاقات الجديدة هي CPMM فقط. يتم الاحتفاظ بـ MigrateToAmm للمجموعات الموجودة التي يكون migrate_type المخزن فيها 0.
من يوقع
MigrateToAmm—migrate_to_amm_walletالمسجل على ربطGlobalConfig.MigrateToCpswap—migrate_to_cpswap_walletالمسجل على ربطGlobalConfig.
- تحقق من
pool_state.status == Migrate(أي، تم الوصول إلىquote_reserve_target). وإلا انعكس معPoolMigrated(كانت الحالة بالفعلMigrated) أوPoolFunding(لا تزال في التمويل). - تحقق من أن
pool_state.migrate_typeيطابق التعليمة (0لـ AMM،1لـ CPMM). وإلا انعكس معMigrateTypeNotMatch. - احسب الاحتياطيات بعد التخرج:
base_amount_out = base_vault.amount − vesting_schedule.total_locked_amountquote_amount_out = quote_vault.amount − quote_protocol_fee − migrate_fee − platform_fee
- CPI في البرنامج المستهدف (
AMM v4 Initialize2أوCPMM InitializeWithPermission) مع تلك الاحتياطيات لإنشاء مجموعة ما بعد التخرج. - بالنسبة لهجرات CPMM التي تم تنفيذها بعد ترقية 2026-08-17، دمج
platform_scale + creator_scaleفي حصة LP مقفلة مملوكة للمنصة واحدة وضرب على الأكثر مفتاح رسوم NFT واحد إلىplatform_nft_wallet. احرق بقيةburn_scale. قبل الترقية، كانتcreator_scaleمقفلة بشكل منفصل وذهب مفتاح الرسوم الخاص بها إلى منشئ الرمز. لم يتم تعديل الهجرات التاريخية المكتملة. بالنسبة لتخرج AMM v4 القديم، يتبع تخصيص LP تدفق التعليمات الموجود. - (لا توجد خطوة سلطة النعناع. تم بالفعل تعيين
base_mint.mint_authorityإلىNoneعند إنشاء الإطلاق — انظر الملاحظة أدناه.) - اقلب
pool_state.status = Migrated، اضبطvesting_schedule.start_time = block_time + cliff_period.
TransferFeeConfig و PlatformConfig.transfer_fee_extension_auth غير افتراضي، تعيد الهجرة أيضًا تعيين سلطات هذا الامتداد إلى مفتاح المنصة:
- يتم إعادة تعيين
transfer_fee_config_authorityدائمًا. يحتفظ بها PDAauthorityالإطلاق لمرحلة ما قبل التخرج بأكملها، لذا هناك دائمًا شيء للنقل. - يتم إعادة تعيين
WithheldWithdrawفقط عندما يحتفظ بها PDAauthorityلا تزال. الإطلاقات التي تم إنشاؤها من 2026-08-27 فصاعدًا تحمل بالفعلtransfer_fee_extension_authعلى تلك السلطة من إنشاء العملة، لذا يتم تخطي الخطوة. الحراسة هي ما يمنع الهجرة من الانعكاس على تلك العملات — لا يمكن لـ PDA التوقيع على سلطة لم تعد تحتفظ بها.
transfer_fee_extension_auth هو Pubkey::default() في وقت الهجرة، فلا تتحرك السلطات ويبقيان مع PDA authority بشكل دائم. انظر platform-config.
يتم إصلاح إمداد العملة الأساسية من الإنشاء، وليس من التخرج.
InitializeV2 و InitializeWithToken2022 تضرب الإمداد بالكامل في الخزان الأساسي ثم تلغي فورًا MintTokens في نفس التعليمة، لذا base_mint.mint_authority هو None لحياة الإطلاق بأكملها. الهجرة لا تلمسها. (وضعت الإصدارات السابقة من هذه الصفحة الإلغاء عند التخرج؛ كان ذلك خطأ.) السلطات الوحيدة التي يمكن للهجرة نقلها هي Token-2022 transfer-fee الموصوفة أدناه.BuyExactIn، BuyExactOut، SellExactIn، SellExactOut سترفض من هذه النقطة فصاعدًا مع PoolMigrated. مجموعة AMM الناتجة قانونية وتتداول مثل أي مجموعة AMM v4 / CPMM أخرى.
الأخطاء الشائعة — PoolFunding، PoolMigrated، MigrateTypeNotMatch، InvalidCpSwapConfig، MathOverflow.
حسابات هجرة CPMM المتبقية
يجب على العملاء الذين يبنونMigrateToCpswap استخدام فهارس remaining_accounts الثابتة هذه:
تتطلب التعليمة على الأقل عشرة حسابات متبقية. حسابات support-mint هي مدخلات CPI للقراءة فقط. اشتق كلا العنوانين حتى عندما لا يكون للعملة سجل دعم مهيأ. يجب تحديث المنشئين الأقدم الذين لا يزالون يضيفون حسابات قفل المنشئ أو يحذفون الفهارس 8–9.
تم التغيير في 2026-09. تنظيفان، لا أحدهما يغير منشئًا صحيحًا:
- مسار CPMM المرخص الآن هو المسار الوحيد. اعتادت
MigrateToCpswapعلى الاختيار بينInitializeCpSwapوInitializeCpSwapWithPermissionبناءً علىunix_timestamp >= get_upgrade_timestamp(). اختفى مساعد الطابع الزمني و CPI القديم، لذا ينطبق المسار المرخص — وبالتالي الحد الأدنى من عشرة حسابات — بدون شروط. - تم نقل ثلاثة قيود عنوان من هيكل الحساب إلى جسم التعليمة.
platform_configوbase_vaultوquote_vaultلا تزال مطلوبة للمطابقة مع القيم المخزنة علىPoolState، لكن عدم التطابق الآن يتم رفعه بواسطةrequire_keys_eq!بدلاً من قيد Anchoraddress =. الفحص معادل؛ فقط سطح الخطأ يختلف — تحصل علىRequireKeysEqViolated(2502) العام من Anchor بدلاً منConstraintAddress(2012)، ويتم الإبلاغ عنه بدون اسم حساب. حدّث أي معالجة خطأ طابقت على2012لهذه الحسابات الثلاثة.
برامج رمز هجرة CPMM
MigrateToCpswap يأخذ كلا برنامجي الرمز بدون شروط ويعرف أي واحد يمتلك كل عملة بنفسه. تمت إعادة تسمية حسابات برنامج الرمز الخاصة به وفقًا لذلك:
يحلان محل
base_token_program السابق (أي برنامج امتلك العملة الأساسية) و quote_token_program (دائما قديم). المواضع لم تتغير، لذا هذا تغيير قيمة وليس تغيير تخطيط — لكن القيمتين قريبتان من الانعكاس، والمنشئ الذي يستمر في تمرير زوجه القديم سيوفر Token-2022 حيث يكون البرنامج القديم مطلوبًا بمجرد أن تكون أي عملة عملة Token-2022.
البرنامج القديم مطلوب حتى عندما لا تستخدم أي عملة، لأن عملة LP الخاصة بـ CPMM ومفتاح رسوم NFT السيولة المقفلة يعيشان دائمًا عليها.
قائمة السماح GlobalConfig للمنصة
PlatformConfig.restrict_global_config يتحكم في الفحص:
0: تقبل المنصة أيGlobalConfigصحيح بخلاف ذلك؛ لا يلزم حساب السماح.1: يجب علىInitializeوInitializeV2وInitializeWithToken2022تضمينPlatformAllowConfigالمطابق في أي مكان فيremaining_accounts.
CreatePlatformAllowConfig و ClosePlatformAllowConfig. بذوره هي [b"platform_allow_config", platform_config, global_config]. تم إيقاف تعليمات PlatformGlobalAccess المدارة من قبل الإدارة السابقة و PDA.
قواعد معاملات الإطلاق للمنصة
تدير أربع تعليمات حسابPlatformCurveRule واحد. يتم توقيع جميعها بواسطة PlatformConfig.curve_rule_manager أو مسؤول المنصة — يقبل البرنامج الإدارة بإعادة اشتقاق PDA PlatformConfig من الموقّع، لذا لا يثبت حساب منفصل. الموقّع الذي ليس أحدهما يُرجع InvalidCurveRuleAuthority.
platform_curve_rule هو PDA في [b"platform_curve_rule", platform_config, global_config].
Createيخصص الحساب الذي لا يحتوي على مجموعة. تلك الحالة لا تقيد أي شيء.Updateيدرج المجموعة معgroup_idذلك، مستبدلاً بالكامل إذا كانت موجودة. يعيد حجم الحساب ليناسب، لذا يضيف الموقّع الإيجار الذي ينمو به ويتلقى الإيجار الذي ينكمش به. مجموعة جديدة تتجاوز العاشرة تُرجعCurveRuleGroupsExceeded؛ أكثر من 25 قيد، حقل غير معروف أو عامل، أو نفس زوج(field, op)مرتين في مجموعة واحدة تُرجعInvalidCurveRuleConstraint؛ الحقول الأربعة المشتقة منTotalSellAعلى إعدادات غير ثابتة الناتج تُرجعCurveRuleFieldNotSupportedByCurve.Removeيسقط مجموعة واحدة حسب المعرّف، ينكمش الحساب ويسترد الفرق. معرّف غير معروف يُرجعCurveRuleGroupNotExist.Closeيعيد الإيجار بالكامل إلى الموقّع. الإعدادات غير مقيدة بعد ذلك حتى عندما يبقىrestrict_curve_param1.
UpdatePlatformConfig::RestrictCurveParam(0 | 1)، والذي يمكن فقط لمسؤول المنصة استدعاؤه.
على مسار الإطلاق. بينما restrict_curve_param هو 1، يتطلب InitializeV2 و InitializeWithToken2022 PDA القاعدة في remaining_accounts — بما في ذلك عندما لا توجد، بحيث لا يمكن حذفها تخطي الفحص. الحساب المفقود هو NotEnoughRemainingAccounts؛ إطلاق لا يرضي أي مجموعة هو CurveParamNotMatchPlatformRule. يعمل الفحص قبل حدود GlobalConfig الخاصة به ويمكن فقط تضييقها. النموذج والكتيبات: products/launchlab/curve-rules. كلا الخطأين قابلان للتجنب من جانب العميل — يعكس SDK هذا الفحص كدالة نقية، انظر تحقق قبل الإرسال.
CollectFee
مسح إداري لرسوم البروتوكول المتراكمة على إطلاق واحد.
الوسائط — لا أحد.
الحسابات
التأثير — نقل
pool_state.quote_protocol_fee من quote_vault إلى recipient_token_account، ثم صفر العداد. قابل للاستدعاء في أي وقت بعد الشراء الأول.
CollectMigrateFee
مسح إداري لرسم الهجرة المتراكم عند التخرج. نفس شكل الحساب مثل CollectFee مع migrate_fee_owner كموقّع (بدلاً من protocol_fee_owner) و pool_state.migrate_fee كعداد مصرف.
ClaimCreatorFee
مسح لكل منشئ للرسوم المتراكمة للمنشئ عبر كل إطلاق يمتلكه المنشئ الذي يستخدم نفس عملة الاقتباس. يصرف خزان رسوم لكل منشئ، وليس خزان لكل مجموعة.
الوسائط — لا أحد.
الحسابات
التأثير — نقل الرصيد الكامل لـ
creator_fee_vault إلى recipient_token_account. ينعكس مع فحص require-greater-than-zero إذا كان الخزان فارغًا.
ClaimPlatformFee
مسح لكل منصة يصرف خزان الاقتباس الخاص بالإطلاق مباشرة. استخدم هذا عندما تريد منصة المطالبة بحصتها لإطلاق محدد واحد دون المرور عبر خزان المنصة المجمع.
الوسائط — لا أحد.
الحسابات
التأثير — نقل
pool_state.platform_fee من quote_vault إلى recipient_token_account، صفر العداد.
ClaimPlatformFeeFromVault
مسح مجمع لكل منصة. يصرف خزان رسوم عملة الاقتباس لكل منصة الذي يتراكم الرسوم من كل إطلاق موجه عبر المنصة.
الوسائط — لا أحد.
الحسابات
التأثير — نقل الرصيد الكامل لـ
platform_fee_vault إلى recipient_token_account. ينعكس إذا كان الخزان فارغًا.

