Звільнення коштів

Викликається підготовленим оператором для звільнення токенів з ескроу до гаманця користувача в Mainnet, за умови наявності дійсного доказу виключення Sparse Merkle Tree для нонсу виведення.

Програма ескроу мігрує з цього дизайну на основі Sparse Merkle Tree до побітової карти нонсів на ланцюжку (відстежується вище за потоком). Ця сторінка відповідає поточній програмі ескроу і буде оновлена після внесення цих змін.

Акаунти

АкаунтЗаписуванийПідписувачОпис
payer✓✓Платник комісії
operator✓Підписувач-оператор
instance✓PDA екземпляра ескроу (корінь оновлюється на ланцюжку)
operator_pdaPDA оператора, що підтверджує підготовленість підписувача
mintMint SPL-токена
allowed_mintPDA AllowedMint — перевіряє, що mint дозволено в цьому екземплярі
user_ata✓associated token account одержувача (призначення)
instance_ata✓associated token account ескроу (джерело)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityPDA авторитету подій для CPI EmitEvent
private_channel_escrow_programПрограма ескроу (самопосилання для CPI)

Параметри

ПараметрТипОпис
amountu64Кількість токенів для звільнення
userPubkeyГаманець одержувача в Mainnet
new_withdrawal_root[u8; 32]Оновлений корінь SMT після включення нонсу цього виведення
transaction_nonceu64Унікальний нонс, що ідентифікує листок цього виведення в SMT
sibling_proofs[u8; 512]16 хешів сусідніх вузлів (по 32 байти кожен) для доказу виключення SMT

Повертає

Повертає 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 — це оновлений корінь SMT після включення нонсу цього виведення. Обчисліть його поза ланцюжком перед викликом
  • transaction_nonce має бути дійсним для Instance.current_tree_index; недійсний нонс викидає InvalidTransactionNonceForCurrentTreeIndex
  • Програма спочатку виконує verify_smt_exclusion_proof, підтверджуючи, що нонс ЩЕ НЕ існує відносно поточного кореня, а потім виконує окремий verify_smt_inclusion_proof, підтверджуючи, що нонс ВЖЕ існує у наданому викликачем new_withdrawal_root. Якщо будь-яка з перевірок не пройде, викидається InvalidSmtProof
  • Лише після проходження обох перевірок Instance.withdrawal_transactions_root оновлюється атомарно; нонс не може бути повторно використаний
  • Генерує подію через CPI EmitEvent

Is this page helpful?

Зміст

Редагувати сторінку