WithdrawExcessLamports はToken Program命令 38 です。これは限定的な問題を解決します。ミント、トークンアカウント、またはマルチシグは、レント免除に必要な額を上回るランポートを保持できますが、そのランポートは通常のトークン送金では移動できません。
WithdrawExcessLamportsは何をしますか?
WithdrawExcessLamports は、Token Programアカウントの現在のレント免除最低額を上回る SOL のみを転送します。ソースは開いたままで、トークンまたはミントのデータは変更されません。必要な署名者は、ソースがトークンアカウント、ミント、トークンマルチシグのいずれであるかによって異なります。
この命令は、従来の SPL Token Programと Token-2022 の両方で利用できます。2026 レント提案以前は、トークン所有のアカウントへ誤って送られたランポートを回収するために役立っていました。レント最低額が下がることで用途が広がり、古いアカウントは元の残高を保持したまま、より少ないリザーブで済むようになります。
正式な動作仕様と最新のクライアント例は、次に記載されています。 Solana のWithdraw Excess Lamportsドキュメント。プロセッサの実装も Token Programリポジトリで公開されています.
この命令にはどのアカウントが必要ですか?
| アカウント | 書き込み可能? | 署名者? | 目的 |
|---|---|---|---|
source | はい | 場合による | 余剰ランポートを保持するトークンアカウント、ミント、またはマルチシグ |
destination | はい | いいえ | 出金されたランポートを受け取る |
authority | いいえ | ソースの種類によって異なります | 出金権限を証明 |
multiSigners | いいえ | 使用時は必要 | 設定済みのトークンマルチシグしきい値を満たす |
プロセッサはソースのデータ長と現在のレント設定を読み取り、最低残高を計算して差額を転送します。古くなっていたり改ざんされたりする可能性のある、呼び出し元が指定したリザーブは受け付けません。
ソースの種類ごとに誰が署名する必要がありますか?
| ソース | 必要な権限 |
|---|---|
| ウォレット所有者がいるトークンアカウント | トークンアカウントの所有者 |
| トークンマルチシグが所有するトークンアカウント | 必要な M-of-N マルチシグメンバー |
| 有効なミント権限があるミント | 現在のミント権限 |
| ミント権限のないミント | ソースのミントアカウント自体 |
| マルチシグのソースアカウント | 設定済みの M-of-N メンバー |
ミント権限が取り消されたケースには、特に注意が必要です。ソースミントがオンカーブのキーペアから作成されている場合、その元のキーペアが署名する必要があります。オフカーブの場合は、制御プログラムが正しい PDA 署名者シードを使用してToken Programを呼び出す必要があります。トークン保有者や以前のミント権限者が、ソースの署名を代行することはできません。
Solana クライアントで命令を構築するにはどうすればよいですか?
現在の公式例では @solana-program/token 設定済みの @solana/kit クライアント:
import { getWithdrawExcessLamportsInstruction } from "@solana-program/token";
const instruction = getWithdrawExcessLamportsInstruction({
source,
destination,
authority,
});
await client.sendTransaction([instruction]);
こちら authority は TransactionSigner ソースに適したものを指定します。マルチシグ権限の場合は、その共同署名者を multiSigners。本番環境ではパッケージのバージョンを固定し、使用するクライアントの正確なリリースに対してコンパイルしてください。オンチェーンのアカウントコントラクトが変わらなくても、クライアントの型は変わる可能性があります。
ハードコードしないでください: 0.00203928 SOL をリザーブとして指定しないでください。これは標準的な 165 バイトのトークンアカウントに対する旧来の最低額であり、すべてのケースに適用できる現在の値ではありません。トランザクションを構築またはプレビューする直前に、ソースの実際のデータ長に対する現在の最低額を照会してください。
ここでは SPL Tokenと Token-2022 にどのような違いがありますか?
命令の主要な効果は同じですが、Token-2022 ではデータ長を仮定することが特に危険になります。ミントおよびアカウントの拡張機能によりシリアライズ後のサイズが大きくなるため、必要なリザーブも増加します。すべてのソースに対して標準の 82 バイトまたは 165 バイトのサイズを使用する統合では、余剰額を過大に見積もる可能性があります。
Token-2022 の CPI Guardは、ラッパーにおけるもう1つの実際の違いです。Guardがロックされていると、ウォレットが本来は有効な権限者であっても、クロスプログラム呼び出しが拒否されることがあります。Sol Incinerator は、確実に失敗する処理を大規模なクリーンアップトランザクションに含めるのではなく、そのようなソースをスキップします。
ネイティブのラップド SOL トークンアカウントは次のエラーで拒否されます: NativeNotSupported。ネイティブ SOL のアンラップには別のアカウント閉鎖経路を使用します。これは余剰ランポートの出金ではありません。
Sol Incinerator API は命令をどのようにラップしますか?
Sol Incinerator のv2 API はAssetcineratorを介してToken Programの呼び出しを構築するため、プロトコル手数料と任意のパートナー手数料がオンチェーンで強制されます。このラッパーは製品レイヤーであり、Token Programの生の命令自体が Sol Incinerator の手数料を課すわけではありません。
ユーザーに署名を求める前に、認証済みプレビューを使用してください。
curl -X POST https://v2.api.sol-incinerator.com/withdraw-excess-lamports/preview \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"userPublicKey": "DESTINATION_WALLET",
"sourceAccount": "TOKEN_ACCOUNT_MINT_OR_MULTISIG"
}'
関連するトランザクションおよび命令のルートは次のとおりです。
POST /withdraw-excess-lamportsPOST /withdraw-excess-lamports-instructions
userPublicKey は宛先ウォレットであり、デフォルトの権限者です。次を指定します: authorityPublicKey 別のミント、ソース、またはマルチシグ権限者が署名する必要がある場合。最大 11 を指定します。 multisigSignerPublicKeys トークンマルチシグのフローを構築する場合。すべての秘密鍵はローカルに保持され、API は必要な署名者が承認するためのデータを返します。
基本プロトコル手数料は 200 bps。直接統合する場合は、次を追加できます: partnerFeeAccount および partnerFeeBpsで、通常の Solana トランザクション手数料は別途かかります。返された feeLamports および回収額のフィールドを使用し、キャッシュ済みの割合計算を再利用しないでください。
統合において処理すべきエラーは何ですか?
- 余剰なし: ソース残高がすでに現在のリザーブと同額です。
- アカウント所有者またはレイアウトが不正: ソースがサポートされているToken Programアカウントではありません。
- 権限が無効: 指定された署名者が、デコードされたソースの状態と一致しません。
- マルチシグが不完全: 設定済みの有効な署名者が必要数に達していません。
- ネイティブアカウント: ラップド SOL には別の操作を使用します。
- ロックされた CPI Guard: Token-2022 がラッパーの CPI を拒否します。
- 状態が変更された: プレビュー後に残高、権限、またはレント設定が変更された。
- トランザクション費用が回収額を上回る: 少額の出金は、ネットワーク手数料を考慮すると割に合わない場合があります。
状態が変わった可能性がある場合は再度プレビューし、ソース選択の冪等性を維持し、対象外と判明しているソースを有効な処理と同じバッチに含めないでください。
