> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# レント（Rent）と回収可能なレント

> Solana は SIMD-0437 に基づいて、5 段階にわたってレント免除最小額を 90% 削減しています。各段階前に資金提供されたアカウントは必要以上の残高を保有しており、その超過分が何であるか、どのプログラムが返却するか、そしてそれを見つけて回収する方法について説明します。

<Info>
  **このページは AI による自動翻訳です。すべての内容は英語版を正とします。**

  [英語版を表示 →](/solana-fundamentals/rent-and-reclaimable-rent)
</Info>

<Info>
  レントは手数料ではなく返金可能なデポジットです。SIMD-0437 は、すべてのアカウントが保有する必要があるデポジットを 5 つの独立したゲートを通じて段階的に削減します。段階前に作成されたアカウントは資金提供時の残高を保持するため、各段階によってそれらは過剰資金状態になります。SPL Token と Token-2022 プログラムは、アカウントを閉じたりトークン残高に触れたりすることなく、`WithdrawExcessLamports` を通じてその差分を返却できます。何も期限切れにはなりません。超過分は、移動することを選択するまで、あなた自身のアカウントに留まります。
</Info>

Solana アカウントの資金提供方法が初めての場合は、まず[アカウント モデル](/ja/solana-fundamentals/account-model)をお読みください。

## レントの実際の内容

Solana 上のすべてのアカウントは、占有するスペースのサイズに応じた SOL デポジットを保有しています。これは消費されません。アカウントが閉じられるときに全額返金されます。計算式は以下の通りです：

```
minimum_balance(data_len) = (ACCOUNT_STORAGE_OVERHEAD + data_len) × lamports_per_byte
```

`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 ステップずつ吸収できます。

| ステップ   | `lamports_per_byte` | 元の値からの削減 | 165 バイト トークン アカウントのレント |
| ------ | ------------------- | -------- | ---------------------- |
| —（元の値） | 6,960               | —        | 2,039,280 ラムポート        |
| 1      | 6,333               | 9%       | 1,855,569 ラムポート        |
| 2      | 5,080               | 27%      | 1,488,440 ラムポート        |
| 3      | 2,575               | 63%      | 754,475 ラムポート          |
| 4      | 1,322               | 81%      | 387,346 ラムポート          |
| 5      | 696                 | 90%      | 203,928 ラムポート          |

ステップ 1 は 2026 年 9 月 3 日にメインネットで有効化されました。ステップ 2 は同日にテストネットに到達し、2026 年 9 月中旬にメインネットに到達する予定です。ステップ 3～5 は Agave 4.4 用に保留されており、2026 年 11 月頃に予定されています。スケジュールは変更される可能性があります。Foundation は状態成長が問題を起こした場合、ロールアウトを一時停止すると述べています。ハードコードするのではなく、クラスターからライブ値を読み取ってください。

<Note>
  SIMD-0437 は SIMD-0194 に依存しており、これはレント免除閾値を廃止して「フィーチャー有効化時にレント パラメーターを設定する際の不要な浮動小数点演算を回避する」ためです。実際には、`Rent` sysvar は `lamports_per_byte_year = 6,333` と `exemption_threshold = 1.0` を持つようになりました。これは、6,960 を生成した古い `3,480 × 2` の分割ではなく。これら 2 つのフィールドを自分で乗算しないでください。`getMinimumBalanceForRentExemption` を呼び出して、クラスターに答えさせてください。
</Note>

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

定数を低下させると、アカウントが*必要とする*ものが変わります。アカウントが*持っている*ものは変わりません。6,960 ラムポート/バイトで資金提供されたアカウントは、ステップ 1 が有効化された後もその残高を保持するため、以下の額だけ過剰資金状態になります：

```
excess = (128 + data_len) × (old_rate − new_rate)
```

ステップ 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）を保有しています。

## 超過分を返却できるアカウント

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

<CardGroup cols={2}>
  <Card title="SPL Token と Token-2022" icon="circle-check">
    どちらも `WithdrawExcessLamports` を公開しています。アカウントは開いたままで、トークン残高を保持し、単に現在の最小値に低下します。
  </Card>

  <Card title="その他すべて" icon="circle-xmark">
    同等の命令はありません。レントは、アカウントが閉じられるときにのみ解放されます。これは独自の前提条件を持つ破壊的な操作であり、レント スイープではありません。
  </Card>
</CardGroup>

具体的には、Raydium ユーザーが保有するアカウント タイプの場合：

| アカウント                    | 所有者                                           | 超過分を所定の場所で返却できますか？                                              |
| ------------------------ | --------------------------------------------- | --------------------------------------------------------------- |
| SPL トークン アカウント           | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | はい — `WithdrawExcessLamports`                                   |
| Token-2022 トークン アカウント    | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | はい — `WithdrawExcessLamports`                                   |
| ラップ SOL（ネイティブ）トークン アカウント | いずれかのトークン プログラム                               | いいえ — 下記を参照                                                     |
| CLMM ポジション               | Raydium CLMM                                  | いいえ — ポジションが閉じられるときにレントが返却されます                                  |
| OpenBook v1 オープン オーダー    | OpenBook v1                                   | いいえ — `CloseOpenOrders` のみ                                      |
| OpenBook v2 オープン オーダー    | OpenBook v2                                   | いいえ — `close_open_orders_account` のみ                            |
| ステーク アカウント               | ステーク プログラム                                    | いいえ — SIMD-0490 は `rent_exempt_reserve` を 2,282,880 ラムポートに固定します |

ラップ SOL アカウントは 1 つのトークン プログラム例外です。それらのラムポート残高*は*トークン残高であるため、両方のプログラムは `TokenError::NativeNotSupported` で拒否します。**両方の**プログラムは代わりにそのケース用に `UnwrapLamports`（判別式 45）を公開しています。これは `spl-token-interface` の `WithdrawExcessLamports` と並んでいるため、レガシー プログラムも Token-2022 だけでなくそれを持っています。`@solana/spl-token` は 0.4.15 以降、それ用に `createUnwrapLamportsInstruction` を提供しています。プレーン レント スイープでネイティブ アカウントをスキップし、意図的に処理してください。これを安全に行うためのパターンは、Raydium 自身のプログラムが使用するもので、[下記](#what-the-raydium-programs-sweep-on-their-own-side)にあります。

## `WithdrawExcessLamports` 命令

両方のトークン プログラムの命令列挙型の判別式 **38**。`spl-token-interface` から：

```rust theme={null}
/// This instruction is to be used to rescue SOL sent to any TokenProgram
/// owned account by sending them to any other account, leaving behind only
/// lamports for rent exemption.
///
/// 0. `[writable]` Source Account owned by the token program
/// 1. `[writable]` Destination account
/// 2. `[signer]` Authority
/// 3. `..3+M` `[signer]` M signer accounts
WithdrawExcessLamports,
```

3 つの特性により、ウォレット内のすべてのアカウントに対して安全に実行できます：

* **金額を取りません。** プログラムは `source.lamports − rent.minimum_balance(source.data_len())` を自分で計算するため、アカウントを現在の最小値以下に取ることはできず、後のステップが有効化されても正しいままです。
* **何も閉じません。** アカウントはそのデータ、所有者、トークン残高を保持します。
* **べき等です。** 既に最小値にあるアカウントに対して実行すると、ゼロ ラムポートが移動され、成功します。

フリーズされたトークン アカウントも対象です。フリーズはトークン移動を制限しますが、ラムポートは制限しません。

### 命令の構築

`@solana/spl-token` はそれ用のビルダーをエクスポートしていません。`0.4.15` の時点で、列挙型エントリはまだコメント アウトされています：

```ts theme={null}
// packages/spl-token/src/instructions/types.ts
export enum TokenInstruction {
    // ...
    TransferHookExtension = 36,
    // ConfidentialTransferFeeExtension = 37,
    // WithdrawalExcessLamports = 38,   // ← not exposed
    MetadataPointerExtension = 39,
    // ...
}
```

直接エンコードしてください。ペイロードは単一の判別式バイトです：

```ts theme={null}
import { PublicKey, TransactionInstruction } from "@solana/web3.js";

export function createWithdrawExcessLamportsInstruction(params: {
  source: PublicKey;        // the token account holding excess lamports
  destination: PublicKey;   // where the excess goes — usually the wallet itself
  authority: PublicKey;     // owner of `source`, or the multisig account
  multiSigners?: PublicKey[];
  programId: PublicKey;     // TOKEN_PROGRAM_ID or TOKEN_2022_PROGRAM_ID
}): TransactionInstruction {
  const { source, destination, authority, multiSigners = [], programId } = params;
  return new TransactionInstruction({
    programId,
    keys: [
      { pubkey: source, isSigner: false, isWritable: true },
      { pubkey: destination, isSigner: false, isWritable: true },
      { pubkey: authority, isSigner: !multiSigners.length, isWritable: false },
      ...multiSigners.map((pubkey) => ({ pubkey, isSigner: true, isWritable: false })),
    ],
    data: Buffer.from([38]),
  });
}
```

各アカウント自身の `programId` を渡してください。SPL Token と Token-2022 の命令は 1 つのトランザクションで共有できますが、それぞれはソース アカウントを所有するプログラムにアドレス指定される必要があります。

メインネットで測定すると、命令は SPL Token プログラムで 270 コンピュート ユニット、Token-2022 で 1,414 コンピュート ユニットの費用がかかります。どちらの方法でも無視できます。実際の制約はコンピュートではなく、トランザクション サイズです。

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

ハードコードされたレートから超過分を導出しないでください。クラスターに各アカウントが今すぐ何を必要とするかを尋ねてください。同じコードが 5 つのステップすべてを通じて機能し続けるようにします：

```ts theme={null}
const [tokenResp, token2022Resp] = await Promise.all([
  connection.getTokenAccountsByOwner(owner, { programId: TOKEN_PROGRAM_ID }),
  connection.getTokenAccountsByOwner(owner, { programId: TOKEN_2022_PROGRAM_ID }),
]);
const raw = [...tokenResp.value, ...token2022Resp.value];

// one lookup per distinct account size — a wallet normally has two or three
const spaces = Array.from(new Set(raw.map(({ account }) => account.data.length)));
const minimums = new Map(
  await Promise.all(
    spaces.map(async (space) => [space, await connection.getMinimumBalanceForRentExemption(space)] as const),
  ),
);

const reclaimable = raw.filter(({ account }) => {
  // wrapped SOL carries its token balance as lamports — both programs refuse it.
  // The `is_native` COption tag sits at offset 109 in the token account layout,
  // which Token-2022 preserves before its extension data.
  if (account.data.readUInt32LE(109) === 1) return false;
  return account.lamports > minimums.get(account.data.length)!;
});
```

`getMinimumBalanceForRentExemption(0)` は便利なサイド チャネルです。これは正確に `128 × lamports_per_byte` を返すため、128 で割ると、`Rent` sysvar を解析することなく、クラスターがどのロールアウト ステップにあるかがわかります。

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

各 `WithdrawExcessLamports` 命令は、1 つの一意の書き込み可能なアカウント キー（コンパイル済みメッセージで 32 バイト）と約 7 バイトの命令エンコーディングを提供します。宛先、権限、手数料支払者はすべて同じウォレットであるため、それらの間で 1 つのキーの費用がかかります。

1,232 バイトのトランザクション制限に対して、コンピュート予算命令とブロックハッシュを考慮すると、約 26 個の命令が収まります。**トランザクションあたり 20 個**が安全な作業数であり、これは Raydium 自身の実装が使用するものです。したがって、116 個の回収可能なアカウントを持つウォレットは 6 つのトランザクションで掃引され、それぞれ 1 つの 5,000 ラムポート基本手数料があります。

経済学に注意してください。手数料はアカウントごとではなく、トランザクションごとに請求されます。より少ないアカウントを回収しても、費用は減りません。これが部分的なスイープが余分なラウンド トリップの価値がめったにない理由です。

## Raydium を通じた回収

[raydium.io/reclaim-rent](https://raydium.io/reclaim-rent) ページは、接続されたウォレットの SPL Token と Token-2022 アカウントをスキャンし、プログラム別に分割された合計を表示し、バッチ処理されたトランザクションですべてをスイープします。スキャンは読み取り専用です。**すべてのレントを回収**を押すまで署名はありません。

ページは意図的にトークン アカウントのみをカバーしています。アカウントを閉じることによってのみレントを解放できるアカウント タイプは、利用不可として一覧表示されるのではなく、除外されます。これは、アカウントを閉じることが異なる破壊的なアクションであるためです。

## SDK デモから回収

<Info>
  **バージョン バナー。** これらのデモは Solana mainnet-beta に対して `@raydium-io/raydium-sdk-v2@0.2.64-alpha` をターゲットとしており、2026 年 9 月に検証されています。`raydium-sdk-V2-demo` リポジトリ自体は現在 `0.2.62-alpha` をインストールしており、2 つはここで相互交換可能です。`WithdrawExcessLamports` は手動でエンコードされており、SDK バージョンに依存しません。SDK はトランザクション構築とバッチ処理にのみ使用されます。
</Info>

[`raydium-sdk-V2-demo/src/rent`](https://github.com/raydium-io/raydium-sdk-V2-demo/tree/master/src/rent) の 2 つのスクリプト：

```bash theme={null}
# read-only: what can this wallet reclaim, and what would it be worth after all five steps
yarn dev src/rent/checkReclaimableRent.ts
yarn dev src/rent/checkReclaimableRent.ts <any wallet address>

# build, simulate (DRY_RUN = true by default), then send the batched sweep
yarn dev src/rent/reclaimRent.ts
```

`reclaimRent.ts` はトランザクションあたり 20 個のアカウントでバッチ処理し、すべてのバッチに 1 回で署名します：

```ts theme={null}
const batches = chunk(report.accounts, ACCOUNTS_PER_TX);

const builtTxs = await Promise.all(
  batches.map(async (batch) => {
    const builder = new TxBuilder({
      connection,
      feePayer: owner.publicKey,
      cluster: raydium.cluster,
      owner: raydium.owner,
    });
    builder.addInstruction({
      instructions: batch.map((account) =>
        createWithdrawExcessLamportsInstruction({
          source: account.pubkey,
          destination: owner.publicKey,
          authority: owner.publicKey,
          programId: account.programId,
        }),
      ),
    });
    return builder.versionBuild({ txVersion });
  }),
);

// versionMultiBuild puts the calling builder's transaction first and appends
// extraPreBuildData after it, so batch 1 drives and batches 2..n follow in order
const [firstTx, ...restTxs] = builtTxs;
const { execute } = await firstTx.builder.versionMultiBuild({ txVersion, extraPreBuildData: restTxs });
const { txIds } = await execute({ sequentially: true });
```

送信する前にシミュレートしてください。`accounts.addresses` を使用した `simulateTransaction` は実行後のラムポート残高を返します。これは、算術がクラスターが実際に行うことと一致することを確認する最も安い方法です。

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

あなたのウォレットは、削減がラムポートを解放する唯一の場所ではありません。すべてのプールもレントを保有しています。ボルト、LP ミント、および古いレートで資金提供されたプログラム所有の状態アカウント。そのレントはプロトコルに属し、LP には属しません。それはアカウントを作成した人によって支払われ、プールの準備金の一部ではなく、曲線に入ったことはありません。

3 つのプログラムは 2026 年 9 月 9 日に、それを返却するための管理者命令を取得しました：

| プログラム     | 命令                              | 署名者                        |
| --------- | ------------------------------- | -------------------------- |
| AMM v4    | `WithdrawExcessLamports`（タグ 18） | 専用のラムポート収集ウォレットのみ          |
| CPMM      | `CollectExcessLamports`         | プログラム管理者または専用のラムポート収集ウォレット |
| LaunchLab | `CollectExcessLamports`         | プログラム管理者または専用のラムポート収集ウォレット |

アドレスは [`reference/program-addresses`](/ja/reference/program-addresses#excess-lamports-collection-wallets) にあります。CLMM と Stable AMM はそのリリースの一部ではありませんでした。

**ここでは LP またはトレーダーに影響を与えるものはありません。** これらの命令はラムポートのみを移動します。トークン残高、アカウント データ、所有者、プール ステータス、LP 供給、手数料カウンター、曲線はすべて変更されず、それらのいずれもアカウントを閉じることはできません。スイープの前後でスワップのプールの見積もりは同じです。ユーザー側のアクション、オプト イン、期限はありません。

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

すべて 3 つは、ソース アカウントの所有者に対して同じディスパッチに従います：

* **プログラム権限 PDA が所有するトークン アカウントまたはミント** — プログラムは、その PDA として署名して、トークン プログラムの `WithdrawExcessLamports`（判別式 38）を CPI します。
* **ラップ SOL ボルト** — `WithdrawExcessLamports` はネイティブ アカウントを拒否するため、プログラムは最初に `SyncNative` を実行します（これは寄付された超過分をラップされた `amount` に折り込みます）、ラップされた金額がどれだけ増加したかを正確に測定し、その差分に対して `UnwrapLamports` を実行し、その後、ラップされた残高が事前同期値に戻っていることをアサートします。そのチェックが失敗すると、命令全体が `LamportsCalculateError` で戻ります。これが、SOL 側プール ボルトがスイープを通じて完全な流動性を保つ理由です。
* **プログラム所有の状態アカウント** — `AmmInfo`、`PoolState`、`AmmConfig`、`ObservationState`、`PlatformConfig` など。プログラムは独自のアカウントを直接デビットできるため、CPI なしで残高を `rent.minimum_balance(data_len)` に移動します。

他のものが所有するアカウントは静かにスキップされるため、関連のないアカウントを渡すことは致命的ではなく無害です。

ラップ SOL シーケンスは、独自のネイティブ アカウントを保有する場合にコピーする価値があります。これは、アカウントがトークン残高として報告するものを変更することなく、wSOL アカウントから超過分を取り除く唯一の方法です。

<Note>
  **これらのパスは、クレート バージョンではなく、デプロイされたトークン プログラムに依存します。** 3 つのプログラムすべてがトークン命令を手動でエンコードします。`WithdrawExcessLamports` の場合は単一の `38` バイト、`UnwrapLamports` の場合は `45` と `COption<u64>` です。そして、ソース アカウントを所有するトークン プログラムに送信します。両方の命令は、現在のメインネット SPL Token と Token-2022 プログラムに存在します。古いバンドルされた SPL Token ビルドを実行しているローカル バリデーターまたはテスト ハーネスはそれらを実装していません。そして、それに対するスイープは、Raydium プログラムの何かではなく、不明な判別式で失敗します。これらのパスをメインネット クローン トークン プログラムに対してテストしてください。
</Note>

### 所定の場所で回収できないもの

CLMM ポジションのレントはこのすべてによって変更されません。上記の表が言うように、ポジションが閉じられるときに戻ります。LaunchLab ベース ミントも同じです。初期化命令は、供給をミントする同じ呼び出しで `MintTokens` を取り消すため、キーはそのミントに対して `WithdrawExcessLamports` に署名することはできず、そのレントは設計上取り残されます。

## 今すぐ回収するか、待つべきか？

どちらでも問題なく、どちらの方法でも差は小さいです：

* **超過分はどこにも行きません。** それはあなた自身のアカウントに留まります。何も期限切れにはなりません。何も掃引されません。期限は適用されません。
* **待つことは複合します。** 各ステップは同じアカウントからより多くを解放し、ステップ 5 後の 1 回のスイープは今日の 1 回のスイープと同じ手数料がかかります。
* **今回収することは、後のステップを放棄しません。** 今日掃引するアカウントは単に現在の最小値にあります。次のステップはそれを再び過剰資金状態にし、再度掃引できます。

早期に回収する唯一の実際の費用は基本手数料であり、待つ唯一の実際の費用は、ラムポートがもう少し長く動かないままであることです。

## さらに詳しく

<CardGroup cols={2}>
  <Card title="SIMD-0437" icon="file-code" href="https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0437-incremental-rent-reduction.md">
    提案自体 — 5 つのフィーチャー ゲートと削減をステップする理由。
  </Card>

  <Card title="削減されたレント" icon="book" href="https://solana.com/upgrades/reduced-rent">
    Solana のロールアウト ページ：現在のステップ、スケジュール、新しいアカウントの変更内容。
  </Card>

  <Card title="レント削減：データに基づく分析" icon="chart-line" href="https://solana.com/news/rent-reduction-deep-dive">
    経済学、およびステップ付きロールアウトが管理するように設計された状態成長リスク。
  </Card>

  <Card title="アカウント モデル" icon="database" href="/ja/solana-fundamentals/account-model">
    Solana アカウントがどのように資金提供、所有、閉じられるか — 上記のすべての背景。
  </Card>
</CardGroup>
