Что делает вывод излишних lamport?
WithdrawExcessLamports перемещает SOL, хранящийся на аккаунте Token
Program сверх минимума, освобождённого от аренды, на целевой аккаунт. Балансы
токенов и объём эмиссии остаются неизменными — перемещаются только излишние
lamport.
Это позволяет восстановить SOL, который ранее был заблокирован: lamport, отправленные на token account, mint-аккаунт или мультисиг (все принадлежат Token Program), не могли быть перемещены иным способом.
Исходный справочник
| Элемент | Описание | Источник |
|---|---|---|
WithdrawExcessLamports | Инструкция (дискриминатор 38). | Источник |
process_withdraw_excess_lamports | Логика процессора и проверки прав доступа. | Источник |
Аккаунты
| Аккаунт | Описание |
|---|---|
source | Доступен для записи. Token account, mint-аккаунт или мультисиг, с которого выполняется вывод. |
destination | Доступен для записи. Получает излишние lamport. |
authority | Подписывает в зависимости от типа исходного аккаунта (см. ниже). |
Кто может подписывать
Требуемый подписант зависит от типа аккаунта source:
| Исходный аккаунт | Подписант |
|---|---|
| Token account | Владелец token account (или его мультисиг-подписанты). |
| Mint с mint authority | Mint authority. |
| Mint без mint authority | Сам mint account должен подписать (см. примечание ниже). |
| Мультисиг | Настроенные M-of-N подписанты. |
Случай «минт без mint authority» встречается редко. Когда он применим, минт-аккаунт является подписантом: минт, принадлежащий программе (off-curve), подписывает через CPI из своей программы, а keypair-минт (on-curve) подписывает своим ключом.
Нативные token account (wrapped SOL) не поддерживаются и возвращают
NativeNotSupported. Вывод средств не может опустить исходный аккаунт ниже
минимального остатка, освобождённого от арендной платы.
Как вывести избыточные lamport
В примере используется настроенный клиент
@solana/kit — см.
Перевод токенов для настройки клиента.
import { getWithdrawExcessLamportsInstruction } from "@solana-program/token";// source/destination: addresses of the account to drain and the lamport recipient.// authority: a TransactionSigner that signs per the source account type.const instruction = getWithdrawExcessLamportsInstruction({source,destination,authority});await client.sendTransaction([instruction]);
Для multisig authority передайте со-подписантов с помощью multiSigners.
Is this page helpful?