> ## 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 dan rent yang dapat diklaim kembali

> Solana mengurangi minimum rent-exempt sebesar 90% melalui lima langkah di bawah SIMD-0437. Akun yang didanai sebelum setiap langkah sekarang menyimpan lebih dari yang mereka butuhkan — apa kelebihan itu, program mana yang mengembalikannya, dan cara menemukan serta mengklaimnya kembali.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/solana-fundamentals/rent-and-reclaimable-rent)
</Info>

<Info>
  Rent adalah deposit yang dapat dikembalikan, bukan biaya. SIMD-0437 menurunkan deposit yang harus dipegang setiap akun, dalam lima langkah yang gated secara independen. Akun yang dibuat sebelum suatu langkah mempertahankan saldo yang mereka didanai, jadi setiap langkah meninggalkan mereka dalam kondisi over-funded. Program SPL Token dan Token-2022 dapat mengembalikan perbedaan itu melalui `WithdrawExcessLamports` tanpa menutup akun atau menyentuh saldo token-nya. Tidak ada yang kedaluwarsa — kelebihan itu tetap berada di akun Anda sendiri sampai Anda memilih untuk memindahkannya.
</Info>

Baca [Account model](/id/solana-fundamentals/account-model) terlebih dahulu jika Anda baru mengenal cara akun Solana didanai.

## Apa itu rent sebenarnya

Setiap akun di Solana menyimpan deposit SOL yang diukur berdasarkan ruang yang ditempatinya. Deposit ini tidak dihabiskan — deposit dikembalikan sepenuhnya ketika akun ditutup. Rumusnya adalah:

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

`ACCOUNT_STORAGE_OVERHEAD` adalah 128 byte tetap yang setiap akun bayar terlepas dari muatannya. `lamports_per_byte` adalah konstanta jaringan yang diubah oleh SIMD-0437.

Akun token SPL standar berukuran 165 byte oleh karena itu selalu berharga `(128 + 165) × 6,960 = 2,039,280` lamports — \~0.00203928 SOL yang Anda lihat dipotong setiap kali dompet membuka akun token terkait.

## Apa yang diubah SIMD-0437

SIMD-0437 mengurangi `lamports_per_byte` dari 6,960 menjadi 696 — pengurangan 90% — diluncurkan melalui lima feature gate terpisah sehingga validator dapat menyerap efek pertumbuhan state satu langkah pada satu waktu.

| Langkah  | `lamports_per_byte` | Dipotong dari asli | Rent untuk akun token 165-byte |
| -------- | ------------------- | ------------------ | ------------------------------ |
| — (asli) | 6,960               | —                  | 2,039,280 lamports             |
| 1        | 6,333               | 9%                 | 1,855,569 lamports             |
| 2        | 5,080               | 27%                | 1,488,440 lamports             |
| 3        | 2,575               | 63%                | 754,475 lamports               |
| 4        | 1,322               | 81%                | 387,346 lamports               |
| 5        | 696                 | 90%                | 203,928 lamports               |

Langkah 1 diaktifkan di mainnet pada 3 September 2026. Langkah 2 mencapai testnet pada hari yang sama dan diharapkan di mainnet pertengahan September 2026; langkah 3–5 ditahan untuk Agave 4.4, diharapkan sekitar November 2026. Perlakukan jadwal sebagai dapat berubah — Foundation telah mengatakan akan menghentikan peluncuran jika pertumbuhan state berperilaku buruk — dan baca nilai langsung dari cluster daripada hardcoding-nya.

<Note>
  SIMD-0437 bergantung pada SIMD-0194, yang menghapuskan ambang rent exemption "untuk menghindari matematika floating point yang tidak perlu saat menetapkan parameter rent pada aktivasi fitur". Dalam praktiknya `Rent` sysvar sekarang membawa `lamports_per_byte_year = 6,333` dengan `exemption_threshold = 1.0`, daripada split `3,480 × 2` lama yang menghasilkan 6,960. Jangan kalikan kedua field itu sendiri — panggil `getMinimumBalanceForRentExemption` dan biarkan cluster menjawab.
</Note>

## Mengapa akun yang ada menyimpan terlalu banyak

Menurunkan konstanta mengubah apa yang dibutuhkan akun. Ini tidak mengubah apa yang dimiliki akun. Akun yang didanai pada 6,960 lamports per byte mempertahankan saldo itu setelah langkah 1 diaktifkan, jadi akun itu over-funded sebesar:

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

Untuk akun token SPL 165-byte setelah langkah 1 itu adalah `293 × (6,960 − 6,333) = 183,711` lamports, atau \~0.000184 SOL per akun. Akun Token-2022 yang membawa ekstensi lebih besar, jadi menyimpan lebih banyak secara proporsional — akun 182-byte adalah over-funded sebesar `310 × 627 = 194,370` lamports.

Secara individual itu adalah debu. Dompet yang telah berinteraksi dengan beberapa ratus token selama bertahun-tahun menyimpan kelipatan bermakna darinya, dan pada langkah 5 setiap akun 165-byte memiliki 1,835,352 lamports (\~0.00184 SOL) yang duduk di atas minimumnya.

## Akun mana yang dapat mengembalikannya

Lamports berlebih dalam akun yang dimiliki program hanya dapat dipindahkan oleh program itu. Apakah Anda dapat mengklaim kembali rent tanpa menutup akun oleh karena itu sepenuhnya bergantung pada program mana yang memilikinya.

<CardGroup cols={2}>
  <Card title="SPL Token dan Token-2022" icon="circle-check">
    Keduanya mengekspos `WithdrawExcessLamports`. Akun tetap terbuka, mempertahankan saldo token-nya, dan hanya turun ke minimum saat ini.
  </Card>

  <Card title="Semuanya yang lain" icon="circle-xmark">
    Tidak ada instruksi yang setara. Rent hanya dilepaskan ketika akun ditutup — operasi destruktif dengan prasyarat-nya sendiri, bukan sweep rent.
  </Card>
</CardGroup>

Secara konkret, untuk tipe akun yang dipegang pengguna Raydium:

| Akun                            | Pemilik                                       | Dapat mengembalikan kelebihan di tempat?                                 |
| ------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------ |
| Akun token SPL                  | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | Ya — `WithdrawExcessLamports`                                            |
| Akun token Token-2022           | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | Ya — `WithdrawExcessLamports`                                            |
| Akun token Wrapped SOL (native) | salah satu program token                      | Tidak — lihat di bawah                                                   |
| Posisi CLMM                     | Raydium CLMM                                  | Tidak — rent kembali ketika posisi ditutup                               |
| OpenBook v1 open orders         | OpenBook v1                                   | Tidak — hanya `CloseOpenOrders`                                          |
| OpenBook v2 open orders         | OpenBook v2                                   | Tidak — hanya `close_open_orders_account`                                |
| Akun Stake                      | Program Stake                                 | Tidak — SIMD-0490 mengunci `rent_exempt_reserve` pada 2,282,880 lamports |

Akun Wrapped SOL adalah satu pengecualian program token: saldo lamport mereka *adalah* saldo token mereka, jadi kedua program menolaknya dengan `TokenError::NativeNotSupported`. **Kedua** program malah mengekspos `UnwrapLamports` (discriminant 45) untuk kasus itu — itu ada di `spl-token-interface` bersama `WithdrawExcessLamports`, jadi program legacy juga memilikinya, bukan hanya Token-2022 — dan `@solana/spl-token` mengirimkan `createUnwrapLamportsInstruction` untuk itu sejak 0.4.15. Lewati akun native dalam sweep rent biasa dan tangani mereka dengan sengaja; pola untuk melakukannya dengan aman adalah yang digunakan program Raydium sendiri, [di bawah](#what-the-raydium-programs-sweep-on-their-own-side).

## Instruksi `WithdrawExcessLamports`

Discriminant **38** dalam enum instruksi kedua program token. Dari `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,
```

Tiga properti membuatnya aman untuk dijalankan pada setiap akun dalam dompet:

* **Tidak memerlukan jumlah.** Program menghitung `source.lamports − rent.minimum_balance(source.data_len())` sendiri, jadi tidak pernah dapat membawa akun di bawah minimum saat ini, dan tetap benar saat langkah-langkah berikutnya diaktifkan.
* **Tidak menutup apa pun.** Akun mempertahankan data, pemilik, dan saldo token-nya.
* **Bersifat idempoten.** Menjalankannya terhadap akun yang sudah di minimum memindahkan nol lamports dan berhasil.

Akun token yang dibekukan masih memenuhi syarat: pembekuan membatasi pergerakan token, bukan lamports.

### Membangun instruksi

`@solana/spl-token` tidak mengekspor builder untuk itu. Sejak `0.4.15` entri enum masih dikomentari — dan perhatikan bahwa upstream menuliskan identifier-nya sebagai `WithdrawalExcessLamports`, dengan tambahan "al", jadi grep untuk itu:

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

Enkode langsung. Muatan adalah byte discriminant tunggal:

```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]),
  });
}
```

Lewatkan `programId` masing-masing akun. Instruksi SPL Token dan Token-2022 dapat berbagi transaksi, tetapi masing-masing harus ditujukan ke program yang memiliki akun sumbernya.

Diukur di mainnet, instruksi berharga 270 compute unit pada program SPL Token dan 1,414 pada Token-2022 — dapat diabaikan kedua-duanya. Batasan nyata adalah ukuran transaksi, bukan compute.

## Menemukan akun yang dapat diklaim kembali

Jangan turunkan kelebihan dari tingkat hardcoded. Tanyakan kepada cluster apa yang dibutuhkan setiap akun sekarang, sehingga kode yang sama terus bekerja melalui semua lima langkah:

```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)` adalah side-channel yang berguna: mengembalikan tepat `128 × lamports_per_byte`, jadi membagi dengan 128 memberi tahu Anda langkah peluncuran mana yang berada di cluster tanpa mengurai `Rent` sysvar.

## Batching: berapa banyak yang muat dalam satu transaksi

Setiap instruksi `WithdrawExcessLamports` berkontribusi satu kunci akun writable unik — 32 byte dalam pesan yang dikompilasi — ditambah sekitar 7 byte pengkodean instruksi. Destination, authority dan fee payer semuanya adalah dompet yang sama, jadi mereka berharga satu kunci di antara mereka.

Terhadap batas transaksi 1,232-byte, kira-kira 25 instruksi muat setelah instruksi compute-budget dan blockhash dihitung. **Dua puluh per transaksi** adalah angka kerja yang aman, dan itulah yang digunakan implementasi Raydium sendiri. Dompet dengan 116 akun yang dapat diklaim kembali oleh karena itu sweep dalam enam transaksi, pada biaya dasar 5,000-lamport masing-masing.

Perhatikan ekonominya: biaya dikenakan per transaksi, bukan per akun. Mengklaim lebih sedikit akun tidak mengurangi biaya, itulah mengapa sweep parsial jarang layak untuk round trip ekstra.

## Mengklaim melalui Raydium

Halaman [raydium.io/reclaim-rent](https://raydium.io/reclaim-rent) memindai akun SPL Token dan Token-2022 dompet yang terhubung, menampilkan total yang dibagi berdasarkan program, dan sweep semuanya dalam transaksi batch. Pemindaian bersifat read-only — tidak ada tanda tangan sampai Anda menekan **Reclaim all rent**.

Halaman dengan sengaja hanya mencakup akun token. Tipe akun yang hanya dapat melepaskan rent dengan menutup dikecualikan daripada dicantumkan sebagai tidak tersedia, karena menutup akun adalah tindakan yang berbeda dan destruktif.

## Mengklaim dari demo SDK

<Info>
  **Banner versi.** Demo ini menargetkan `@raydium-io/raydium-sdk-v2@0.2.64-alpha` terhadap Solana mainnet-beta, diverifikasi 2026-09; repo `raydium-sdk-V2-demo` itu sendiri saat ini menginstal `0.2.62-alpha`, dan keduanya dapat dipertukarkan di sini. `WithdrawExcessLamports` dikodekan dengan tangan dan independen dari versi SDK — SDK hanya digunakan untuk pembuatan dan batching transaksi.
</Info>

Dua skrip di [`raydium-sdk-V2-demo/src/rent`](https://github.com/raydium-io/raydium-sdk-V2-demo/tree/master/src/rent):

```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` batch pada 20 akun per transaksi dan menandatangani semua batch dalam satu pass:

```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 });
```

Simulasikan sebelum Anda mengirim. `simulateTransaction` dengan `accounts.addresses` mengembalikan saldo lamport pasca-eksekusi, yang merupakan cara termurah untuk mengkonfirmasi aritmatika cocok dengan apa yang akan dilakukan cluster.

## Apa yang disweep program Raydium di sisi mereka sendiri

Dompet Anda bukan satu-satunya tempat pengurangan membebaskan lamports. Setiap pool menyimpan rent juga — vault, LP mint, dan akun state yang dimiliki program yang semuanya didanai pada tingkat lama. Rent itu milik protokol, bukan LP: dibayar oleh siapa pun yang membuat akun, bukan bagian dari cadangan pool mana pun, dan tidak pernah memasuki kurva.

Tiga program mendapatkan instruksi admin pada 2026-09-09 untuk mengembalikannya:

| Program   | Instruksi                         | Penandatangan                                     |
| --------- | --------------------------------- | ------------------------------------------------- |
| AMM v4    | `WithdrawExcessLamports` (tag 18) | Dompet collect-lamports khusus saja               |
| CPMM      | `CollectExcessLamports`           | Admin program atau dompet collect-lamports khusus |
| LaunchLab | `CollectExcessLamports`           | Admin program atau dompet collect-lamports khusus |

Alamat ada di [`reference/program-addresses`](/id/reference/program-addresses#excess-lamports-collection-wallets). CLMM dan Stable AMM bukan bagian dari rilis itu.

**Tidak ada di sini yang mempengaruhi LP atau trader.** Instruksi ini memindahkan lamports dan hanya lamports. Saldo token, data akun, pemilik, status pool, pasokan LP, penghitung biaya dan kurva semuanya tidak tersentuh, dan tidak ada satupun yang dapat menutup akun. Kutipan pool untuk swap identik sebelum dan sesudah sweep. Tidak ada tindakan pengguna, tidak ada opt-in, dan tidak ada tenggat waktu.

### Tiga bentuk akun yang ditangani setiap program

Ketiganya mengikuti dispatch yang sama, pada pemilik akun sumber:

* **Akun token atau mint yang dimiliki PDA otoritas program** — program CPI instruksi `WithdrawExcessLamports` program token (discriminant 38), menandatangani sebagai PDA itu.
* **Vault wrapped-SOL** — `WithdrawExcessLamports` menolak akun native, jadi program `SyncNative` terlebih dahulu (yang melipat kelebihan yang disumbangkan ke `amount` yang dibungkus), mengukur tepat berapa banyak jumlah yang dibungkus tumbuh, `UnwrapLamports` untuk delta itu, dan kemudian menegaskan saldo yang dibungkus kembali ke nilai pra-sync-nya. Jika pemeriksaan itu gagal seluruh instruksi kembali dengan `LamportsCalculateError`. Inilah mengapa vault pool sisi SOL mempertahankan likuiditas penuhnya melalui sweep.
* **Akun state yang dimiliki program** — `AmmInfo`, `PoolState`, `AmmConfig`, `ObservationState`, `PlatformConfig`, dan sebagainya. Program dapat mendebit akun-nya sendiri secara langsung, jadi memindahkan saldo ke bawah ke `rent.minimum_balance(data_len)` tanpa CPI sama sekali.

Akun yang dimiliki apa pun yang lain dilewati diam-diam, jadi melewatkan akun yang tidak terkait tidak berbahaya daripada fatal.

Urutan wrapped-SOL layak disalin jika Anda menyimpan akun native Anda sendiri: itu adalah satu-satunya cara untuk mengambil kelebihan dari akun wSOL tanpa mengubah apa yang dilaporkan akun sebagai saldo token-nya.

<Note>
  **Jalur ini bergantung pada program token yang digunakan, bukan pada versi crate.** Ketiga program mengenkode instruksi token dengan tangan — byte `38` tunggal untuk `WithdrawExcessLamports`, `45` ditambah `COption<u64>` untuk `UnwrapLamports` — dan mengirimkannya ke program token mana pun yang memiliki akun sumber. Kedua instruksi ada di program SPL Token dan Token-2022 mainnet saat ini. Validator lokal atau test harness yang menjalankan build SPL Token bundel yang lebih lama tidak mengimplementasikannya, dan sweep terhadapnya gagal pada discriminator yang tidak dikenal daripada apa pun di program Raydium. Uji jalur ini terhadap program token yang dikloning mainnet.
</Note>

### Apa yang masih tidak dapat diklaim di tempat

Rent posisi CLMM tidak berubah oleh semua ini — kembali ketika posisi ditutup, seperti tabel di atas katakan. Sama untuk mint dasar LaunchLab: instruksi initialize mencabut `MintTokens` dalam panggilan yang sama yang mencetak pasokan, jadi tidak ada kunci yang dapat menandatangani `WithdrawExcessLamports` untuk mint itu dan rent-nya terjebak oleh desain.

## Haruskah Anda mengklaim sekarang atau menunggu?

Keduanya baik-baik saja, dan perbedaannya kecil kedua-duanya:

* **Kelebihan tidak akan pergi ke mana pun.** Itu duduk di akun Anda sendiri. Tidak ada yang kedaluwarsa, tidak ada yang disweep, tidak ada tenggat waktu yang berlaku.
* **Menunggu mengumpulkan bunga.** Setiap langkah melepaskan lebih banyak dari akun yang sama, dan satu sweep setelah langkah 5 berharga sama dalam biaya seperti satu sweep hari ini.
* **Mengklaim sekarang tidak mengorbankan langkah-langkah berikutnya.** Akun yang Anda sweep hari ini hanya berada di minimum saat ini; langkah berikutnya membuatnya over-funded lagi dan Anda dapat sweep-nya lagi.

Satu-satunya biaya nyata mengklaim awal adalah biaya dasar, dan satu-satunya biaya nyata menunggu adalah lamports tetap tidak bergerak sedikit lebih lama.

## Bacaan lebih lanjut

<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">
    Proposal itu sendiri — lima feature gate dan alasan untuk melangkah pengurangan.
  </Card>

  <Card title="Reduced rent" icon="book" href="https://solana.com/upgrades/reduced-rent">
    Halaman peluncuran Solana: langkah saat ini, jadwal, dan apa yang berubah untuk akun baru.
  </Card>

  <Card title="Rent reduction: a data-backed analysis" icon="chart-line" href="https://solana.com/news/rent-reduction-deep-dive">
    Ekonomi, dan risiko pertumbuhan state yang dirancang untuk dikelola peluncuran bertahap.
  </Card>

  <Card title="Account model" icon="database" href="/id/solana-fundamentals/account-model">
    Bagaimana akun Solana didanai, dimiliki, dan ditutup — latar belakang untuk semuanya di atas.
  </Card>
</CardGroup>
