Solana 上的 WithdrawExcessLamports:SPL Token 與 Token-2022 指南
價格與功能依據已查核 2026年9月3日.
WithdrawExcessLamports 是 Token Program 指令 38。它解決了一個特定的問題:鑄造帳戶、代幣帳戶或多簽帳戶可能持有超出免租所需的 lamports,但這些 lamports 無法透過一般的代幣轉帳來移動。
WithdrawExcessLamports 有什麼作用?
WithdrawExcessLamports 只會移動 Token Program 帳戶即時免租最低餘額以上的 SOL。來源帳戶會保持開啟,其代幣或鑄造資料也不會改變。必要簽署者取決於來源是代幣帳戶、鑄造帳戶或代幣多簽帳戶。
此指令同時適用於傳統 SPL Token Program 與 Token-2022。在 2026 租金提案之前,它可用於回收意外傳送至代幣程式所擁有帳戶的 lamports。租金最低額降低後,其用途更廣:舊帳戶可保留原有餘額,同時只需較少的準備金。
具權威性的行為說明與目前的用戶端範例位於 Solana 的 Withdraw Excess Lamports 說明文件。處理器實作也 已公開於 Token Program 儲存庫.
此指令需要哪些帳戶?
| 帳戶 | 可寫入? | 簽署者? | 用途 |
|---|---|---|---|
source | 是 | 有時需要 | 持有多餘 lamports 的代幣帳戶、鑄造帳戶或多簽帳戶 |
destination | 是 | 否 | 接收提領的 lamports |
authority | 否 | 視來源類型而定 | 證明提領權限 |
multiSigners | 否 | 使用時需要 | 滿足已設定的代幣多簽門檻 |
處理器會讀取來源的資料長度與目前租金設定、計算最低餘額,再轉移差額。它不接受可能已過時或遭操控的呼叫方提供之準備金。
各種來源類型必須由誰簽署?
| 來源 | 必要權限 |
|---|---|
| 由錢包擁有的代幣帳戶 | 代幣帳戶擁有者 |
| 由代幣多簽帳戶擁有的代幣帳戶 | 需要 N 位中的 M- 位多簽成員 |
| 具有有效鑄造權限的鑄造帳戶 | 目前鑄造權限 |
| 沒有鑄造權限的鑄造帳戶 | 來源鑄造帳戶本身 |
| 多簽來源帳戶 | 已設定 N 位中的 M- 位成員 |
鑄造權限已撤銷的情況需要特別留意。若來源鑄造帳戶由曲線上金鑰對建立,就必須由該原始金鑰對簽署。若其位於曲線外,控制該帳戶的程式必須使用正確的 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 是包裝層的另一項實務差異。Guard 鎖定時,即使錢包原本是有效權限,跨程式呼叫仍可能遭到拒絕。Sol Incinerator 會略過這些來源,避免將必定失敗的操作放入較大型的清理交易中。
原生封裝的 SOL 代幣帳戶會遭到拒絕,並顯示 NativeNotSupported。解封原生 SOL 使用的是另一種關閉帳戶流程,不屬於多餘 lamports 的提領。
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。
- 狀態已變更: 預覽後,餘額、權限或租金設定有所變更。
- 交易成本高於價值: 扣除網路費用後,小額提領可能不具經濟效益。
狀態可能變更時應重新預覽、確保來源選取具冪等性,且切勿將已知不符合資格的來源與其他有效操作放入同一批次。
相關閱讀
常見問題
WithdrawExcessLamports 在 Solana 上有什麼作用?
WithdrawExcessLamports 會將 Token Program 帳戶目前免租最低額以上的 lamports 轉移至目的地錢包。來源可以是代幣帳戶、鑄造帳戶或多簽帳戶。此指令不會變更代幣數量、鑄造供應量、權限、擴充功能及其他所有序列化帳戶資料。
WithdrawExcessLamports 應由哪個權限簽署?
代幣帳戶須由其擁有者或已設定的多簽簽署者簽署。具有有效鑄造權限的鑄造帳戶須由該權限簽署。沒有鑄造權限的鑄造帳戶則須由來源帳戶本身簽署,方式是使用其金鑰對,或由控制曲線外鑄造帳戶的程式透過 CPI 簽署路徑進行簽署。
WithdrawExcessLamports 支援 Token-2022 嗎?
可以。此指令適用於傳統 SPL Token 與 Token-2022 帳戶、鑄造帳戶及多簽帳戶。整合必須根據來源的實際資料長度計算租金,因為 Token-2022 擴充功能可能使帳戶更大,而鎖定的 CPI Guard 可能阻止透過包裝層執行。
WithdrawExcessLamports 會使代幣帳戶餘額低於免租門檻嗎?
不會。Token Program 會計算來源帳戶所需的最低餘額,並只轉移超出的差額。原生封裝的 SOL 代幣帳戶會遭到拒絕。應用程式仍應預覽即時狀態,因為帳戶餘額、資料長度、租金設定及可用權限在提交前都可能變動。
