> ## 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 và rent có thể hoàn lại

> Solana đang giảm mức tối thiểu miễn phí rent xuống 90% qua năm bước theo SIMD-0437. Các tài khoản được tài trợ trước mỗi bước giờ đây nắm giữ nhiều hơn những gì chúng cần — phần dư đó là gì, những chương trình nào trả lại nó, và cách tìm và hoàn lại nó.

<Info>
  **Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.**

  [Xem bản tiếng Anh →](/solana-fundamentals/rent-and-reclaimable-rent)
</Info>

<Info>
  Rent là một khoản ký quỹ có thể hoàn lại, không phải một khoản phí. SIMD-0437 giảm khoản ký quỹ mà mỗi tài khoản phải nắm giữ, qua năm bước được kiểm soát độc lập. Các tài khoản được tạo trước một bước sẽ giữ lại số dư mà chúng được tài trợ, vì vậy mỗi bước để lại chúng bị tài trợ quá mức. Các chương trình SPL Token và Token-2022 có thể trả lại sự khác biệt đó thông qua `WithdrawExcessLamports` mà không cần đóng tài khoản hoặc chạm vào số dư token. Không có gì hết hạn — phần dư nằm trong các tài khoản của bạn cho đến khi bạn chọn di chuyển nó.
</Info>

Hãy đọc [Account model](/vi/solana-fundamentals/account-model) trước nếu bạn mới làm quen với cách các tài khoản Solana được tài trợ.

## Rent thực sự là gì

Mỗi tài khoản trên Solana nắm giữ một khoản ký quỹ SOL được định kích thước theo không gian mà nó chiếm dụng. Nó không bị chi tiêu — nó được trả lại đầy đủ khi tài khoản được đóng. Công thức là:

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

`ACCOUNT_STORAGE_OVERHEAD` là 128 byte cố định mà mỗi tài khoản phải trả bất kể nội dung của nó. `lamports_per_byte` là hằng số toàn mạng mà SIMD-0437 thay đổi.

Một tài khoản token SPL tiêu chuẩn 165 byte do đó luôn có chi phí `(128 + 165) × 6,960 = 2,039,280` lamports — khoảng \~0.00203928 SOL mà bạn thấy bị khấu trừ bất cứ khi nào ví mở một tài khoản token liên kết.

## SIMD-0437 thay đổi gì

SIMD-0437 giảm `lamports_per_byte` từ 6,960 xuống 696 — giảm 90% — được triển khai qua năm cổng tính năng riêng biệt để các trình xác thực có thể hấp thụ hiệu ứng tăng trưởng trạng thái từng bước một.

| Bước        | `lamports_per_byte` | Giảm từ ban đầu | Rent cho tài khoản token 165-byte |
| ----------- | ------------------- | --------------- | --------------------------------- |
| — (ban đầu) | 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                  |

Bước 1 được kích hoạt trên mainnet vào ngày 3 tháng 9 năm 2026. Các bước còn lại sẽ được triển khai khi các cổng tính năng của chúng được bật; hãy coi lịch trình có thể thay đổi và đọc giá trị trực tiếp từ cụm thay vì mã hóa cứng nó.

<Note>
  SIMD-0437 phụ thuộc vào SIMD-0194, cái mà loại bỏ ngưỡng miễn phí rent "để tránh toán học dấu phẩy động không cần thiết khi đặt các tham số rent khi kích hoạt tính năng". Trong thực tế, sysvar `Rent` hiện mang `lamports_per_byte_year = 6,333` với `exemption_threshold = 1.0`, thay vì phân chia `3,480 × 2` cũ tạo ra 6,960. Đừng nhân hai trường đó với nhau — gọi `getMinimumBalanceForRentExemption` và để cụm trả lời.
</Note>

## Tại sao các tài khoản hiện tại nắm giữ quá nhiều

Giảm hằng số thay đổi những gì một tài khoản *cần*. Nó không thay đổi những gì một tài khoản *có*. Một tài khoản được tài trợ ở 6,960 lamports trên byte giữ lại số dư đó sau khi bước 1 được kích hoạt, vì vậy nó bị tài trợ quá mức bởi:

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

Đối với tài khoản token SPL 165-byte sau bước 1, đó là `293 × (6,960 − 6,333) = 183,711` lamports, hoặc khoảng \~0.000184 SOL trên mỗi tài khoản. Một tài khoản Token-2022 mang các tiện ích mở rộng lớn hơn, vì vậy nó nắm giữ tương ứng nhiều hơn — một tài khoản 182-byte bị tài trợ quá mức bởi `310 × 627 = 194,370` lamports.

Riêng lẻ đó là một lượng nhỏ. Một ví đã tương tác với một vài trăm token qua các năm đang nắm giữ một bội số có ý nghĩa của nó, và theo bước 5, mỗi tài khoản 165-byte có 1,835,352 lamports (\~0.00184 SOL) nằm trên mức tối thiểu của nó.

## Những tài khoản nào có thể trả lại nó

Lamports dư thừa trong một tài khoản do chương trình sở hữu chỉ có thể được di chuyển bởi chương trình đó. Liệu bạn có thể hoàn lại rent mà không cần đóng tài khoản hay không do đó hoàn toàn phụ thuộc vào chương trình nào sở hữu nó.

<CardGroup cols={2}>
  <Card title="SPL Token và Token-2022" icon="circle-check">
    Cả hai đều công khai `WithdrawExcessLamports`. Tài khoản vẫn mở, giữ lại số dư token của nó, và đơn giản là giảm xuống mức tối thiểu hiện tại.
  </Card>

  <Card title="Mọi thứ khác" icon="circle-xmark">
    Không có lệnh tương đương. Rent chỉ được phát hành khi tài khoản được đóng — một hoạt động phá hủy với các điều kiện tiên quyết riêng của nó, không phải một lần quét rent.
  </Card>
</CardGroup>

Cụ thể, đối với các loại tài khoản mà người dùng Raydium nắm giữ:

| Tài khoản                                 | Chủ sở hữu                                    | Có thể trả lại phần dư tại chỗ?                                   |
| ----------------------------------------- | --------------------------------------------- | ----------------------------------------------------------------- |
| Tài khoản token SPL                       | `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` | Có — `WithdrawExcessLamports`                                     |
| Tài khoản token Token-2022                | `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb` | Có — `WithdrawExcessLamports`                                     |
| Tài khoản token SOL được bao bọc (native) | một trong hai chương trình token              | Không — xem bên dưới                                              |
| Vị trí CLMM                               | Raydium CLMM                                  | Không — rent trả lại khi vị trí được đóng                         |
| OpenBook v1 open orders                   | OpenBook v1                                   | Không — chỉ `CloseOpenOrders`                                     |
| OpenBook v2 open orders                   | OpenBook v2                                   | Không — chỉ `close_open_orders_account`                           |
| Tài khoản stake                           | Chương trình Stake                            | Không — SIMD-0490 ghim `rent_exempt_reserve` ở 2,282,880 lamports |

Các tài khoản SOL được bao bọc là một ngoại lệ của chương trình token: số dư lamport của chúng *là* số dư token của chúng, vì vậy cả hai chương trình đều từ chối chúng với `TokenError::NativeNotSupported`. Token-2022 đã thêm `UnwrapLamports` (discriminant 45) cho trường hợp đó; `@solana/spl-token` vận chuyển `createUnwrapLamportsInstruction` cho nó kể từ 0.4.15. Bỏ qua các tài khoản native trong một lần quét rent và xử lý chúng một cách cố ý.

## Lệnh `WithdrawExcessLamports`

Discriminant **38** trong enum lệnh của cả hai chương trình token. Từ `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,
```

Ba tính chất làm cho nó an toàn để kích hoạt trên mỗi tài khoản trong một ví:

* **Nó không lấy số tiền.** Chương trình tính toán `source.lamports − rent.minimum_balance(source.data_len())` chính nó, vì vậy nó không bao giờ có thể lấy một tài khoản dưới mức tối thiểu hiện tại, và nó vẫn chính xác khi các bước sau được kích hoạt.
* **Nó không đóng bất cứ điều gì.** Tài khoản giữ lại dữ liệu, chủ sở hữu và số dư token của nó.
* **Nó là idempotent.** Chạy nó trên một tài khoản đã ở mức tối thiểu di chuyển không lamports và thành công.

Một tài khoản token bị đóng băng vẫn đủ điều kiện: đóng băng hạn chế chuyển động token, không phải lamports.

### Xây dựng lệnh

`@solana/spl-token` không xuất một trình xây dựng cho nó. Kể từ `0.4.15`, mục enum vẫn bị bình luận:

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

Mã hóa nó trực tiếp. Tải trọng là một byte discriminant duy nhất:

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

Truyền `programId` của mỗi tài khoản. Các lệnh SPL Token và Token-2022 có thể chia sẻ một giao dịch, nhưng mỗi lệnh phải được gửi đến chương trình sở hữu tài khoản nguồn của nó.

Được đo lường trên mainnet, lệnh này tốn 270 compute units trên chương trình SPL Token và 1,414 trên Token-2022 — không đáng kể bằng cách nào. Ràng buộc thực sự là kích thước giao dịch, không phải tính toán.

## Tìm các tài khoản có thể hoàn lại

Đừng tính toán phần dư từ một tỷ lệ được mã hóa cứng. Hỏi cụm những gì mỗi tài khoản cần ngay bây giờ, vì vậy cùng một mã vẫn hoạt động qua cả năm bước:

```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)` là một kênh phụ hữu ích: nó trả về chính xác `128 × lamports_per_byte`, vì vậy chia cho 128 cho bạn biết bước triển khai nào cụm đang ở mà không cần phân tích sysvar `Rent`.

## Ghép lô: bao nhiêu vừa trong một giao dịch

Mỗi lệnh `WithdrawExcessLamports` đóng góp một khóa tài khoản có thể ghi duy nhất — 32 byte trong thông báo được biên dịch — cộng với khoảng 7 byte mã hóa lệnh. Đích đến, quyền hạn và người trả phí đều là cùng một ví, vì vậy chúng tốn một khóa giữa chúng.

Chống lại giới hạn giao dịch 1,232 byte, khoảng 26 lệnh vừa một khi các lệnh ngân sách tính toán và blockhash được tính. **Hai mươi trên mỗi giao dịch** là con số làm việc an toàn, và đó là những gì triển khai của Raydium sử dụng. Một ví có 116 tài khoản có thể hoàn lại do đó quét trong sáu giao dịch, ở mức phí cơ sở 5,000 lamports mỗi cái.

Lưu ý kinh tế: phí được tính trên mỗi giao dịch, không phải trên mỗi tài khoản. Hoàn lại ít tài khoản hơn không tốn ít hơn, đó là lý do tại sao một lần quét một phần hiếm khi đáng giá các chuyến tròn bổ sung.

## Hoàn lại thông qua Raydium

Trang [raydium.io/reclaim-rent](https://raydium.io/reclaim-rent) quét các tài khoản SPL Token và Token-2022 của ví được kết nối, hiển thị tổng số được chia theo chương trình, và quét mọi thứ trong các giao dịch được ghép lô. Quét là chỉ đọc — không có chữ ký cho đến khi bạn nhấn **Reclaim all rent**.

Trang này cố ý chỉ bao gồm các tài khoản token. Các loại tài khoản chỉ có thể phát hành rent bằng cách đóng được loại trừ thay vì được liệt kê là không khả dụng, vì đóng một tài khoản là một hành động khác, phá hủy.

## Hoàn lại từ bản demo SDK

<Info>
  **Biểu ngữ phiên bản.** Các bản demo nhắm mục tiêu `@raydium-io/raydium-sdk-v2@0.2.42-alpha` chống lại Solana mainnet-beta, được xác minh 2026-09. `WithdrawExcessLamports` được mã hóa bằng tay và độc lập với phiên bản SDK; SDK chỉ được sử dụng để xây dựng và ghép lô giao dịch.
</Info>

Hai tập lệnh trong [`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` ghép lô ở 20 tài khoản trên mỗi giao dịch và ký tất cả các lô trong một lần:

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

Mô phỏng trước khi bạn gửi. `simulateTransaction` với `accounts.addresses` trả về số dư lamport sau khi thực thi, đó là cách rẻ nhất để xác nhận số học khớp với những gì cụm sẽ thực sự làm.

## Bạn nên hoàn lại ngay bây giờ hay chờ đợi?

Cả hai đều tốt, và sự khác biệt là nhỏ bằng cách nào:

* **Phần dư không đi đâu.** Nó nằm trong các tài khoản của bạn. Không có gì hết hạn, không có gì bị quét, không có thời hạn nào áp dụng.
* **Chờ đợi tăng gấp đôi.** Mỗi bước phát hành thêm từ các tài khoản tương tự, và một lần quét sau bước 5 tốn cùng một khoản phí như một lần quét hôm nay.
* **Hoàn lại ngay bây giờ không từ bỏ các bước sau.** Một tài khoản bạn quét hôm nay đơn giản là ở mức tối thiểu hiện tại; bước tiếp theo làm cho nó bị tài trợ quá mức lại và bạn có thể quét nó lại.

Chi phí thực sự duy nhất của hoàn lại sớm là phí cơ sở, và chi phí thực sự duy nhất của chờ đợi là lamports vẫn bất động lâu hơn một chút.

## Đọc thêm

<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">
    Đề xuất chính nó — năm cổng tính năng và lý do cho việc bước giảm.
  </Card>

  <Card title="Reduced rent" icon="book" href="https://solana.com/upgrades/reduced-rent">
    Trang triển khai của Solana: bước hiện tại, lịch trình, và những gì thay đổi cho các tài khoản mới.
  </Card>

  <Card title="Rent reduction: a data-backed analysis" icon="chart-line" href="https://solana.com/news/rent-reduction-deep-dive">
    Kinh tế, và rủi ro tăng trưởng trạng thái mà triển khai bước được thiết kế để quản lý.
  </Card>

  <Card title="Account model" icon="database" href="/vi/solana-fundamentals/account-model">
    Cách các tài khoản Solana được tài trợ, sở hữu và đóng — nền tảng cho mọi thứ ở trên.
  </Card>
</CardGroup>
