释放资金

由已配置的运营者调用,在提供有效的稀疏默克尔树提款 nonce 排除证明的前提下,将托管代币释放至用户的主网钱包。

托管程序正在从当前的稀疏默克尔树设计迁移至链上 nonce 位图(上游跟踪中)。本页内容与当前托管程序保持一致,待该变更落地后将进行更新。

账户

账户可写签名者描述
payer✓✓手续费付款方
operator✓运营者签名者
instance✓托管实例 PDA(链上根已更新)
operator_pda运营者 PDA,用于证明签名者已获授权
mintSPL 代币 mint
allowed_mintAllowedMint PDA — 验证该 mint 在此实例上是否被允许
user_ata✓接收方的 associated token account(目标账户)
instance_ata✓托管的 associated token account(来源账户)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityEmitEvent CPI 的事件权限 PDA
private_channel_escrow_program托管程序(CPI 自引用)

参数

参数类型描述
amountu64待释放的代币数量
userPubkey主网上的接收方钱包
new_withdrawal_root[u8; 32]包含本次提款 nonce 后的 SMT 根更新值
transaction_nonceu64在 SMT 中唯一标识本次提款叶节点的 nonce
sibling_proofs[u8; 512]SMT 排除证明所需的 16 个兄弟哈希(每个 32 字节)

返回值

返回一个 TransactionBuilder,可用于构建并发送交易。

示例

import { getReleaseFundsInstruction } from "../private-channel-escrow-program/clients/typescript/src/generated";
const releaseIx = getReleaseFundsInstruction({
payer: operatorPayerSigner,
operator: operatorSigner,
instance: instancePda,
operatorPda: operatorPdaAddress,
mint: mintAddress,
allowedMint: allowedMintPda,
userAta: userAtaAddress,
instanceAta: instanceAtaAddress,
tokenProgram: TOKEN_PROGRAM_ID,
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,
eventAuthority: eventAuthorityPda,
privateChannelEscrowProgram: ESCROW_PROGRAM_ID,
amount: 1_000_000n,
user: recipientPublicKey,
newWithdrawalRoot: newSmtRoot, // [u8; 32]
transactionNonce: withdrawalNonce, // u64
siblingProofs: proofBytes // Uint8Array(512)
});

重要说明

  • 调用方必须是已授权的运营者:operator_pda 必须存在(由 AddOperator 创建);无效的 PDA 将抛出 InvalidOperatorPda
  • sibling_proofs 的长度恰好为 512 字节(16 × 32 字节哈希,与 SMT 树高度 16 匹配)
  • new_withdrawal_root 是包含本次提款 nonce 后的 SMT 根更新值,请在调用前在链下计算
  • transaction_nonce 必须对 Instance.current_tree_index 有效;无效的 nonce 将抛出 InvalidTransactionNonceForCurrentTreeIndex
  • 程序首先运行 verify_smt_exclusion_proof,证明该 nonce 在当前根中尚不存在;随后运行独立的 verify_smt_inclusion_proof,证明该 nonce 存在于调用方提供的 new_withdrawal_root 中。任一检查失败均将抛出 InvalidSmtProof
  • 仅在两项检查均通过后,Instance.withdrawal_transactions_root 才会原子性地更新;该 nonce 不可重复使用
  • 通过 EmitEvent CPI 发出事件

Is this page helpful?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有