Zwolnij środki

Wywoływana przez autoryzowanego operatora w celu zwolnienia zablokowanych tokenów na portfel użytkownika w sieci Mainnet, po spełnieniu warunku ważnego dowodu wykluczenia Sparse Merkle Tree dla nonce wypłaty.

Program escrow jest migrowany z tego projektu opartego na Sparse Merkle Tree do bitmapowego nonce on-chain (śledzony upstream). Ta strona jest zgodna z aktualnym programem escrow i zostanie zaktualizowana po wprowadzeniu tej zmiany.

Konta

KontoZapisywalnePodpisującyOpis
payer✓✓Płatnik opłat
operator✓Podpisujący operator
instance✓PDA instancji escrow (root aktualizowany on-chain)
operator_pdaPDA operatora potwierdzający, że podpisujący jest autoryzowany
mintMint tokena SPL
allowed_mintPDA AllowedMint – weryfikuje, czy mint jest dozwolony w tej instancji
user_ata✓associated token account odbiorcy (miejsce docelowe)
instance_ata✓associated token account escrow (źródło)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityPDA authority zdarzenia dla CPI EmitEvent
private_channel_escrow_programProgram Escrow (odwołanie własne dla CPI)

Parametry

ParametrTypOpis
amountu64Liczba tokenów do zwolnienia
userPubkeyPortfel odbiorcy w sieci Mainnet
new_withdrawal_root[u8; 32]Zaktualizowany root SMT po uwzględnieniu nonce tej wypłaty
transaction_nonceu64Unikalny nonce identyfikujący ten liść wypłaty w SMT
sibling_proofs[u8; 512]16 skrótów rodzeństwa (po 32 bajty każdy) dla dowodu wykluczenia SMT

Zwraca

Zwraca obiekt TransactionBuilder, który można wykorzystać do zbudowania i wysłania transakcji.

Przykład

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

Ważne uwagi

  • Wywołujący musi być autoryzowanym operatorem: operator_pda musi istnieć (utworzony przez AddOperator); nieprawidłowy PDA zgłasza błąd InvalidOperatorPda
  • sibling_proofs ma dokładnie 512 bajtów (16 × 32-bajtowe skróty, odpowiadające wysokości drzewa SMT wynoszącej 16)
  • new_withdrawal_root to zaktualizowany root SMT po uwzględnieniu nonce tej wypłaty. Oblicz go off-chain przed wywołaniem
  • transaction_nonce musi być prawidłowy dla Instance.current_tree_index; nieprawidłowy nonce zgłasza błąd InvalidTransactionNonceForCurrentTreeIndex
  • Program najpierw wykonuje verify_smt_exclusion_proof, udowadniając, że nonce NIE istnieje jeszcze względem bieżącego roota, a następnie wykonuje oddzielne verify_smt_inclusion_proof udowadniające, że nonce ISTNIEJE w podanym przez wywołującego new_withdrawal_root. Niepowodzenie któregokolwiek sprawdzenia zgłasza błąd InvalidSmtProof
  • Dopiero po pomyślnym przejściu obu sprawdzeń Instance.withdrawal_transactions_root jest aktualizowany atomowo; nonce nie może być ponownie użyty
  • Emituje zdarzenie poprzez CPI EmitEvent

Is this page helpful?

Spis treści

Edytuj stronę