Skip to main content
このページは AI による自動翻訳です。すべての内容は英語版を正とします。英語版を表示 →
レントは手数料ではなく返金可能なデポジットです。SIMD-0437 は、すべてのアカウントが保有する必要があるデポジットを 5 つの独立したゲートを通じて段階的に削減します。各段階前に作成されたアカウントは、資金提供時の残高を保持するため、各段階後は過剰資金状態になります。SPL Token と Token-2022 プログラムは、WithdrawExcessLamports を通じてその差分を返却でき、アカウントを閉じたりトークン残高に触れたりすることなく実行できます。何も期限切れにはなりません。超過分はあなた自身のアカウントに留まり、移動を選択するまで保持されます。
Solana アカウントの資金提供方法について初めての場合は、まずアカウントモデルをお読みください。

レントの実際の仕組み

Solana 上のすべてのアカウントは、占有するスペースのサイズに応じた SOL デポジットを保有しています。これは消費されません。アカウントが閉じられるときに全額返金されます。計算式は以下の通りです:
ACCOUNT_STORAGE_OVERHEAD は、ペイロードに関係なくすべてのアカウントが支払う固定 128 バイトです。lamports_per_byte は、SIMD-0437 が変更するネットワーク全体の定数です。 標準的な 165 バイトの SPL トークンアカウントは、したがって常に (128 + 165) × 6,960 = 2,039,280 ラムポート(ウォレットが関連トークンアカウントを開くたびに差し引かれる約 0.00203928 SOL)のコストがかかります。

SIMD-0437 が変更する内容

SIMD-0437 は lamports_per_byte を 6,960 から 696 に削減します。これは 90% の削減です。5 つの個別のフィーチャーゲートを通じてロールアウトされるため、バリデータは状態成長の影響を一度に 1 段階ずつ吸収できます。 ステップ 1 は 2026 年 9 月 3 日にメインネットで有効化されました。ステップ 2 は同日にテストネットに到達し、2026 年 9 月中旬にメインネットに到達する予定です。ステップ 3~5 は Agave 4.4 用に保留されており、2026 年 11 月頃に予定されています。スケジュールは変更される可能性があります。Foundation は状態成長が問題を起こした場合、ロールアウトを一時停止すると述べています。ハードコードするのではなく、クラスタから実際の値を読み取ってください。
SIMD-0437 は SIMD-0194 に依存しており、これはレント免除閾値を廃止して「フィーチャー有効化時にレントパラメータを設定する際の不要な浮動小数点演算を回避する」ためです。実際には、Rent sysvar は lamports_per_byte_year = 6,333 と exemption_threshold = 1.0 を持つようになり、6,960 を生成した古い 3,480 × 2 の分割ではなくなります。これら 2 つのフィールドを自分で乗算しないでください。getMinimumBalanceForRentExemption を呼び出して、クラスタに答えさせてください。

既存のアカウントが過剰な残高を保有する理由

定数を低下させると、アカウントが必要とするものが変わります。アカウントが持っているものは変わりません。6,960 ラムポート/バイトで資金提供されたアカウントは、ステップ 1 が有効化された後もその残高を保持するため、以下の額だけ過剰資金状態になります:
ステップ 1 後の 165 バイトの SPL トークンアカウントの場合、これは 293 × (6,960 − 6,333) = 183,711 ラムポート、つまりアカウントあたり約 0.000184 SOL です。拡張機能を持つ Token-2022 アカウントはより大きいため、比例してより多くを保有します。182 バイトのアカウントは 310 × 627 = 194,370 ラムポートだけ過剰資金状態になります。 個別には微々たるものです。数百のトークンと相互作用してきたウォレットは、その有意な倍数を保有しており、ステップ 5 までに各 165 バイトのアカウントは最小値を上回る 1,835,352 ラムポート(約 0.00184 SOL)を保有しています。

返却できるアカウント

プログラム所有のアカウント内の超過ラムポートは、そのプログラムによってのみ移動できます。アカウントを閉じずにレントを回収できるかどうかは、完全にそれを所有するプログラムに依存します。

SPL Token と Token-2022

どちらも WithdrawExcessLamports を公開しています。アカウントは開いたままで、トークン残高を保持し、単に現在の最小値に低下します。

その他すべて

同等の命令はありません。レントは、アカウントが閉じられるときにのみ解放されます。これは独自の前提条件を持つ破壊的な操作であり、レントスイープではありません。
具体的には、Raydium ユーザーが保有するアカウントタイプの場合: ラップされた SOL アカウントは 1 つのトークンプログラム例外です。ラムポート残高はトークン残高であるため、両方のプログラムは TokenError::NativeNotSupported で拒否します。両方のプログラムは代わりに UnwrapLamports(判別式 45)を公開しています。これは spl-token-interface の WithdrawExcessLamports と並んでいるため、レガシープログラムも Token-2022 だけでなく持っています。@solana/spl-token は 0.4.15 以降、createUnwrapLamportsInstruction を提供しています。プレーンなレントスイープでネイティブアカウントをスキップし、意図的に処理してください。これを安全に行うパターンは、Raydium 自身のプログラムが使用するもので、下記にあります。

WithdrawExcessLamports 命令

両方のトークンプログラムの命令列挙型の判別式 38。spl-token-interface から:
3 つの特性により、ウォレット内のすべてのアカウントに対して安全に実行できます:
  • 金額を取りません。 プログラムは source.lamports − rent.minimum_balance(source.data_len()) を自分で計算するため、アカウントを現在の最小値以下に取ることはできず、後の段階が有効化されても正しいままです。
  • 何も閉じません。 アカウントはそのデータ、所有者、トークン残高を保持します。
  • べき等です。 既に最小値にあるアカウントに対して実行すると、ゼロラムポートが移動され、成功します。
フリーズされたトークンアカウントも適格です。フリーズはトークン移動を制限しますが、ラムポートは制限しません。

命令の構築

@solana/spl-token はそれのビルダーをエクスポートしていません。0.4.15 の時点で、列挙型エントリはまだコメントアウトされています。上流は識別子を WithdrawalExcessLamports と綴っており、余分な「al」があるため、それを grep してください:
直接エンコードしてください。ペイロードは単一の判別式バイトです:
各アカウント自身の programId を渡してください。SPL Token と Token-2022 の命令は 1 つのトランザクションで共有できますが、それぞれはソースアカウントを所有するプログラムに対処する必要があります。 メインネットで測定すると、命令は SPL Token プログラムで 270 コンピュートユニット、Token-2022 で 1,414 コンピュートユニットのコストがかかります。どちらの方法でも無視できます。実際の制約はコンピュートではなく、トランザクションサイズです。

回収可能なアカウントの検索

ハードコードされたレートから超過分を導出しないでください。各アカウントが今すぐ必要とするものをクラスタに尋ねてください。同じコードが 5 つのステップすべてを通じて機能し続けるようにします:
getMinimumBalanceForRentExemption(0) は有用なサイドチャネルです。正確に 128 × lamports_per_byte を返すため、128 で割ると、Rent sysvar を解析することなく、クラスタがどのロールアウトステップにあるかがわかります。

バッチ処理:1 つのトランザクションに何個収まるか

各 WithdrawExcessLamports 命令は、1 つの一意の書き込み可能なアカウントキー(コンパイルされたメッセージで 32 バイト)と約 7 バイトの命令エンコーディングを提供します。宛先、権限、手数料支払者はすべて同じウォレットであるため、それらの間で 1 つのキーのコストがかかります。 1,232 バイトのトランザクション制限に対して、コンピュート予算命令とブロックハッシュが計算されると、約 25 の命令が収まります。トランザクションあたり 20 個が安全な作業数であり、Raydium 自身の実装が使用するものです。116 個の回収可能なアカウントを持つウォレットは、したがって 6 つのトランザクションで掃引され、それぞれ 1 つの 5,000 ラムポート基本手数料があります。 経済学に注意してください。手数料はアカウントごとではなく、トランザクションごとに請求されます。より少ないアカウントを回収しても、コストは低くなりません。これが部分的なスイープが余分なラウンドトリップの価値がある理由です。

Raydium を通じた回収

raydium.io/reclaim-rent ページは、接続されたウォレットの SPL Token と Token-2022 アカウントをスキャンし、プログラム別に分割された合計を表示し、バッチ処理されたトランザクションですべてを掃引します。スキャンは読み取り専用です。すべてのレントを回収を押すまで署名はありません。 ページは意図的にトークンアカウントのみをカバーしています。アカウントタイプがレントを閉じることによってのみ解放できるものは、利用不可として一覧表示されるのではなく、除外されます。これはアカウントを閉じることが異なる破壊的なアクションであるためです。

SDK デモから回収

バージョンバナー。 これらのデモは @raydium-io/raydium-sdk-v2@0.2.64-alpha を Solana mainnet-beta に対してターゲットにしており、2026 年 9 月に検証されています。raydium-sdk-V2-demo リポジトリ自体は現在 0.2.62-alpha をインストールしており、2 つはここで相互交換可能です。WithdrawExcessLamports は手動でエンコードされており、SDK バージョンに依存しません。SDK はトランザクション構築とバッチ処理にのみ使用されます。
raydium-sdk-V2-demo/src/rent の 2 つのスクリプト:
reclaimRent.ts はトランザクションあたり 20 アカウントでバッチ処理し、すべてのバッチを 1 回のパスで署名します:
送信する前にシミュレートしてください。accounts.addresses を使用した simulateTransaction は実行後のラムポート残高を返します。これは、算術がクラスタが実際に行うことと一致することを確認する最も安い方法です。

Raydium プログラムが自身の側で掃引するもの

あなたのウォレットは、削減がラムポートを解放する唯一の場所ではありません。すべてのプールもレントを保有しています。ボルト、LP ミント、および古いレートで資金提供されたプログラム所有の状態アカウント。そのレントはプロトコルに属し、LP には属しません。それは誰がアカウントを作成したかによって支払われ、プールの準備金の一部ではなく、曲線に入ることはありませんでした。 3 つのプログラムは 2026 年 9 月 9 日に管理者命令を取得して返却し、CLMM は 2026 年 9 月 30 日に続きました: アドレスは reference/program-addresses にあります。Stable AMM に同等のものはありません。 ここでは LP またはトレーダーに影響を与えません。 これらの命令はラムポートのみを移動します。トークン残高、アカウントデータ、所有者、プール状態、LP 供給、手数料カウンター、曲線はすべて変わらず、それらのいずれもアカウントを閉じることはできません。スイープの前後でプールのスワップの見積もりは同じです。ユーザー側のアクション、オプトイン、期限はありません。

各プログラムが処理する 3 つのアカウント形状

すべて 4 つは、ソースアカウントの所有者に対して同じディスパッチに従います:
  • プログラム権限 PDA が所有するトークンアカウントまたはミント:プログラムは、その PDA として署名して、トークンプログラムの WithdrawExcessLamports(判別式 38)を CPI します。CLMM では、その PDA は PoolState 自体であるため、1 つの呼び出しで 1 つのプールのボルトをカバーします。
  • ラップされた SOL ボルト — WithdrawExcessLamports はネイティブアカウントを拒否するため、プログラムは最初に SyncNative を実行します(これは寄付された超過分をラップされた amount に折り込みます)、ラップされた金額がどれだけ成長したかを正確に測定し、その差分に対して UnwrapLamports を実行し、ラップされた残高が事前同期値に戻っていることを確認します。そのチェックが失敗すると、命令全体が LamportsCalculateError で戻ります。これが SOL 側プールボルトがスイープを通じて完全な流動性を保つ理由です。
  • プログラム所有の状態アカウント — AmmInfo、PoolState、AmmConfig、ObservationState、PlatformConfig、CLMM TickArrayState など。プログラムは独自のアカウントを直接デビットできるため、CPI なしで残高を rent.minimum_balance(data_len) に移動します。
他のものが所有するアカウントはサイレントにスキップされるため、関連のないアカウントを渡すことは致命的ではなく無害です。 ラップされた SOL シーケンスは、独自のネイティブアカウントを保有する場合にコピーする価値があります。これは、アカウントがトークン残高として報告するものを変更することなく、wSOL アカウントから超過分を取る唯一の方法です。
これらのパスは crate バージョンではなく、デプロイされたトークンプログラムに依存します。 4 つのプログラムすべてがトークン命令を手動でエンコードします。WithdrawExcessLamports の場合は単一の 38 バイト、UnwrapLamports の場合は 45 と COption<u64> です。そして、ソースアカウントを所有するトークンプログラムに送信します。両方の命令は、現在のメインネット SPL Token と Token-2022 プログラムに存在します。古いバンドルされた SPL Token ビルドを実行しているローカルバリデータまたはテストハーネスはそれらを実装していません。そしてそれに対するスイープは、Raydium プログラムの何かではなく、未知の判別式で失敗します。これらのパスをメインネット複製トークンプログラムに対してテストしてください。

依然として所定の場所で回収できないもの

依然として CLMM ポジションのレントを所定の場所で自分で回収することはできません。ポジションが閉じられるときに戻ります。上記の表が言うように。CLMM の独自の CollectExcessLamports はアカウントに資金を提供した人をチェックしないため、PersonalPositionState または LimitOrderState から超過分を取ることができます。アカウントはそのレント最小値に留まり、それが最小値は閉じるときに返却されるものです。LaunchLab ベースミントの場合も同じです。初期化命令は、供給をミントする同じ呼び出しで MintTokens を取り消すため、どのキーもそのミントに対して WithdrawExcessLamports に署名することはできず、そのレントは設計上取り残されます。

今すぐ回収するか待つべきか?

どちらも問題なく、どちらの方法でも差は小さいです:
  • 超過分はどこにも行きません。 あなた自身のアカウントに留まります。何も期限切れにはなりません。何も掃引されません。期限は適用されません。
  • 待つことは複合します。 各ステップは同じアカウントからより多くを解放し、ステップ 5 後の 1 つのスイープは今日の 1 つのスイープと同じ手数料のコストがかかります。
  • 今すぐ回収することは後の段階を没収しません。 今日掃引するアカウントは単に現在の最小値にあります。次のステップはそれを再び過剰資金状態にし、再度掃引できます。
早期に回収する唯一の実際のコストは基本手数料であり、待つ唯一の実際のコストは、ラムポートがもう少し長く不動のままであることです。

さらに読む

SIMD-0437

提案自体 — 5 つのフィーチャーゲートと削減をステップする理由。

削減されたレント

Solana のロールアウトページ:現在のステップ、スケジュール、新しいアカウントの変更内容。

レント削減:データに基づく分析

経済学、およびステップ付きロールアウトが管理するように設計された状態成長リスク。

アカウントモデル

Solana アカウントがどのように資金提供、所有、閉じられるか — 上記のすべての背景。