Gelder freigeben

Wird von einem bereitgestellten Operator aufgerufen, um hinterlegte Token an die Mainnet-Wallet eines Benutzers freizugeben, vorausgesetzt ein gültiger Sparse-Merkle-Tree-Ausschlussbeweis für den Auszahlungs-Nonce liegt vor.

Das Treuhandprogramm wird von diesem Sparse-Merkle-Tree-Design auf eine On-Chain-Nonce-Bitmap migriert (upstream verfolgt). Diese Seite ist korrekt bezüglich des aktuellen Treuhandprogramms und wird überarbeitet, sobald diese Änderung in Kraft tritt.

Konten

KontenBeschreibbarSignerBeschreibung
payer✓✓Gebührenzahler
operator✓Operator-Signer
instance✓Treuhand-Instanz-PDA (Root wird On-Chain aktualisiert)
operator_pdaOperator-PDA, der bestätigt, dass der Signer bereitgestellt ist
mintSPL-Token-Mint
allowed_mintAllowedMint-PDA – prüft, ob der Mint für diese Instanz zulässig ist
user_ata✓associated token account des Empfängers (Ziel)
instance_ata✓associated token account des Treuhandkontos (Quelle)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityEvent-Authority-PDA für EmitEvent-CPI
private_channel_escrow_programTreuhandprogramm (Selbstreferenz für CPI)

Parameter

ParameterTypBeschreibung
amountu64Anzahl der freizugebenden Token
userPubkeyEmpfänger-Wallet auf dem Mainnet
new_withdrawal_root[u8; 32]Aktualisierter SMT-Root nach Aufnahme des Nonce dieser Auszahlung
transaction_nonceu64Eindeutiger Nonce zur Identifikation dieses Auszahlungs-Blatts im SMT
sibling_proofs[u8; 512]16 Geschwister-Hashes (je 32 Bytes) für den SMT-Ausschlussbeweis

Rückgabewerte

Gibt einen TransactionBuilder zurück, der zum Erstellen und Senden der Transaktion verwendet werden kann.

Beispiel

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

Wichtige Hinweise

  • Der Aufrufer muss ein bereitgestellter Operator sein: operator_pda muss existieren (erstellt durch AddOperator); ein ungültiger PDA löst InvalidOperatorPda aus
  • sibling_proofs umfasst genau 512 Bytes (16 × 32-Byte-Hashes, entsprechend der SMT-Baumhöhe von 16)
  • new_withdrawal_root ist der aktualisierte SMT-Root nach Aufnahme des Nonce dieser Auszahlung. Berechnen Sie ihn Off-Chain, bevor Sie die Funktion aufrufen
  • transaction_nonce muss für Instance.current_tree_index gültig sein; ein ungültiger Nonce löst InvalidTransactionNonceForCurrentTreeIndex aus
  • Das Programm führt zunächst verify_smt_exclusion_proof aus und beweist, dass der Nonce gegenüber dem aktuellen Root noch NICHT existiert, und führt dann separat verify_smt_inclusion_proof aus, um zu beweisen, dass der Nonce im vom Aufrufer bereitgestellten new_withdrawal_root VORHANDEN ist. Schlägt eine der Prüfungen fehl, wird InvalidSmtProof ausgelöst
  • Erst nachdem beide Prüfungen bestanden wurden, wird Instance.withdrawal_transactions_root atomar aktualisiert; der Nonce kann nicht wiederverwendet werden
  • Löst ein Ereignis über EmitEvent-CPI aus

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.