Chiamato da un operatore abilitato per rilasciare token in escrow al wallet Mainnet di un utente, subordinatamente a una prova di esclusione valida dello Sparse Merkle Tree per il nonce di prelievo.
Il programma di escrow sta migrando da questo design basato su Sparse Merkle Tree a una bitmap nonce on-chain (tracciata upstream). Questa pagina è accurata rispetto al programma di escrow attuale e verrà aggiornata una volta che tale modifica sarà applicata.
Account
| Account | Scrivibile | Firmatario | Descrizione |
|---|---|---|---|
payer | ✓ | ✓ | Pagatore delle commissioni |
operator | ✓ | Firmatario dell'operatore | |
instance | ✓ | PDA dell'istanza escrow (root aggiornata on-chain) | |
operator_pda | PDA dell'operatore che attesta che il firmatario è abilitato | ||
mint | Mint del token SPL | ||
allowed_mint | PDA AllowedMint - verifica che il mint sia autorizzato su questa istanza | ||
user_ata | ✓ | associated token account del destinatario (destinazione) | |
instance_ata | ✓ | associated token account dell'escrow (sorgente) | |
token_program | SPL Token Program | ||
associated_token_program | Associated Token Program | ||
event_authority | PDA dell'authority per gli eventi per il CPI EmitEvent | ||
private_channel_escrow_program | Programma Escrow (auto-riferimento per CPI) |
Parametri
| Parametro | Tipo | Descrizione |
|---|---|---|
amount | u64 | Quantità di token da rilasciare |
user | Pubkey | Wallet del destinatario su Mainnet |
new_withdrawal_root | [u8; 32] | Root SMT aggiornata dopo l'inclusione del nonce di questo prelievo |
transaction_nonce | u64 | Nonce univoco che identifica la foglia di questo prelievo nell'SMT |
sibling_proofs | [u8; 512] | 16 hash sibling (32 byte ciascuno) per la prova di esclusione SMT |
Valori restituiti
Restituisce un TransactionBuilder che può essere utilizzato per costruire e inviare la
transazione.
Esempio
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)});
Note importanti
- Il chiamante deve essere un operatore abilitato:
operator_pdadeve esistere (creato daAddOperator); un PDA non valido generaInvalidOperatorPda sibling_proofsè esattamente 512 byte (16 × 32 byte per hash, corrispondenti all'altezza dell'albero SMT pari a 16)new_withdrawal_rootè la root SMT aggiornata dopo l'inclusione del nonce di questo prelievo. Calcolala off-chain prima di effettuare la chiamatatransaction_noncedeve essere valido perInstance.current_tree_index; un nonce non valido generaInvalidTransactionNonceForCurrentTreeIndex- Il programma esegue prima
verify_smt_exclusion_proof, provando che il nonce NON esiste ancora rispetto alla root corrente, poi esegue separatamenteverify_smt_inclusion_proofprovando che il nonce ESISTE nellanew_withdrawal_rootfornita dal chiamante. Il fallimento di uno dei due controlli generaInvalidSmtProof - Solo dopo che entrambi i controlli sono superati,
Instance.withdrawal_transactions_rootviene aggiornato in modo atomico; il nonce non può essere riutilizzato - Emette un evento tramite CPI
EmitEvent
Is this page helpful?