Farm talimatları sürüme özgüdür. v6 üzerindeki bir Deposit işlemi v5 farm’da veya tersi şekilde çağrılamaz. SDK, farm’ın program sahibini okuyarak gönderir; zincir üstü CPI için program ID’sini önceden seçmelisiniz.
Talimatlı envanter
| Amaç | v3 | v5 | v6 |
|---|
| Farm oluşturma | CreateFarm | CreateFarm | CreateFarm |
| Kullanıcı defteri ekleme (örtülü olabilir) | CreateUserLedger | CreateAssociatedLedger | Deposit içinde örtülü |
| Stake etme | Deposit | Deposit | Deposit |
| Unstake yapma | Withdraw | Withdraw | Withdraw |
| Sadece ödülleri talep etme | N/A (Deposit 0 kullanın) | N/A (Deposit 0 kullanın) | Harvest |
| Oluşturulduktan sonra ödül akışı ekleme | N/A | AddReward | AddReward |
| Mevcut ödül akışını düzenleme | N/A | SetRewards | SetRewards |
| Son_zaman’dan sonra ödülü yeniden başlatma | N/A | RestartRewards | RestartRewards |
| Talep edilmemiş ödül bütçesini çekme (yönetici) | N/A | WithdrawReward | WithdrawReward |
v3 ve v5’te, stake’i değiştirmeden ödülleri talep etmenin kanonik yolu Deposit’i amount = 0 ile çağırmaktır. Program bunu saf bir ödeme olarak işler. v6 netlik için açık bir Harvest sunmuştur.
SDK, tüm bunları raydium.farm.deposit({ ... }) gibi işlemlerin arkasına alır. Aşağıdaki bölümler, talimatları manuel olarak oluşturması gereken entegratörler (agregatörler, izleme araçları, SDK uzantıları) için temel hesap listelerini belgelemektedir.
CreateFarm (v6)
Yeni bir v6 farm başlatın.
Argümanlar
reward_info_count: u8 // oluşturulma sırasında ödül akışı sayısı (1..=5)
reward_infos: [
{
open_time: u64,
end_time: u64,
emission_per_second_x64: u128, // Q64.64
mint: Pubkey, // ödül mint'i
token_program: Pubkey, // SPL veya Token-2022
}
]
Hesaplar (özetlenmiş, reward_info_count = 1 için)
| # | Ad | W | S | Notlar |
|---|
| 1 | creator | W | S | Kirayı öder, farm’a sahiptir. |
| 2 | farm_state | W | | Yeni FarmState hesabı. |
| 3 | farm_authority | | | PDA [farm_id]. |
| 4 | staking_mint | | | |
| 5 | staking_vault | W | | Yetkilinin ATA’sı veya bir PDA vault’u olarak oluşturulur. |
| 6 | staking_token_program | | | |
| 7 | reward_mint | | | |
| 8 | reward_vault | W | | İlk bütçeyi alacaktır. |
| 9 | reward_token_program | | | |
| 10 | reward_sender_ata | W | | Ödül mint’indeki yaratıcının ATA’sı; bu talimattan boşaltılır. |
| 11 | system_program | | | |
| 12 | token_program | | | |
| 13 | associated_token_program | | | |
| 14 | rent | | | |
Ön koşullar
open_time > now, end_time > open_time.
creator ATA’ları en az emission_per_second_x64 × (end_time − open_time) / 2^64 ödül mint’ini tutar.
staking_mint dondurma yetkinliğine sahip değildir veya dondurma yetkinliği devre dışıdır.
Son koşullar
FarmState başlatıldı, total_staked = 0.
- Ödül vault’ları tam akış bütçesiyle finanse edildi.
- Yaratıcının ödül ATA’sı bu miktardan boşaltılır.
Deposit (v6)
Stake etme mint’inin amount kadarını stake edin.
Argümanlar
Hesaplar
| # | Ad | 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 | |
| son−2 | system_program | | |
| son−1 | token_program | | |
| son | associated_token_program | | |
user_ledger yoksa, SDK bir CreateAccount tarzı ix’i başa ekler; v6 programı sistem programı hesabı verildiğinde bunu tembelce oluşturabilir. Kalan hesaplar deseni: her canlı ödül için (reward_vault, user_reward_ata) ekleyin, böylece ödeme yapılabilir.
Etki
- Her canlı ödül akışı için tembel güncelleme formülünü kullanarak
reward_per_share_x64[i]’ı yenileyin.
pending_i = user_ledger.deposited × reward_per_share_x64[i] / 2^64 − user_ledger.reward_debts[i] hesaplayın.
pending_i’ı reward_vault_{i}’dan user_reward_ata_{i}’ye aktarın.
amount stake etme mint’ini user_staking_ata’dan staking_vault’a aktarın.
user_ledger.deposited += amount’ı güncelleyin ve reward_debts[i]’ı yeniden görüntüleyin.
farm_state.total_staked += amount’ı güncelleyin.
Ön koşullar
amount > 0 gerçek bir stake için (v6 amount = 0’ı yasaklar — sadece talep için Harvest kullanın).
user_staking_ata en az amount tutar.
- Her canlı ödül vault’u bu kullanıcıya en az borçlu olunan tutarı tutar.
Withdraw (v6)
amount kadar unstake yapın.
Argümanlar
Hesaplar — Deposit ile aynı.
Etki — Deposit ile aynı ödeme, ardından stake etme mint’ini kullanıcıya geri taşıyın: staking_vault → user_staking_ata. total_staked ve user_ledger.deposited her ikisi de azalır.
Ön koşullar
amount ≤ user_ledger.deposited.
- Farm duraklatılmamış.
Harvest (v6)
Stake değiştirilmeden beklemede olan ödülleri talep edin.
Argümanlar — hiçbiri.
Hesaplar — Deposit ile aynı, stake tarafında hareket yok.
Etki — reward_per_share_x64[i]’ı yenileyin, pending_i ödeyin, reward_debts[i]’ı yeniden görüntüleyin. total_staked veya deposited değişmez.
AddReward (v5/v6)
Kullanmamış bir slot’a sahip mevcut farm’a yeni bir ödül akışı ekleyin.
Argümanlar
reward_info: {
open_time: u64,
end_time: u64,
emission_per_second_x64: u128,
mint: Pubkey,
token_program: Pubkey,
}
Ön koşullar
- Boş bir slot mevcuttur (v6’de
reward_info_count < 5, v5’te < 2).
open_time ≥ now (gelecekte olabilir) veya open_time < now yalnızca program sürümü izin verirse — v6 verir, v5 vermez.
Son koşullar
- Yeni akış
reward_info_count dizininde başlatıldı, reward_info_count++.
- Ödül vault’u arayanın ATA’sından tam akış bütçesiyle kredilendi.
Genel hata — mint, mevcut bir slot’la çakışıyorsa RewardAlreadyExists.
SetRewards (v5/v6)
Mevcut bir ödül akışını uzatın veya güçlendirin. Mint’i değiştiremez; end_time’ı kısaltamaz; çalışmaya başladıktan sonra emission_per_second_x64’ü düşüremez.
Argümanlar
reward_index: u8
new_open_time: u64,
new_end_time: u64,
new_emission_per_second_x64: u128,
Ön koşullar
- Akış hala çalışıyor (
reward_state == 1).
new_end_time ≥ geçerli end_time.
- Gerekli ek bütçe
(yeni_emisyon × yeni_süre − zaten_emitlenmiş) gönderenin ATA’sında mevcuttur ve talimattan ödül vault’una aktarılır.
v5’te, eşdeğer çağrı daha küçük bir argüman seti ile SetRewards’tir (canlı akışlarda saniye başına değişiklik yok).
RestartRewards (v5/v6)
end_time’ı geçtikten sonra bir akışı yeniden başlatın. Kavramsal olarak zaten bir slot’a sahip olan mint için AddReward ile aynı.
Argümanlar — AddReward ile aynı şekil, o indekste.
Ön koşullar
reward_state == 2 (sona erdi).
- Arayanı slot’un
reward_sender’ı (v6) veya farm owner’ı (v5).
WithdrawReward (v5/v6)
Bir akış sona erdikten ve tüm stake edenler hasat etme şansı bulduktan sonra talep edilmemiş ödül vault bakiyesinin yönetici tarafından temizlenmesi.
Argümanlar
Ön koşullar
- Akış sona erdi (
reward_state == 2).
reward_total_emissioned == reward_claimed + vault_balance (şu anda hiç bir şey borçlu değil).
Etki — kalanı reward_sender_ata’ya taşır. Program, stake edenler hala beklemede talepleri varken çekmeyi engellemez; yönetici beklemede kalan stake edenler adına ilk olarak hasat etmesi beklenir (veya onların hasat etmesine izin verir). Erken temizlerseniz, kullanıcılar talep edilmemiş ödüllerine erişim kaybeder. Bunu erken çağırmayın.
v5 varyasyonları
Deposit / Withdraw v6 ile aynı şekle sahiptir ancak 2 adede kadar ödül slot’u kullanır ve reward_per_share u128’dir (farklı bir radiks ile sabit nokta).
CreateAssociatedLedger ilk Deposit’ten önce gerekli bir ayrı çağrıdır; v6 bunu birleştirdi.
AddReward mevcuttur, Harvest değildir (Deposit 0 kullanın).
v3 varyasyonları
- Tek ödül akışı.
AddReward yok, ikinci slot yok.
Deposit 0 talep etmenin tek yoludur.
CreateUserLedger ilk Deposit’ten önce çağrılmalıdır.
Durum değişikliği matrisi
| Talimatlı | total_staked | user.deposited | reward_per_share | Ödül vault’ları |
|---|
CreateFarm | 0 | — | 0 | yaratıcı tarafından finanse edildi |
Deposit(n) | +n | +n | yenilendi | −pending (ödeme yapıldı) |
Withdraw(n) | −n | −n | yenilendi | −pending |
Harvest | — | — | yenilendi | −pending |
AddReward | — | — | — | +yeni bütçe |
SetRewards | — | — | — | +delta bütçe |
RestartRewards | — | — | — | +bütçe |
WithdrawReward | — | — | — | −kalan |
Sonraki adım nereye
Kaynaklar: