تعليمات المزرعة خاصة بالإصدار. تعليمة Deposit على v6 غير قابلة للاستدعاء على مزرعة v5 والعكس صحيح. يقوم SDK بالتوزيع من خلال قراءة مالك برنامج المزرعة؛ بالنسبة إلى CPI على السلسلة، يجب عليك اختيار معرّف البرنامج الصحيح مقدمًا.
فهرس التعليمات
| الغرض | v3 | v5 | v6 |
|---|
| إنشاء مزرعة | CreateFarm | CreateFarm | CreateFarm |
| إضافة دفتر أستاذ المستخدم (قد يكون ضمنيًا) | CreateUserLedger | CreateAssociatedLedger | ضمني في Deposit |
| Staking | Deposit | Deposit | Deposit |
| Unstaking | Withdraw | Withdraw | Withdraw |
| المطالبة بالمكافآت فقط | غير متاح (استخدم Deposit 0) | غير متاح (استخدم Deposit 0) | Harvest |
| إضافة تدفق مكافأة بعد الإنشاء | غير متاح | AddReward | AddReward |
| تعديل تدفق مكافأة موجود | غير متاح | SetRewards | SetRewards |
| إعادة تشغيل مكافأة بعد end_time | غير متاح | RestartRewards | RestartRewards |
| سحب ميزانية المكافآت غير المطالب بها (المسؤول) | غير متاح | WithdrawReward | WithdrawReward |
على v3 و v5، الطريقة الموصى بها للمطالبة بالمكافآت دون تغيير الحصة هي استدعاء Deposit مع amount = 0. يتعامل البرنامج مع هذا كتسوية بحتة. أدخل v6 Harvest صريح لتوضيح الأمور.
يجرّد SDK كل هذا خلف raydium.farm.deposit({ ... }) وما إلى ذلك. تتناول الأقسام أدناه قوائم الحسابات الأساسية للمدمجين الذين يحتاجون إلى بناء التعليمات يدويًا (المجمعات وأدوات المراقبة وملحقات SDK).
CreateFarm (v6)
إنشاء مزرعة v6 جديدة.
الوسائط
reward_info_count: u8 // عدد تدفقات المكافآت عند الإنشاء (1..=5)
reward_infos: [
{
open_time: u64,
end_time: u64,
emission_per_second_x64: u128, // Q64.64
mint: Pubkey, // نعناع المكافأة
token_program: Pubkey, // SPL أو Token-2022
}
]
الحسابات (موجزة، ل reward_info_count = 1)
| # | الاسم | W | S | ملاحظات |
|---|
| 1 | creator | W | S | يدفع الإيجار، يمتلك المزرعة. |
| 2 | farm_state | W | | حساب FarmState جديد. |
| 3 | farm_authority | | | PDA [farm_id]. |
| 4 | staking_mint | | | |
| 5 | staking_vault | W | | تم إنشاؤه كـ ATA للسلطة أو منجم PDA. |
| 6 | staking_token_program | | | |
| 7 | reward_mint | | | |
| 8 | reward_vault | W | | سيستقبل الميزانية الأولية. |
| 9 | reward_token_program | | | |
| 10 | reward_sender_ata | W | | ATA المُنشئ على نعناع المكافأة؛ يتم استنزافه بواسطة هذه التعليمة. |
| 11 | system_program | | | |
| 12 | token_program | | | |
| 13 | associated_token_program | | | |
| 14 | rent | | | |
الشروط المسبقة
open_time > now، end_time > open_time.
- ATAs المنشئ تحتفظ بما لا يقل عن
emission_per_second_x64 × (end_time − open_time) / 2^64 من نعناع المكافأة.
- لا يحتوي
staking_mint على سلطة تجميد، أو يتم تعطيل سلطة التجميد.
الشروط اللاحقة
- تم تهيئة
FarmState، total_staked = 0.
- تم تمويل منجم (منجم) المكافآت بميزانية التدفق الكاملة.
- تم استنزاف ATA المكافأة للمُنشئ بهذا المبلغ.
Deposit (v6)
Stake amount من نعناع الحصة.
الوسائط
الحسابات
| # | الاسم | W | S |
|---|
| 1 | user | W | S |
| 2 | user_ledger | W | |
| 3 | farm_state | W | |
| 4 | farm_authority | | |
| 5 | staking_vault | W | |
| 6 | user_staking_ata | W | |
| 7..(7+n) | reward_vault_{i} | W | |
| … | user_reward_ata_{i} | W | |
| last−2 | system_program | | |
| last−1 | token_program | | |
| last | associated_token_program | | |
إذا كان user_ledger غير موجود، يضيف SDK بادئة CreateAccount-style ix؛ يمكن لبرنامج v6 أيضًا إنشاؤه بكسل مرة واحدة بالنظر إلى حساب البرنامج النظامي. نمط الحسابات المتبقية: لكل مكافأة نشطة، أضف (reward_vault, user_reward_ata) حتى تتمكن التسوية من الدفع.
التأثير
- تحديث
reward_per_share_x64[i] لكل تدفق مكافأة نشط باستخدام صيغة التحديث الكسول.
- حساب
pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i].
- نقل
pending_i من reward_vault_{i} إلى user_reward_ata_{i}.
- نقل
amount نعناع الحصة من user_staking_ata إلى staking_vault.
- تحديث
user_ledger.deposited += amount وإعادة التقاط reward_debts[i].
- تحديث
farm_state.total_staked += amount.
الشروط المسبقة
amount > 0 للحصة الحقيقية (v6 يمنع amount = 0 — استخدم Harvest للمطالبة فقط).
- يحتفظ
user_staking_ata بـ amount على الأقل.
- يحتفظ كل منجم مكافأة نشط بـ pending المستحق لهذا المستخدم على الأقل.
Withdraw (v6)
Unstake amount.
الوسائط
الحسابات — مطابقة لـ Deposit.
التأثير — نفس التسوية مثل Deposit، ثم نقل نعناع الحصة مرة أخرى للمستخدم: staking_vault → user_staking_ata. ينخفض كل من total_staked و user_ledger.deposited.
الشروط المسبقة
amount ≤ user_ledger.deposited.
- المزرعة لم تتوقف عن العمل.
Harvest (v6)
المطالبة بالمكافآت المعلقة دون تغيير الحصة.
الوسائط — لا توجد.
الحسابات — نفس Deposit، بدون حركة على جانب الحصة.
التأثير — تحديث reward_per_share_x64[i]، دفع pending_i، إعادة التقاط reward_debts[i]. بدون تغيير في total_staked أو deposited.
AddReward (v5/v6)
إضافة تدفق مكافأة جديد إلى مزرعة موجودة بها فتحة غير مستخدمة.
الوسائط
reward_info: {
open_time: u64,
end_time: u64,
emission_per_second_x64: u128,
mint: Pubkey,
token_program: Pubkey,
}
الشروط المسبقة
- توجد فتحة حرة (
reward_info_count < 5 على v6، < 2 على v5).
open_time ≥ now (قد يكون في المستقبل) أو يُسمح بـ open_time < now فقط إذا سمح برنامج الإصدار — v6 يفعل، v5 لا.
الشروط اللاحقة
- تم تهيئة التدفق الجديد في الفهرس
reward_info_count، reward_info_count++.
- يتم جمع منجم المكافأة بميزانية التدفق الكاملة من ATA المستدعي.
خطأ شائع — RewardAlreadyExists إذا تضارب النعناع مع فتحة موجودة.
SetRewards (v5/v6)
توسيع أو زيادة تدفق مكافأة موجود. لا يمكن تغيير النعناع؛ لا يمكن تقصير end_time؛ لا يمكن خفض emission_per_second_x64 بمجرد تشغيله.
الوسائط
reward_index: u8
new_open_time: u64,
new_end_time: u64,
new_emission_per_second_x64: u128,
الشروط المسبقة
- التدفق لا يزال قيد التشغيل (
reward_state == 1).
new_end_time ≥ current end_time.
- الميزانية الإضافية المطلوبة
(new_emission × new_duration − already_emissioned) موجودة في ATA المُرسل ويتم نقلها إلى منجم المكافأة بواسطة التعليمة.
على v5، المكالمة المكافئة هي SetRewards مع مجموعة وسائط أصغر (بدون تغييرات في الثانية على التدفقات النشطة).
RestartRewards (v5/v6)
إعادة تشغيل تدفق بعد مرور end_time. من الناحية المفاهيمية، نفس AddReward لنعناع يحتوي بالفعل على فتحة.
الوسائط — شكل متطابق لـ AddReward في هذا الفهرس.
الشروط المسبقة
reward_state == 2 (انتهى).
- المستدعي هو
reward_sender للفتحة (v6) أو مالك المزرعة (v5).
WithdrawReward (v5/v6)
تنظيف إداري لرصيد منجم المكافآت غير المطالب به بعد انتهاء التدفق وحصول جميع المراهنين على فرصة للحصاد.
الوسائط
الشروط المسبقة
- التدفق انتهى (
reward_state == 2).
reward_total_emissioned == reward_claimed + vault_balance (لا شيء مستحق حاليًا).
التأثير — نقل الباقي إلى reward_sender_ata. لا يمنع البرنامج السحب بينما لا يزال لدى المراهنين مطالبات معلقة؛ يُتوقع من المسؤول حصاد نيابة عن المراهنين المتأخرين أولاً (أو السماح لهم بالحصاد). إذا قمت بالمسح مبكرًا، يفقد المستخدمون الوصول إلى مكافآتهم غير المطالب بها. لا تستدعِ هذا مبكرًا.
تباينات v5
Deposit و Withdraw لهما نفس الشكل مثل v6 لكنهما يستخدمان ما يصل إلى 2 فتحة مكافآت و reward_per_share هو u128 (نقطة ثابتة بأساس مختلف).
CreateAssociatedLedger مكالمة منفصلة مطلوبة قبل أول Deposit؛ دمج v6 هذا.
AddReward متاح، Harvest ليس كذلك (استخدم Deposit 0).
تباينات v3
- تدفق مكافأة واحد. لا
AddReward، لا فتحة ثانية.
Deposit 0 هو الطريقة الوحيدة للمطالبة.
- يجب استدعاء
CreateUserLedger قبل أول Deposit.
مصفوفة تغيير الحالة
| التعليمة | total_staked | user.deposited | reward_per_share | مناجم المكافآت |
|---|
CreateFarm | 0 | — | 0 | ممول من قبل المنشئ |
Deposit(n) | +n | +n | تحديث | −pending (مدفوع) |
Withdraw(n) | −n | −n | تحديث | −pending |
Harvest | — | — | تحديث | −pending |
AddReward | — | — | — | +ميزانية جديدة |
SetRewards | — | — | — | +ميزانية دلتا |
RestartRewards | — | — | — | +ميزانية |
WithdrawReward | — | — | — | −باقي |
الخطوات التالية
المصادر: