Rilascia Fondi

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

AccountScrivibileFirmatarioDescrizione
payer✓✓Pagatore delle commissioni
operator✓Firmatario dell'operatore
instance✓PDA dell'istanza escrow (root aggiornata on-chain)
operator_pdaPDA dell'operatore che attesta che il firmatario è abilitato
mintMint del token SPL
allowed_mintPDA 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_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityPDA dell'authority per gli eventi per il CPI EmitEvent
private_channel_escrow_programProgramma Escrow (auto-riferimento per CPI)

Parametri

ParametroTipoDescrizione
amountu64Quantità di token da rilasciare
userPubkeyWallet del destinatario su Mainnet
new_withdrawal_root[u8; 32]Root SMT aggiornata dopo l'inclusione del nonce di questo prelievo
transaction_nonceu64Nonce 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, // u64
siblingProofs: proofBytes // Uint8Array(512)
});

Note importanti

  • Il chiamante deve essere un operatore abilitato: operator_pda deve esistere (creato da AddOperator); un PDA non valido genera InvalidOperatorPda
  • 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 chiamata
  • transaction_nonce deve essere valido per Instance.current_tree_index; un nonce non valido genera InvalidTransactionNonceForCurrentTreeIndex
  • Il programma esegue prima verify_smt_exclusion_proof, provando che il nonce NON esiste ancora rispetto alla root corrente, poi esegue separatamente verify_smt_inclusion_proof provando che il nonce ESISTE nella new_withdrawal_root fornita dal chiamante. Il fallimento di uno dei due controlli genera InvalidSmtProof
  • Solo dopo che entrambi i controlli sono superati, Instance.withdrawal_transactions_root viene aggiornato in modo atomico; il nonce non può essere riutilizzato
  • Emette un evento tramite CPI EmitEvent

Is this page helpful?

Indice dei contenuti

Modifica pagina
© 2026 Solana Foundation. Tutti i diritti riservati.