الانتقال إلى المحتوى الرئيسي
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
قفل الأموال (Vesting) اختياري على إطلاقة LaunchLab. عيّن vesting_param.total_locked_amount = 0 عند Initialize والقسم أدناه لا ينطبق. بمجرد التفعيل، يكون الجدول ثابتًا طوال عمر الإطلاقة؛ لا يمكن تغيير فترة الانتظار وفترات الفتح بأثر رجعي.

لماذا قفل الأموال

منحنى الربط يبيع base_supply_graduation رموز أثناء جمع التمويل وينشئ مجمع ما بعد التخرج ببقية الرموز. يقوم قفل الأموال بحجز شريحة إضافية من الإمدادات، وتقفلها لفترة انتظار قابلة للتكوين، ثم يحررها خطيًا لمستفيد واحد أو أكثر — عادة فريق المنشئ أو المستشارون أو شركاء المنصة. حالات الاستخدام العملية:
  • تخصيص الفريق. يحتفظ المنشئ، على سبيل المثال، بـ 5% من الإمدادات لفريق التأسيس، مقفولة لمدة 6 أشهر والفتح الخطي على مدار 12 شهرًا التالية.
  • تخصيص المنصة. تتلقى منصة الإطلاقة شريحة من كل رمز تدرجه، على نفس الجدول، عبر CreatePlatformVestingAccount.
  • منح المستشار / المساهم. عدة مستفيدين لديهم حساباتهم الخاصة من VestingRecord، كل منها يتتبع المبلغ المطالب به بشكل مستقل.
الرموز المقفولة لا تدخل المنحنى وليست جزءًا من مجمع التخرج. تبقى نائمة في base_vault الخاص بالمجمع حتى يستدعي كل مستفيد ClaimVestedToken.

شكل الجدول

يتم وصف قفل الأموال للإطلاقة بثلاثة أرقام، مسجلة مرة واحدة في وقت Initialize: تعيش هذه القيم الثلاث على PoolState.vesting_schedule (struct VestingSchedule) بالإضافة إلى start_time على السلسلة، والذي يسجله البرنامج باسم block_time + cliff_period في لحظة انتهاء جمع التمويل بنجاح (عند استيفاء شروط التخرج لأول مرة).
allocated_share_amount هو المبلغ الإجمالي المخصص بالفعل لحسابات VestingRecord عبر CreateVestingAccount / CreatePlatformVestingAccount. يجب ألا تتجاوز أبدًا total_locked_amount. إذا أفرط المنشئ في التخصيص، فإن استدعاء CreateVestingAccount التالي سيرجع مع InvalidTotalLockedAmount.

صيغة الفتح الخطي

بعد انتهاء جمع التمويل، يحسب البرنامج المبلغ المفتوح التراكمي لكل VestingRecord كـ:
إذا كان unlock_period == 0، فإن كل token_share_amount يصبح قابلاً للمطالبة في خطوة واحدة في start_time. وإلا فإن المنحنى هو خط مستقيم من 0 في start_time إلى token_share_amount في start_time + unlock_period، محصور في token_share_amount بعد ذلك. المبلغ المحول عند كل استدعاء ClaimVestedToken هو الفرق بين المبلغ المفتوح التراكمي المحسوب حديثًا وحقل claimed_amount الجاري على السجل.
المطالبة قبل start_time سترجع مع VestingNotStarted. المطالبة بعد start_time + unlock_period تسوي الباقي الكامل.

تخطيطات الحسابات

VestingSchedule

يعيش مضمنًا على PoolState. انظر accounts.

VestingRecord

سجل لكل مستفيد. PDA مشتق كـ:
لا يمكن للمستفيد أن يكون لديه واحد فقط VestingRecord لكل إطلاقة. التخصيص مرة أخرى لنفس المستفيد على نفس الإطلاقة سيرجع لأن PDA موجود بالفعل.

التعليمات

CreateVestingAccount

متاح فقط للمنشئ. يخصص شريحة من total_locked_amount الخاص بالمجمع لمستفيد جديد بتهيئة PDA VestingRecord جديد. الوسائط
الحسابات الشروط المسبقة
  • share_amount > 0.
  • pool_state.vesting_schedule.allocated_share_amount + share_amount <= total_locked_amount.
  • لا يوجد VestingRecord حالي للمفتاح العام beneficiary لهذا المجمع.
الشروط اللاحقة
  • تم تهيئة vesting_record مع token_share_amount = share_amount, claimed_amount = 0.
  • pool_state.vesting_schedule.allocated_share_amount += share_amount.
الأخطاء الشائعةInvalidTotalLockedAmount, InvalidInput.

CreatePlatformVestingAccount

متغير المسؤول عن المنصة لـ CreateVestingAccount. محفظة قفل الأموال الخاصة بالمنصة (المخزنة على PlatformConfig.platform_vesting_wallet) هي المستفيد، والمشاركة محدودة بـ PlatformConfig.platform_vesting_scale. يجب أن يساوي الموقّع platform_config.platform_vesting_wallet. الحسابات الأخرى تعكس CreateVestingAccount. استخدم هذا عندما توافق المنصة على تلقي حصة قفل أموال ثابتة على كل إطلاقة تدرجها.

ClaimVestedToken

متاح فقط للمستفيد. ينقل أي رموز مفتوحة حديثًا من base_vault الخاص بالمجمع إلى ATA الخاص بالمستفيد. الوسائط بدون وسائط (يحسب البرنامج مبلغ المطالبة من الجدول). الحسابات الشروط المسبقة
  • block_time >= pool_state.vesting_schedule.start_time (وإلا VestingNotStarted).
  • pool_state.status == PoolStatus::Migrated — يجب أن يكون التخرج قد حدث بالفعل. الاستدعاء قبل التخرج سيرجع.
  • فرق المبلغ المفتوح أكبر من صفر. استدعاء بدون فائدة (الفرق المحسوب هو 0) سيرجع.
الشروط اللاحقة
  • vesting_record.claimed_amount يتقدم إلى المبلغ المفتوح التراكمي الجديد.
  • يتم نقل delta_amount من الرمز الأساسي إلى beneficiary_ata.
الأخطاء الشائعةVestingNotStarted, NoAssetsToCollect, MathOverflow.

مثال عملي

تعيّن الإطلاقة:
  • supply = 1_000_000_000
  • total_locked_amount = 100_000_000 (10% من الإمدادات)
  • cliff_period = 180 * 86400 (180 يوم)
  • unlock_period = 365 * 86400 (سنة واحدة خطية بعد فترة الانتظار)
يخصص المنشئ حسابي VestingRecord فورًا بعد Initialize:
  • المستفيد أ (الفريق): share_amount = 70_000_000
  • المستفيد ب (المستشار): share_amount = 30_000_000
allocated_share_amount = 100_000_000، يساوي total_locked_amount — لا توجد تخصيصات إضافية ممكنة. ينتهي جمع التمويل في 2027-01-01T00:00Z. يعيّن البرنامج start_time = 2027-01-01 + 180 يوم = 2027-06-30. في 2027-09-30 (90 يوم بعد start_time)، يستدعي المستفيد أ ClaimVestedToken:
تتلقى محفظة أ 17.26 مليون رمز أساسي. يتقدم vesting_record.claimed_amount إلى 17_260_274. بعد ستة أشهر (2028-03-31، 270 يوم بعد start_time)، يطالب أ مرة أخرى:
يتلقى أ 34.52 مليون رمز آخر. بعد 2028-06-30 (نهاية unlock_period)، تنقل المطالبة التالية ~18.22 مليون المتبقي وتترك claimed_amount == token_share_amount.

الحالات الحدية

  • فقدان المستفيد لمفتاحه. المفتاح العام على VestingRecord.beneficiary هو الموقّع الوحيد الذي يمكنه استدعاء ClaimVestedToken. لا توجد مسار استرجاع. عيّن المستفيد إلى multisig إذا كان الاسترجاع مهمًا.
  • رسوم نقل Token-2022. إذا كان نعناع الرمز الأساسي رمز Token-2022 بامتداد رسم نقل، يتلقى المستفيد delta_amount − transfer_fee، وليس الفرق الكامل. يسجل خزان المجمع المبلغ الإجمالي كمنقول — يتراكم الفرق في حساب الرسم المحتفظ به للنعناع.
  • المجمع لم يتخرج. استدعاء ClaimVestedToken قبل التخرج سيرجع. تبدأ ساعة قفل الأموال فقط عند انتهاء جمع التمويل بالفعل؛ الإطلاقة المجهضة (التي لا تعيّن start_time) تترك الرموز المقفولة غير قابلة للوصول في الخزان.
  • محاولات الإفراط في التخصيص. يفرض البرنامج allocated_share_amount <= total_locked_amount على كل CreateVestingAccount. البقية (إن وجدت) من total_locked_amount المتروكة غير مخصصة مفقودة — تبقى تلك الرموز في الخزان إلى الأبد بمجرد تخرج الإطلاقة. خصص المبلغ الكامل ما لم يكن هذا هو القصد.

المؤشرات

المصادر:
  • raydium-launch/programs/launchpad/src/states/vesting.rsVestingRecord.
  • raydium-launch/programs/launchpad/src/states/pool.rsVestingSchedule, VestingParams, is_vesting_started, vesting_end_time.
  • raydium-launch/programs/launchpad/src/instructions/create_vesting_account.rs.
  • raydium-launch/programs/launchpad/src/instructions/claim_vested_token.rs.