Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Versionsbanner. Alle Demos zielen auf
@raydium-io/raydium-sdk-v2@0.2.64-alpha gegen Solana mainnet-beta, verifiziert 2026-09-09 — jeder Builder-Name, Parametername und Parametertyp unten wurde gegen die src/raydium/farm/ dieser Version und gegen raydium-sdk-V2-demo/src/farm überprüft. Das SDK versendet v3 / v5 / v6 intern basierend auf dem Programmeigentümer der Farm; die Beispiele unten gehen von einer v6-Farm aus. Siehe reference/program-addresses für die drei Programm-IDs.Die Methodennamen des Farm-Moduls sind nicht das, was Sie erwarten würden: es gibt kein getFarmById und kein setRewards. Das Abrufen erfolgt über raydium.api.fetchFarmInfoById, und die Reward-Editing-Builder sind addNewRewardToken / addNewRewardsToken und restartReward / restartRewards.Setup
Die Demos hier spiegeln Dateien inraydium-sdk-V2-demo/src/farm wider. Das Bootstrap folgt der config.ts.template des Demo-Repos:
Farm nach ID abrufen
Es gibt keinraydium.farm.getFarmById. Jede Farm-Demo beginnt mit dem API-Modul, das die normalisierte FormatFarmInfoOut-Form zurückgibt, die deposit / withdraw / harvestAllRewards alle verwenden:
fetchFarmInfoById nimmt eine kommagetrennte Zeichenkette von IDs und gibt ein Array zurück, sodass ein Aufruf ein ganzes Portfolio hydratisieren kann. Wenn Sie die rohen Kontoschlüssel statt der Anzeigeinformationen benötigen, gibt raydium.api.fetchFarmKeysById({ ids }) die Vaults und Authority-PDAs zurück; das SDK ruft es intern für Sie in jedem Builder unten auf.
LP-Token staken
Quelle:src/farm/stake.ts
Nur Einfordern (Harvest)
Quelle:src/farm/harvest.ts
farmInfoList ist ein Record mit Farm-ID als Schlüssel, kein Array, und der Builder gibt mehrere Transaktionen zurück — daher muss execute mit sequentially: true aufgerufen werden:
txIds statt einer einzelnen txId zurückgibt.
Für eine einzelne Farm ernten Sie mit der amount: 0-Idiomatik — das ist das, was src/farm/harvest.ts tut, in jeder Version einschließlich v6:
Unstake
Quelle:src/farm/unstake.ts
Eine v6-Farm erstellen
Quelle:src/farm/createAmmFarm.ts und editAmmFarm.ts
create nimmt das Pool-Info-Objekt für den Pool, dessen LP-Mint gestaked wird (nicht ein bloßer Mint), und jeder Eintrag von rewardInfos ist ein FarmRewardInfo: { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Zeiten sind einfache Sekunden, und perSecond ist ein String, keine BN. programId wird standardmäßig auf das v6-Programm gesetzt, daher übergeben Sie es selten.
perSecondist die Emissionsrate pro Sekunde in den Raw-Einheiten des Reward-Mints, übergeben als Dezimalstring. Das SDK packt es vor dem Versenden in die On-Chain-Festkommadarstellung.- Das vollständige Budget (
perSecond × (endTime − openTime)) muss in Ihrem Reward-ATA vorhanden sein —createverschiebt es atomar in den Reward-Vault. - Token-2022-Reward-Mints werden von den Farm-Buildern des SDK in dieser SDK-Version nicht unterstützt; verwenden Sie einen einfachen SPL-Mint für Rewards.
- Sie können bis zu 5 Rewards in einem
create-Aufruf seeden. Die Kontoliste wächst um(reward_mint, reward_vault, sender_ata, token_program)pro zusätzlichem Stream; beachten Sie das 1232-Byte-Transaktionsgrößenlimit. Für 4+ Rewards erstellen Sie mit 1–2 und verwenden SieaddNewRewardsTokenin Folgetransaktionen.
Einen neuen Reward-Stream hinzufügen
Es gibt keinraydium.farm.setRewards. Die zwei Builder, die die Rewards einer Farm ändern, sind addNewRewardToken / addNewRewardsToken (belegen einen freien Slot mit einem neuen Mint) und restartReward / restartRewards (reaktivieren einen Slot, dessen Stream beendet ist). Beide nehmen FarmRewardInfo-Objekte in genau der Form, die create verwendet.
perSecond × duration) wird als Teil der Transaktion aus dem ATA des Zahlers gezogen. Die zugrunde liegende Anweisung kann einen Stream nicht verkürzen, kann per_second auf einem aktiven Stream nicht senken und kann den Reward-Mint eines Slots nicht ändern — um Mints zu tauschen, warten Sie auf end_time und verwenden Sie addNewRewardsToken auf einem freigegebenen Slot, oder erstellen Sie eine neue Farm.
Einen beendeten Stream neu starten
Quelle:src/farm/editAmmFarm.ts
restartRewards nimmt newRewardInfos (Plural, ein Array); restartReward ist die Einzelform und nimmt newRewardInfo. Das Feld mint ist mint, nicht rewardMint, und es muss einem Slot entsprechen, der bereits auf der Farm existiert — der Builder schlägt nach dem Slot nach Mint nach und gibt einen Fehler aus, wenn er fehlt.
restartRewards ist nur v6 — der Builder liest die Programm-ID der Farm und wirft einen Fehler für v3 / v5-Farms. Gültig nur, wenn der reward_state des Zielslots == 2 (beendet) ist; der Aufrufer muss der reward_sender des Slots sein. Beachten Sie, dass openTime >= endTime client-seitig abgelehnt wird, bevor ein RPC erfolgt.
Rust CPI
Farm v6 wurde zuletzt am 2024-05-13 bereitgestellt und ist aus Integrator-Sicht kein Anchor-Programm. Wenn Sie es von Ihrem eigenen On-Chain-Programm aus zusammensetzen müssen, konstruieren Sie dieInstruction von Hand — leiten Sie die Kontoliste und Anweisungs-Diskriminatoren unabhängig ab (aus den TypeScript-Layouts des SDK unter raydium-sdk-V2/src/raydium/farm/, oder durch Dekodieren echter Transaktionen), und invoke_signed es. Siehe sdk-api/rust-cpi für dieses Verfahren.
Welche Route Sie auch nehmen, der remaining_accounts-Schwanz muss die aktiven Reward-Slots der Farm 1-zu-1 entsprechen (Paare von reward_vault_i, user_reward_ata_i in Indexreihenfolge). Das Weglassen oder Falschordnen dieser führt zu einer stillen Fehlbuchung — das Programm überträgt den falschen Betrag.
Fallstricke
- Vergessen, vor dem Abheben einzufordern. Harmlos —
Withdrawsettlement ausstehende Rewards zuerst. Aber wenn Ihre UI „Einfordern” separat von „Abheben” anzeigt, könnte der Benutzer denken, dass nach einemWithdrawnoch etwas zu fordern ist. Das ist nicht der Fall; alles bis zu diesem Punkt Aufgelaufene wurde ausgezahlt. total_staked = 0während Emissionen. Emissionen, die aufgelaufen sind, während nichts gestaked war, werden verfallen (diereward_per_share-Update-Formel dividiert durch 0 und das Programm überspringt das Update). Für Programme mit geplanteropen_timeführen Sie einen „Seed-Stake” zur open_time aus, um dies zu vermeiden.- Token-2022-Transfergebühren. Auf v6-Farms mit Token-2022-Reward-Mints gilt die Transfergebühr bei der Emission (Vault → Benutzer). Berücksichtigen Sie dies in APR-Angeboten.
- Kleine
per_secondauf v5. v5su64-Rate bedeutet, dass jedeper_second < 1Token-Einheit pro Sekunde (auf Mints mit ≥9 Dezimalstellen ist dies oft die gewünschte Rate) nicht ausgedrückt werden kann — die Stream-Rate rundet auf 0 und die Farm emittiert nichts. Verwenden Sie v6.
Nächste Schritte
products/farm-staking/instructions— zugrunde liegende Anweisungsreferenz.products/clmm/fees— vergleichen Sie mit CLMMs nativen Reward-Streams.user-flows/migrate-amm-v4-to-cpmm— oft mit dem Starten einer neuen CPMM-Farm gepaart.
- Raydium SDK v2
- Farm v6 IDL gebündelt in
raydium-io/raydium-sdk-V2untersrc/raydium/farm/.

