Skip to main content
Cette page est traduite automatiquement par IA. La version anglaise fait foi.Voir la version anglaise →
Banneau de version. Tous les exemples ciblent @raydium-io/raydium-sdk-v2@0.2.64-alpha sur Solana mainnet-beta, vérifié le 2026-09-09 — chaque nom de builder, nom de paramètre et type de paramètre ci-dessous a été vérifié par rapport au src/raydium/farm/ de cette version et par rapport à raydium-sdk-V2-demo/src/farm. Le SDK dispatche en interne v3 / v5 / v6 selon le propriétaire du programme de la farm ; les exemples ci-dessous supposent une farm v6. Consultez reference/program-addresses pour les trois ID de programme.Les noms des méthodes du module farm ne sont pas ce que vous pourriez deviner : il n’y a pas de getFarmById et pas de setRewards. La récupération se fait via raydium.api.fetchFarmInfoById, et les builders d’édition des récompenses sont addNewRewardToken / addNewRewardsToken et restartReward / restartRewards.

Configuration

Les exemples ici reflètent les fichiers dans raydium-sdk-V2-demo/src/farm. L’amorçage suit le config.ts.template du dépôt de démonstration :

Récupérer une farm par ID

Il n’existe pas de raydium.farm.getFarmById. Chaque démonstration de farm commence par le module API, qui retourne la forme normalisée FormatFarmInfoOut que deposit / withdraw / harvestAllRewards acceptent tous :
fetchFarmInfoById prend une chaîne d’ID séparée par des virgules et retourne un tableau, donc un seul appel peut hydrater un portefeuille entier. Si vous avez besoin des clés de compte brutes plutôt que des informations d’affichage, raydium.api.fetchFarmKeysById({ ids }) retourne les vaults et les PDAs d’autorité ; le SDK l’appelle en interne pour vous dans chaque builder ci-dessous.

Staker des tokens LP

Source : src/farm/stake.ts
Le SDK gère le pré-règlement de toute récompense en attente, donc si ce portefeuille a déjà un stake dans cette farm, l’instruction paiera les récompenses accumulées aux ATA de l’utilisateur dans la même transaction.

Récolte uniquement (harvest)

Source : src/farm/harvest.ts farmInfoList est un Record indexé par ID de farm, pas un tableau, et le builder retourne plusieurs transactions — donc execute doit recevoir sequentially: true :
Le builder empile autant de farms par transaction que la limite de 1232 octets le permet et divise le reste en transactions de suivi, c’est pourquoi il retourne txIds plutôt qu’un seul txId. Pour une seule farm, récoltez avec l’idiome amount: 0 — c’est ce que fait src/farm/harvest.ts, sur chaque version y compris v6 :

Unstake

Source : src/farm/unstake.ts

Créer une farm v6

Source : src/farm/createAmmFarm.ts et editAmmFarm.ts create prend l’objet d’informations du pool pour le pool dont le mint LP est staké (pas un mint nu), et chaque entrée de rewardInfos est un FarmRewardInfo : { mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }. Les temps sont en secondes simples, et perSecond est une chaîne, pas un BN. programId par défaut au programme v6, donc vous le passez rarement.
Points clés :
  • perSecond est le taux d’émission par seconde en unités brutes du mint de récompense, passé en tant que chaîne décimale. Le SDK le compacte dans la représentation en virgule fixe on-chain avant d’envoyer.
  • Le budget complet (perSecond × (endTime − openTime)) doit être présent dans votre ATA de récompense — create le déplace dans le vault de récompense de manière atomique.
  • Les mints de récompense Token-2022 ne sont pas supportés par les builders de farm du SDK à cette version du SDK ; utilisez un mint SPL simple pour les récompenses.
  • Vous pouvez amorcer jusqu’à 5 récompenses en un seul appel create. La liste des comptes augmente de (reward_mint, reward_vault, sender_ata, token_program) par flux supplémentaire ; restez conscient de la limite de taille de transaction de 1232 octets. Pour 4+ récompenses, créez avec 1–2 et utilisez addNewRewardsToken dans les transactions de suivi.

Ajouter un nouveau flux de récompense

Il n’existe pas de raydium.farm.setRewards. Les deux builders qui modifient les récompenses d’une farm sont addNewRewardToken / addNewRewardsToken (occupent un slot libre avec un mint nouveau) et restartReward / restartRewards (réarment un slot dont le flux a pris fin). Les deux prennent des objets FarmRewardInfo exactement dans la forme que create utilise.
Le budget delta (perSecond × duration) est prélevé sur l’ATA du payeur dans le cadre de la transaction. L’instruction sous-jacente ne peut pas raccourcir un flux, ne peut pas abaisser per_second sur un flux actif, et ne peut pas changer le mint de récompense d’un slot — pour échanger les mints, attendez end_time et utilisez addNewRewardsToken sur un slot libéré, ou créez une nouvelle farm.
restartRewards et addNewRewardsToken retournent chacun un builder, donc une seule transaction peut faire les deux. src/farm/editAmmFarm.ts montre le motif : editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData), puis un versionBuild({ txVersion }).

Redémarrer un flux terminé

Source : src/farm/editAmmFarm.ts restartRewards prend newRewardInfos (pluriel, un tableau) ; restartReward est la forme à un seul élément et prend newRewardInfo. Le champ mint est mint, pas rewardMint, et il doit correspondre à un slot qui existe déjà sur la farm — le builder recherche le slot par mint et génère une erreur s’il est absent.
restartRewards est v6 uniquement — le builder lit l’ID du programme de la farm et génère une erreur pour les farms v3 / v5. Valide uniquement quand reward_state == 2 du slot cible (terminé) ; l’appelant doit être le reward_sender du slot. Notez que openTime >= endTime est rejeté côté client avant tout RPC.

CPI Rust

Il n’existe pas de crate Anchor raydium_farm_v6. Aucune crate portant ce nom n’existe sur crates.io, le programme Farm v6 ne publie pas d’IDL on-chain (ni un compte anchor:idl hérité ni une entrée dans le programme Program Metadata), et aucun dépôt source public pour celui-ci n’existe. Une révision antérieure de cette page montrait un exemple raydium_farm_v6::cpi::deposit ; il ne compilait contre rien et a été supprimé.
Farm v6 a été déployée pour la dernière fois le 2024-05-13 et n’est pas un programme Anchor du point de vue d’un intégrateur. Si vous avez besoin de composer avec celui-ci à partir de votre propre programme on-chain, construisez l’Instruction à la main — dérivez la liste des comptes et les discriminateurs d’instruction indépendamment (à partir des mises en page TypeScript du SDK sous raydium-sdk-V2/src/raydium/farm/, ou en décodant des transactions réelles), et invoke_signed le. Consultez sdk-api/rust-cpi pour cette procédure. Quelle que soit la route que vous empruntez, la queue remaining_accounts doit correspondre 1-pour-1 aux slots de récompense actifs de la farm (paires de reward_vault_i, user_reward_ata_i dans l’ordre des index). Omettre ou mal ordonner ces éléments produit une comptabilité silencieuse erronée — le programme transférera le mauvais montant.

Pièges

  • Oublier de réclamer avant de retirer. Inoffensif — Withdraw règle d’abord les récompenses en attente. Mais si votre interface utilisateur affiche « réclamer » séparément de « retirer », l’utilisateur peut penser qu’il y a encore quelque chose à réclamer après un Withdraw. Il n’y a rien ; tout ce qui s’est accumulé jusqu’à ce point a été payé.
  • total_staked = 0 pendant les émissions. Les émissions accumulées alors que rien n’était staké sont perdues (la formule de mise à jour reward_per_share divise par 0 et le programme saute la mise à jour). Pour les programmes avec open_time programmé, exécutez un « seed stake » à open_time pour éviter cela.
  • Frais de transfert Token-2022. Sur les farms v6 avec des mints de récompense Token-2022, le frais de transfert s’applique à l’émission (vault → utilisateur). Tenez compte de cela dans vos devis d’APR.
  • Petit per_second sur v5. Le taux u64 de v5 signifie que tout per_second < 1 unité de token par seconde (sur les mints avec ≥9 décimales, c’est souvent le taux souhaité) ne peut pas être exprimé — le taux du flux s’arrondit à 0 et la farm n’émet rien. Utilisez v6.

Où aller ensuite

Sources :