Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
バージョン情報。 すべてのデモは Solana mainnet-beta に対して @raydium-io/raydium-sdk-v2@0.2.64-alpha をターゲットとしており、2026-09-09 に検証済み です。すべてのビルダー名、パラメータ名、パラメータ型は、そのリリースの src/raydium/farm/ および raydium-sdk-V2-demo/src/farm に対して確認されています。SDK は内部的にファームのプログラムオーナーに基づいて v3・v5・v6 をディスパッチします。以下の例は v6 ファームを想定しています。3 つのプログラム ID については reference/program-addresses を参照してください。ファームモジュールのメソッド名は予想と異なります。getFarmById も setRewards も存在しません。フェッチは raydium.api.fetchFarmInfoById を通じて行われ、報酬編集ビルダーは addNewRewardToken / addNewRewardsToken および restartReward / restartRewards です。

セットアップ

ここのデモは raydium-sdk-V2-demo/src/farm のファイルを反映しています。ブートストラップはデモリポジトリの config.ts.template に従います。

ID でファームをフェッチ

raydium.farm.getFarmById は存在しません。すべてのファームデモは API モジュールから始まります。API モジュールは、deposit / withdraw / harvestAllRewards がすべて受け取る正規化された FormatFarmInfoOut 形状を返します。
fetchFarmInfoById は カンマ区切りの ID 文字列 を受け取り、配列を返すため、1 回の呼び出しでポートフォリオ全体をハイドレートできます。表示情報ではなく生のアカウントキーが必要な場合、raydium.api.fetchFarmKeysById({ ids }) はボルトと権限 PDA を返します。SDK は以下のすべてのビルダー内で内部的にこれを呼び出します。

LP トークンをステーキング

ソース:src/farm/stake.ts
SDK は保留中の報酬の事前決済を処理するため、このウォレットがこのファームにすでにステーキングを持っている場合、命令は同じトランザクション内でユーザーの ATA に蓄積された報酬を支払います。

クレームのみ(ハーベスト)

ソース:src/farm/harvest.ts farmInfoList は配列ではなく ファーム ID でキーされた Record であり、ビルダーは 複数の トランザクションを返すため、execute に sequentially: true を指定する必要があります。
ビルダーは 1232 バイト制限が許す限り多くのファームをトランザクションごとにパックし、残りを後続トランザクションに分割します。そのため、単一の txId ではなく txIds を返します。 単一ファームの場合、amount: 0 イディオムでハーベストします。これは v6 を含むすべてのバージョンで src/farm/harvest.ts が行うことです。

アンステーク

ソース:src/farm/unstake.ts

v6 ファームを作成

ソース:src/farm/createAmmFarm.ts および editAmmFarm.ts create は、ステーキングされる LP ミントのプールのための プール情報オブジェクト を受け取ります(ミントだけではなく)。rewardInfos の各エントリは FarmRewardInfo です。{ mint: PublicKey, perSecond: string, openTime: number, endTime: number, rewardType: "Standard SPL" | "Option tokens" }。時間は プレーン秒 であり、perSecond は BN ではなく 文字列 です。programId はデフォルトで v6 プログラムになるため、ほとんど渡す必要がありません。
重要なポイント:
  • perSecond は報酬ミントの 生 単位での秒あたりのエミッション率であり、10 進文字列として渡されます。SDK は送信前にオンチェーン固定小数点表現にパックします。
  • 完全な予算(perSecond × (endTime − openTime))は報酬 ATA に存在する必要があります。create はそれを報酬ボルトに原子的に移動します。
  • Token-2022 報酬ミントはこの SDK バージョンの SDK のファームビルダーではサポートされていません。報酬にはプレーン SPL ミントを使用してください。
  • 1 つの create 呼び出しで最大 5 つの報酬をシードできます。アカウントリストは追加ストリームごとに (reward_mint, reward_vault, sender_ata, token_program) だけ増加します。1232 バイトのトランザクションサイズ制限に注意してください。4 つ以上の報酬の場合、1~2 で作成し、後続トランザクションで addNewRewardsToken を使用します。

新しい報酬ストリームを追加

raydium.farm.setRewards は存在しません。ファームの報酬を変更する 2 つのビルダーは addNewRewardToken / addNewRewardsToken(新しい ミントで空きスロットを占有)および restartReward / restartRewards(ストリームが終了したスロットを再度有効化)です。どちらも create が使用するのと同じ形状の FarmRewardInfo オブジェクトを受け取ります。
デルタ予算(perSecond × duration)はトランザクションの一部として支払者の ATA から引き出されます。基礎となる命令はストリームを短縮することはできず、ライブストリームの per_second を低下させることはできず、スロットの報酬ミントを変更することはできません。ミントをスワップするには、end_time を待って解放されたスロットで addNewRewardsToken を使用するか、新しいファームを作成してください。
restartRewards と addNewRewardsToken はそれぞれビルダーを返すため、単一トランザクションで両方を実行できます。src/farm/editAmmFarm.ts はパターンを示しています。editFarmBuilder.builder.addInstruction(addNewRewardBuildData.builder.AllTxData) の後、1 つの versionBuild({ txVersion }) です。

終了したストリームを再開

ソース:src/farm/editAmmFarm.ts restartRewards は newRewardInfos(複数、配列)を受け取ります。restartReward は単一項目形式で newRewardInfo を受け取ります。ミントフィールドは rewardMint ではなく mint であり、ファームに既に存在するスロットと一致する必要があります。ビルダーはミントでスロットを検索し、存在しない場合はエラーになります。
restartRewards は v6 のみ です。ビルダーはファームのプログラム ID を読み取り、v3 / v5 ファームに対してスローします。ターゲットスロットの reward_state == 2(終了)の場合のみ有効です。呼び出し元はスロットの reward_sender である必要があります。openTime >= endTime は RPC が行われる前にクライアント側で拒否されることに注意してください。

Rust CPI

raydium_farm_v6 Anchor クレートは存在しません。 crates.io にそのような名前のクレートは存在せず、Farm v6 プログラムはオンチェーン IDL を公開していません(レガシー anchor:idl アカウントも Program Metadata プログラムのエントリもありません)。また、公開ソースリポジトリも存在しません。このページの以前のリビジョンは raydium_farm_v6::cpi::deposit の例を示していました。それは何に対してもコンパイルされず、削除されました。
Farm v6 は 2024-05-13 に最後にデプロイされ、インテグレーターの観点からは Anchor プログラムではありません。独自のオンチェーンプログラムから構成する必要がある場合、Instruction を手動で構築してください。アカウントリストと命令ディスクリミネータを独立して導出します(SDK の TypeScript レイアウト(raydium-sdk-V2/src/raydium/farm/ の下)から、または実際のトランザクションをデコードして)。その後、invoke_signed してください。その手順については sdk-api/rust-cpi を参照してください。 どのルートを取るにせよ、remaining_accounts テールはファームのアクティブな報酬スロットと 1 対 1 で一致する必要があります(インデックス順の reward_vault_i、user_reward_ata_i のペア)。これらを省略または誤順序にすると、サイレント誤計算が発生します。プログラムは間違った金額を転送します。

落とし穴

  • 引き出す前にクレームするのを忘れる。 無害です。Withdraw は最初に保留中の報酬を決済します。ただし、UI が「クレーム」を「引き出す」とは別に表示する場合、ユーザーは Withdraw 後にまだクレームするものがあると思うかもしれません。ありません。その時点までに蓄積されたすべてが支払われました。
  • エミッション中に total_staked = 0。 何もステーキングされていない間に蓄積されたエミッションは没収されます(reward_per_share 更新式は 0 で除算し、プログラムは更新をスキップします)。スケジュールされた open_time を持つプログラムの場合、open_time で「シードステーク」を実行してこれを回避してください。
  • Token-2022 転送手数料。 Token-2022 報酬ミントを持つ v6 ファームでは、転送手数料がエミット時に適用されます(ボルト → ユーザー)。これを APR 見積もりに考慮してください。
  • v5 での小さい per_second。 v5 の u64 レートは、秒あたり 1 トークン単位未満の per_second(9 以上の小数点を持つミントでは、これはしばしば望ましいレート)を表現できないことを意味します。ストリームレートは 0 に丸められ、ファームは何も発行しません。v6 を使用してください。

次のステップ

ソース: