Giải Phóng Quỹ

Được gọi bởi một operator đã được cấp phép để giải phóng token escrow vào ví Mainnet của người dùng, phụ thuộc vào bằng chứng loại trừ Sparse Merkle Tree hợp lệ cho nonce rút tiền.

Chương trình escrow đang chuyển đổi từ thiết kế Sparse Merkle Tree này sang bitmap nonce on-chain (được theo dõi ở upstream). Trang này phản ánh chính xác chương trình escrow hiện tại và sẽ được cập nhật khi thay đổi đó được áp dụng.

Tài Khoản

Tài khoảnCó thể ghiNgười kýMô tả
payer✓✓Người trả phí
operator✓Người ký operator
instance✓PDA của instance escrow (root được cập nhật on-chain)
operator_pdaPDA của operator xác nhận người ký đã được cấp phép
mintSPL token mint
allowed_mintPDA AllowedMint - xác thực mint được phép trên instance này
user_ata✓associated token account của người nhận (đích)
instance_ata✓associated token account của escrow (nguồn)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityPDA quyền hạn sự kiện dành cho CPI EmitEvent
private_channel_escrow_programChương trình Escrow (tự tham chiếu cho CPI)

Tham Số

Tham sốKiểuMô tả
amountu64Số lượng token cần giải phóng
userPubkeyVí người nhận trên Mainnet
new_withdrawal_root[u8; 32]Root SMT được cập nhật sau khi bao gồm nonce của lần rút tiền này
transaction_nonceu64Nonce duy nhất xác định lá rút tiền này trong SMT
sibling_proofs[u8; 512]16 hash sibling (mỗi hash 32 byte) cho bằng chứng loại trừ SMT

Giá Trị Trả Về

Trả về một TransactionBuilder có thể được dùng để xây dựng và gửi giao dịch.

Ví Dụ

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)
});

Lưu Ý Quan Trọng

  • Người gọi phải là operator đã được cấp phép: operator_pda phải tồn tại (được tạo bởi AddOperator); PDA không hợp lệ sẽ ném lỗi InvalidOperatorPda
  • sibling_proofs có đúng 512 byte (16 × 32 byte hash, khớp với chiều cao cây SMT là 16)
  • new_withdrawal_root là root SMT được cập nhật sau khi bao gồm nonce của lần rút tiền này. Hãy tính toán ngoài chuỗi trước khi gọi
  • transaction_nonce phải hợp lệ đối với Instance.current_tree_index; nonce không hợp lệ sẽ ném lỗi InvalidTransactionNonceForCurrentTreeIndex
  • Chương trình trước tiên chạy verify_smt_exclusion_proof, chứng minh nonce CHƯA tồn tại so với root hiện tại, sau đó chạy riêng verify_smt_inclusion_proof chứng minh nonce ĐÃ tồn tại trong new_withdrawal_root do người gọi cung cấp. Nếu một trong hai kiểm tra thất bại sẽ ném lỗi InvalidSmtProof
  • Chỉ sau khi cả hai kiểm tra đều vượt qua thì Instance.withdrawal_transactions_root mới được cập nhật theo cách nguyên tử; nonce không thể được tái sử dụng
  • Phát ra một sự kiện thông qua CPI EmitEvent

Is this page helpful?

Mục lục

Chỉnh sửa trang