Fondsen Vrijgeven

Aangeroepen door een geprovisioneerde operator om tokens in escrow vrij te geven naar de Mainnet-wallet van een gebruiker, afhankelijk van een geldig Sparse Merkle Tree-uitsluitingsbewijs voor de opname-nonce.

Het escrow-programma migreert van dit Sparse Merkle Tree-ontwerp naar een on-chain nonce-bitmap (bijgehouden upstream). Deze pagina is accuraat ten opzichte van het huidige escrow-programma en wordt herzien zodra die wijziging wordt doorgevoerd.

Accounts

AccountSchrijfbaarOndertekenaarBeschrijving
payer✓✓Betaler van transactiekosten
operator✓Operator-ondertekenaar
instance✓Escrow-instantie PDA (root on-chain bijgewerkt)
operator_pdaOperator PDA die bewijst dat de ondertekenaar geprovisioneerd is
mintSPL-token mint
allowed_mintAllowedMint PDA – valideert dat de mint toegestaan is op deze instantie
user_ata✓associated token account van de ontvanger (bestemming)
instance_ata✓associated token account van de escrow (bron)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityEvent authority PDA voor EmitEvent CPI
private_channel_escrow_programEscrow-programma (zelfverwijzing voor CPI)

Parameters

ParameterTypeBeschrijving
amountu64Hoeveelheid tokens om vrij te geven
userPubkeyOntvangersportefeuille op Mainnet
new_withdrawal_root[u8; 32]Bijgewerkte SMT-root na opname van de nonce van deze opname
transaction_nonceu64Unieke nonce die dit opname-leaf in de SMT identificeert
sibling_proofs[u8; 512]16 sibling-hashes (elk 32 bytes) voor het SMT-uitsluitingsbewijs

Geeft terug

Geeft een TransactionBuilder terug die gebruikt kan worden om de transactie te bouwen en te verzenden.

Voorbeeld

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

Belangrijke opmerkingen

  • De aanroeper moet een geprovisioneerde operator zijn: operator_pda moet bestaan (aangemaakt door AddOperator); een ongeldige PDA gooit InvalidOperatorPda
  • sibling_proofs is exact 512 bytes (16 × 32-byte hashes, overeenkomend met de SMT- boomhoogte van 16)
  • new_withdrawal_root is de bijgewerkte SMT-root na opname van de nonce van deze opname. Bereken dit off-chain vóór de aanroep
  • transaction_nonce moet geldig zijn voor Instance.current_tree_index; een ongeldige nonce gooit InvalidTransactionNonceForCurrentTreeIndex
  • Het programma voert eerst verify_smt_exclusion_proof uit, waarmee wordt bewezen dat de nonce NOG NIET bestaat ten opzichte van de huidige root, en voert vervolgens een afzonderlijke verify_smt_inclusion_proof uit die bewijst dat de nonce WEL bestaat in de door de aanroeper geleverde new_withdrawal_root. Als een van beide controles mislukt, wordt InvalidSmtProof gegooid
  • Pas nadat beide controles zijn geslaagd, wordt Instance.withdrawal_transactions_root atomair bijgewerkt; de nonce kan niet opnieuw worden gebruikt
  • Verstuurt een event via EmitEvent CPI

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.