Skip to main content
Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.İngilizce sürümü görüntüle →
Sürüm notu. Tüm örnekler Solana mainnet-beta üzerinde @raydium-io/raydium-sdk-v2@0.2.64-alpha hedeflemektedir, 2026-09-09 tarihinde doğrulanmıştır — aşağıdaki her builder adı, parametre adı ve parametre türü o sürümün src/raydium/farm/ dosyasına ve raydium-sdk-V2-demo/src/farm dosyasına karşı kontrol edilmiştir. SDK, farm’ın program sahibine göre v3 / v5 / v6’yı dahili olarak gönderir; aşağıdaki örnekler v6 farm’ı varsayar. Üç program ID’si için reference/program-addresses bölümüne bakın.Farm modülünün method adları tahmin ettiğiniz gibi değildir: getFarmById yoktur ve setRewards yoktur. Getirme işlemi raydium.api.fetchFarmInfoById üzerinden gerçekleşir ve ödül düzenleme builder’ları addNewRewardToken / addNewRewardsToken ve restartReward / restartRewards şeklindedir.

Kurulum

Buradaki örnekler raydium-sdk-V2-demo/src/farm dosyalarını yansıtır. Bootstrap, demo repo’nun config.ts.template dosyasını takip eder:

Farm’ı ID’ye göre getir

raydium.farm.getFarmById yoktur. Her farm örneği API modülünden başlar; bu modül deposit / withdraw / harvestAllRewards tarafından alınan normalleştirilmiş FormatFarmInfoOut şeklini döndürür:
fetchFarmInfoById virgülle ayrılmış bir ID dizesi alır ve bir dizi döndürür; böylece bir çağrı tüm portföyü hidrate edebilir. Ham hesap anahtarlarına ihtiyacınız varsa, raydium.api.fetchFarmKeysById({ ids }) vault’ları ve authority PDA’larını döndürür; SDK bunu aşağıdaki her builder içinde sizin için dahili olarak çağırır.

LP token’larını stake et

Kaynak: src/farm/stake.ts
SDK, bekleyen ödüllerin ön kapatılmasını işler; bu nedenle bu cüzdan zaten bu farm’da stake’e sahipse, instruction aynı işlemde birikmiş ödülleri kullanıcının ATA’larına ödeyecektir.

Yalnızca talep et (hasat)

Kaynak: src/farm/harvest.ts farmInfoList bir dizi değil, farm id’ye göre anahtarlanmış bir Record şeklindedir ve builder birden fazla işlem döndürür — bu nedenle execute öğesine sequentially: true verilmelidir:
Builder, 1232 baytlık sınırın izin verdiği kadar çok farm’ı bir işlemde paketler ve geri kalanını takip eden işlemlere böler; bu nedenle tek bir txId yerine txIds döndürür. Tek bir farm için, amount: 0 idiomunu kullanarak hasat yapın — bu, src/farm/harvest.ts dosyasının yaptığı şeydir, v6 dahil her sürümde:

Stake’i geri çek

Kaynak: src/farm/unstake.ts

v6 farm oluştur

Kaynak: src/farm/createAmmFarm.ts ve editAmmFarm.ts create, LP mint’i stake edilen pool’un pool info nesnesi alır (bare mint değil) ve rewardInfos öğesinin her girdisi bir FarmRewardInfo şeklindedir: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Zamanlar düz saniye cinsindedir ve perSecond bir BN değil, string şeklindedir. programId varsayılan olarak v6 program’ıdır; bu nedenle nadiren geçirirsiniz.
Önemli noktalar:
  • perSecond, ödül mint’inin ham birimlerinde saniye başına emisyon oranıdır; ondalık string olarak geçirilir. SDK, göndermeden önce bunu zincir üstü sabit nokta gösterimine paketler.
  • Tam bütçe (perSecond × (endTime − openTime)) ödül ATA’nızda bulunmalıdır — create bunu ödül vault’una atomik olarak taşır.
  • Token-2022 ödül mint’leri bu SDK sürümünde SDK’nın farm builder’ları tarafından desteklenmez; ödüller için düz SPL mint kullanın.
  • Bir create çağrısında 5’e kadar ödülü seed’leyebilirsiniz. Hesap listesi her ekstra stream için (reward_mint, reward_vault, sender_ata, token_program) kadar büyür; 1232 baytlık işlem boyutu sınırının farkında olun. 4+ ödül için 1–2 ile oluşturun ve takip eden işlemlerde addNewRewardsToken kullanın.

Yeni ödül akışı ekle

raydium.farm.setRewards yoktur. Farm’ın ödüllerini değiştiren iki builder, addNewRewardToken / addNewRewardsToken (boş bir slot’u yeni bir mint ile işgal et) ve restartReward / restartRewards (akışı sona ermiş bir slot’u yeniden başlat) şeklindedir. Her ikisi de create tarafından kullanılan şekilde tam olarak FarmRewardInfo nesneleri alır.
Delta bütçesi (perSecond × duration) işlemin bir parçası olarak ödeyenin ATA’sından çekilir. Temel instruction, bir akışı kısaltamaz, canlı bir akışta per_second öğesini düşüremez ve bir slot’un ödül mint’ini değiştiremez — mint’leri değiştirmek için end_time bekleyin ve serbest bırakılan bir slot’ta addNewRewardsToken kullanın veya yeni bir farm oluşturun.
restartRewards ve addNewRewardsToken her biri bir builder döndürür; bu nedenle tek bir işlem her ikisini de yapabilir. src/farm/editAmmFarm.ts deseni gösterir: editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), ardından bir versionBuild({ txVersion }).

Bitmiş akışı yeniden başlat

Kaynak: src/farm/editAmmFarm.ts restartRewards newRewardInfos (çoğul, bir dizi) alır; restartReward tek öğeli form’dur ve newRewardInfo alır. Mint alanı mint şeklindedir, rewardMint değil ve farm’da zaten var olan bir slot’u eşleştirmelidir — builder slot’u mint’e göre arar ve yoksa hata verir.
restartRewards yalnızca v6’dır — builder farm’ın program id’sini okur ve v3 / v5 farm’ları için hata verir. Yalnızca hedef slot’un reward_state == 2 (bitmiş) olduğunda geçerlidir; çağıran slot’un reward_sender öğesi olmalıdır. openTime >= endTime öğesinin herhangi bir RPC yapılmadan önce istemci tarafında reddedildiğini unutmayın.

Rust CPI

raydium_farm_v6 Anchor crate’i yoktur. crates.io’da bu adı taşıyan hiçbir crate yoktur, Farm v6 program’ı hiçbir zincir üstü IDL yayınlamaz (ne eski anchor:idl hesabı ne de Program Metadata program’ında bir giriş) ve bunun için hiçbir genel kaynak deposu yoktur. Bu sayfanın önceki bir revizyonu raydium_farm_v6::cpi::deposit örneği göstermiştir; hiçbir şeye karşı derlenmiş değildir ve kaldırılmıştır.
Farm v6, 2024-05-13 tarihinde son kez dağıtılmıştır ve bir integratör açısından Anchor program’ı değildir. Kendi zincir üstü program’ınızdan bununla oluşturmanız gerekiyorsa, Instruction öğesini elle oluşturun — hesap listesini ve instruction discriminator’larını bağımsız olarak türetin (SDK’nın raydium-sdk-V2/src/raydium/farm/ altındaki TypeScript düzenlerinden veya gerçek işlemleri çözerek) ve invoke_signed yapın. Bu prosedür için sdk-api/rust-cpi bölümüne bakın. Hangi yolu alırsanız alın, remaining_accounts tail’i farm’ın etkin ödül slot’larıyla 1’e 1 eşleşmelidir (reward_vault_i, user_reward_ata_i çiftleri dizin sırasında). Bunları atlama veya yanlış sıralama sessiz yanlış muhasebeleye neden olur — program yanlış tutarı transfer eder.

Tuzaklar

  • Çekmeden önce talep etmeyi unutmak. Zararsız — Withdraw önce bekleyen ödülleri kapatır. Ancak UI’niz “talep”i “çek”ten ayrı gösteriyorsa, kullanıcı Withdraw sonrasında talep edilecek bir şey olduğunu düşünebilir. Yoktur; o noktaya kadar birikmiş her şey ödendi.
  • Emisyon sırasında total_staked = 0. Hiçbir şey stake edilmemişken birikmiş emisyonlar kaybedilir (reward_per_share güncelleme formülü 0’a bölünür ve program güncellemeyi atlar). Zamanlanmış open_time olan program’lar için, bunu önlemek amacıyla open_time’da “seed stake” çalıştırın.
  • Token-2022 transfer ücretleri. Token-2022 ödül mint’lerine sahip v6 farm’larında, transfer ücreti emit sırasında uygulanır (vault → kullanıcı). Bunu APR alıntılarına dahil edin.
  • v5’te küçük per_second. v5’in u64 oranı, herhangi bir per_second < 1 token-birim saniye başına (9+ ondalık basamağa sahip mint’lerde bu genellikle istenen orandır) ifade edilemeyeceği anlamına gelir — akış oranı 0’a yuvarlanır ve farm hiçbir şey yayınlamaz. v6 kullanın.

Sonraki adımlar

Kaynaklar: