Fonları Serbest Bırak

Emanete alınmış token'ları kullanıcının Mainnet cüzdanına serbest bırakmak için sağlanmış bir operatör tarafından çağrılır; işlemin geçerliliği, çekim nonce'u için geçerli bir Seyrek Merkle Ağacı dışlama kanıtına bağlıdır.

Emanet programı, bu Seyrek Merkle Ağacı tasarımından zincir üstü bir nonce bitmap yapısına geçiş yapmaktadır (upstream'de takip edilmektedir). Bu sayfa mevcut emanet programını doğru biçimde yansıtmakta olup söz konusu değişiklik uygulandığında güncellenecektir.

Hesaplar

HesapYazılabilirİmzalayanAçıklama
payer✓✓Ücret ödeyici
operator✓Operatör imzalayan
instance✓Emanet örneği PDA'sı (kök zincir üstünde güncellenir)
operator_pdaİmzalayanın sağlandığını kanıtlayan Operatör PDA'sı
mintSPL token mint'i
allowed_mintAllowedMint PDA'sı - mint'in bu örnekte izinli olduğunu doğrular
user_ata✓Alıcının associated token account'u (hedef)
instance_ata✓Emanet associated token account'u (kaynak)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityEmitEvent CPI için olay yetkisi PDA'sı
private_channel_escrow_programEmanet Programı (CPI için öz-referans)

Parametreler

ParametreTürAçıklama
amountu64Serbest bırakılacak token miktarı
userPubkeyMainnet'teki alıcı cüzdanı
new_withdrawal_root[u8; 32]Bu çekimin nonce'u dahil edildikten sonra güncellenen SMT kökü
transaction_nonceu64SMT'deki bu çekim yaprağını tanımlayan benzersiz nonce
sibling_proofs[u8; 512]SMT dışlama kanıtı için 16 kardeş hash (her biri 32 bayt)

Dönüş Değeri

İşlemi oluşturmak ve göndermek için kullanılabilecek bir TransactionBuilder döndürür.

Örnek

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

Önemli Notlar

  • Çağıran tarafın sağlanmış bir operatör olması gerekir: operator_pda mevcut olmalıdır (AddOperator tarafından oluşturulmuş); geçersiz PDA InvalidOperatorPda hatasını fırlatır
  • sibling_proofs tam olarak 512 bayttır (16 × 32 baytlık hash, SMT ağaç yüksekliği olan 16 ile eşleşir)
  • new_withdrawal_root, bu çekimin nonce'u dahil edildikten sonra güncellenen SMT köküdür. Çağırmadan önce zincir dışında hesaplayın
  • transaction_nonce, Instance.current_tree_index için geçerli olmalıdır; geçersiz bir nonce InvalidTransactionNonceForCurrentTreeIndex hatasını fırlatır
  • Program önce verify_smt_exclusion_proof çalıştırarak nonce'un mevcut köke karşı henüz VAR OLMADIĞINI kanıtlar, ardından ayrı bir verify_smt_inclusion_proof çalıştırarak nonce'un çağıran tarafından sağlanan new_withdrawal_root içinde VAR OLDUĞUNU kanıtlar. Her iki kontrolden birinin başarısız olması InvalidSmtProof hatasını fırlatır
  • Yalnızca her iki kontrol de geçildikten sonra Instance.withdrawal_transactions_root atomik olarak güncellenir; nonce yeniden kullanılamaz
  • EmitEvent CPI aracılığıyla bir olay yayınlar

Is this page helpful?

İçindekiler

Sayfayı Düzenle
© 2026 Solana Vakfı. Tüm hakları saklıdır.