由已配置的运营者调用,在提供有效的稀疏默克尔树提款 nonce 排除证明的前提下,将托管代币释放至用户的主网钱包。
托管程序正在从当前的稀疏默克尔树设计迁移至链上 nonce 位图(上游跟踪中)。本页内容与当前托管程序保持一致,待该变更落地后将进行更新。
账户
| 账户 | 可写 | 签名者 | 描述 |
|---|---|---|---|
payer | ✓ | ✓ | 手续费付款方 |
operator | ✓ | 运营者签名者 | |
instance | ✓ | 托管实例 PDA(链上根已更新) | |
operator_pda | 运营者 PDA,用于证明签名者已获授权 | ||
mint | SPL 代币 mint | ||
allowed_mint | AllowedMint PDA — 验证该 mint 在此实例上是否被允许 | ||
user_ata | ✓ | 接收方的 associated token account(目标账户) | |
instance_ata | ✓ | 托管的 associated token account(来源账户) | |
token_program | SPL Token Program | ||
associated_token_program | Associated Token Program | ||
event_authority | EmitEvent CPI 的事件权限 PDA | ||
private_channel_escrow_program | 托管程序(CPI 自引用) |
参数
| 参数 | 类型 | 描述 |
|---|---|---|
amount | u64 | 待释放的代币数量 |
user | Pubkey | 主网上的接收方钱包 |
new_withdrawal_root | [u8; 32] | 包含本次提款 nonce 后的 SMT 根更新值 |
transaction_nonce | u64 | 在 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, // u64siblingProofs: 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 不可重复使用 - 通过
EmitEventCPI 发出事件
Is this page helpful?