> ## 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 日にメインネットで有効化されました。残りのステップはフィーチャーゲートが有効化されるにつれてロールアウトされます。スケジュールは変更される可能性があるため、ハードコードするのではなくクラスタから実際の値を読み取ってください。

<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` で拒否します。Token-2022 はそのケースのために `UnwrapLamports`（判別式 45）を追加しました。`@solana/spl-token` は 0.4.15 以降、それのための `createUnwrapLamportsInstruction` を提供しています。レントスイープでネイティブアカウントをスキップし、意図的に処理してください。

## `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.42-alpha` をターゲットとし、2026 年 9 月に検証されました。`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` は実行後のラムポート残高を返すため、これはクラスタが実際に実行する内容と算術が一致することを確認する最も安い方法です。

## 今回収すべきか、それとも待つべきか？

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

* **超過分はどこにも行きません。** それはあなた自身のアカウントに留まります。何も期限切れにはなりません、何も掃引されません、期限は適用されません。
* **待つことは複利になります。** 各ステップは同じアカウントからより多くを解放し、ステップ 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>
