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 dansraydium-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 deraydium.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
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 :
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.
perSecondest 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 —createle 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 utilisezaddNewRewardsTokendans les transactions de suivi.
Ajouter un nouveau flux de récompense
Il n’existe pas deraydium.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.
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.
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
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 —
Withdrawrè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 unWithdraw. Il n’y a rien ; tout ce qui s’est accumulé jusqu’à ce point a été payé. total_staked = 0pendant les émissions. Les émissions accumulées alors que rien n’était staké sont perdues (la formule de mise à jourreward_per_sharedivise par 0 et le programme saute la mise à jour). Pour les programmes avecopen_timeprogrammé, 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_secondsur v5. Le tauxu64de v5 signifie que toutper_second < 1unité 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
products/farm-staking/instructions— référence d’instruction sous-jacente.products/clmm/fees— comparez aux flux de récompense natifs de CLMM.user-flows/migrate-amm-v4-to-cpmm— souvent associé au lancement d’une nouvelle farm CPMM.
- Raydium SDK v2
- IDL Farm v6 fourni dans
raydium-io/raydium-sdk-V2soussrc/raydium/farm/.

