> ## 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.

# Рента и возвратная рента

> Solana снижает минимум, освобождённый от ренты, на 90% в пять этапов согласно SIMD-0437. Счета, созданные до каждого этапа, содержат больше, чем им нужно — что это избыток, какие программы его возвращают и как его найти и вернуть.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/solana-fundamentals/rent-and-reclaimable-rent)
</Info>

<Info>
  Рента — это возвратный депозит, а не комиссия. SIMD-0437 снижает депозит, который должен держать каждый счет, в пять независимо управляемых этапов. Счета, созданные до этапа, сохраняют баланс, с которым они были профинансированы, поэтому каждый этап оставляет их переполненными. Программы SPL Token и Token-2022 могут вернуть эту разницу через `WithdrawExcessLamports` без закрытия счета или изменения его баланса токенов. Ничего не истекает — избыток остается на ваших собственных счетах, пока вы не решите его переместить.
</Info>

Сначала прочитайте [Модель счета](/ru/solana-fundamentals/account-model), если вы новичок в том, как финансируются счета Solana.

## Что такое рента на самом деле

Каждый счет на 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% — развернутое через пять отдельных флагов функций, чтобы валидаторы могли поглощать эффект роста состояния по одному этапу за раз.

| Этап         | `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 активировался на mainnet 3 сентября 2026 года. Остальные этапы включаются по мере активации их флагов функций; рассматривайте расписание как подлежащее изменению и читайте актуальное значение из кластера вместо того, чтобы жестко кодировать его.

<Note>
  SIMD-0437 зависит от SIMD-0194, который устраняет порог освобождения от ренты «чтобы избежать ненужной математики с плавающей точкой при установке параметров ренты при активации функции». На практике sysvar `Rent` теперь содержит `lamports_per_byte_year = 6,333` с `exemption_threshold = 1.0`, вместо старого разделения `3,480 × 2`, которое давало 6,960. Не умножайте эти два поля самостоятельно — вызовите `getMinimumBalanceForRentExemption` и позвольте кластеру ответить.
</Note>

## Почему существующие счета содержат слишком много

Снижение константы меняет то, что счету *нужно*. Это не меняет то, что счет *имеет*. Счет, профинансированный при 6,960 лампортов на байт, сохраняет этот баланс после активации этапа 1, поэтому он переполнен на:

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

Для 165-байтового счета SPL токена после этапа 1 это `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 — единственное исключение программы токенов: их баланс лампортов *является* их балансом токенов, поэтому обе программы отклоняют их с `TokenError::NativeNotSupported`. Token-2022 добавил `UnwrapLamports` (дискриминант 45) для этого случая; `@solana/spl-token` поставляет `createUnwrapLamportsInstruction` для этого начиная с версии 0.4.15. Пропускайте нативные счета при очистке ренты и обрабатывайте их намеренно.

## Инструкция `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,
```

Три свойства делают её безопасной для использования на каждом счете в кошельке:

* **Она не принимает сумму.** Программа сама вычисляет `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 могут находиться в одной транзакции, но каждая должна быть адресована программе, которая владеет её исходным счетом.

Измеренная на mainnet, инструкция стоит 270 единиц вычислений в программе SPL Token и 1,414 в Token-2022 — в любом случае незначительно. Реальное ограничение — размер транзакции, а не вычисления.

## Поиск счетов, подлежащих возврату

Не выводите избыток из жестко закодированного курса. Спросите кластер, что каждому счету нужно прямо сейчас, чтобы один и тот же код продолжал работать через все пять этапов:

```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 говорит вам, на каком этапе развертывания находится кластер, без анализа sysvar `Rent`.

## Группировка: сколько поместится в одну транзакцию

Каждая инструкция `WithdrawExcessLamports` вносит один уникальный ключ записываемого счета — 32 байта в скомпилированном сообщении — плюс примерно 7 байт кодирования инструкции. Назначение, полномочия и плательщик комиссии — все один кошелек, поэтому они стоят один ключ между ними.

Против лимита транзакции в 1,232 байта примерно 26 инструкций поместятся после учета инструкций бюджета вычислений и хеша блока. **Двадцать на транзакцию** — это безопасное рабочее число, и это то, что использует собственная реализация Raydium. Кошелек со 116 возвратными счетами, таким образом, очищается в шести транзакциях, по одной базовой комиссии в 5,000 лампортов каждая.

Обратите внимание на экономику: комиссия взимается за транзакцию, а не за счет. Возврат меньшего количества счетов не стоит меньше, поэтому частичная очистка редко стоит дополнительных круговых поездок.

## Возврат через Raydium

Страница [raydium.io/reclaim-rent](https://raydium.io/reclaim-rent) сканирует счета SPL Token и Token-2022 подключенного кошелька, показывает общую сумму, разделенную по программам, и очищает все в пакетных транзакциях. Сканирование только для чтения — никакой подписи до нажатия **Reclaim all rent**.

Страница намеренно охватывает только счета токенов. Типы счетов, которые могут освобождать ренту только путем закрытия, исключены, а не указаны как недоступные, потому что закрытие счета — это другое, деструктивное действие.

## Возврат из демонстрации SDK

<Info>
  **Баннер версии.** Демонстрации нацелены на `@raydium-io/raydium-sdk-v2@0.2.42-alpha` против Solana mainnet-beta, проверено в сентябре 2026 года. `WithdrawExcessLamports` кодируется вручную и независим от версии SDK; SDK используется только для построения и группировки транзакций.
</Info>

Два скрипта в [`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` группирует по 20 счетов на транзакцию и подписывает все пакеты за один раз:

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

Симулируйте перед отправкой. `simulateTransaction` с `accounts.addresses` возвращает балансы лампортов после выполнения, что является самым дешевым способом подтвердить, что арифметика совпадает с тем, что кластер действительно сделает.

## Следует ли вам возвращать сейчас или ждать?

Оба варианта хороши, и разница небольшая в любом случае:

* **Избыток никуда не денется.** Он остается на ваших собственных счетах. Ничего не истекает, ничего не очищается, никакой крайний срок не применяется.
* **Ожидание дает сложный эффект.** Каждый этап освобождает больше с тех же счетов, и одна очистка после этапа 5 стоит столько же в комиссиях, сколько одна очистка сегодня.
* **Возврат сейчас не лишает вас последующих этапов.** Счет, который вы очищаете сегодня, просто находится на текущем минимуме; следующий этап снова делает его переполненным и вы можете его снова очистить.

Единственная реальная стоимость раннего возврата — это базовая комиссия, и единственная реальная стоимость ожидания — это то, что лампорты остаются неподвижными немного дольше.

## Дополнительное чтение

<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">
    Само предложение — пять флагов функций и обоснование пошагового снижения.
  </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="/ru/solana-fundamentals/account-model">
    Как финансируются, владеют и закрываются счета Solana — основа для всего вышеперечисленного.
  </Card>
</CardGroup>
