자금 출금

프로비저닝된 오퍼레이터가 호출하며, 출금 논스에 대한 유효한 Sparse Merkle Tree 제외 증명을 조건으로 에스크로에 보관된 토큰을 사용자의 메인넷 지갑으로 출금합니다.

에스크로 프로그램은 현재의 Sparse Merkle Tree 설계에서 온체인 논스 비트맵 방식으로 마이그레이션 중입니다(업스트림에서 추적 중). 이 페이지는 현재 에스크로 프로그램을 기준으로 작성되었으며, 변경 사항이 적용되면 업데이트될 예정입니다.

계정

계정쓰기 가능서명자설명
payer✓✓수수료 납부자
operator✓오퍼레이터 서명자
instance✓에스크로 인스턴스 PDA (온체인에서 루트 업데이트됨)
operator_pda서명자가 프로비저닝되었음을 증명하는 오퍼레이터 PDA
mintSPL 토큰 민트
allowed_mintAllowedMint PDA - 해당 인스턴스에서 민트가 허용되는지 검증
user_ata✓수신자의 associated token account (목적지)
instance_ata✓에스크로의 associated token account (출처)
token_programSPL Token Program
associated_token_programAssociated Token Program
event_authorityEmitEvent CPI를 위한 이벤트 권한 PDA
private_channel_escrow_program에스크로 프로그램 (CPI를 위한 자기 참조)

파라미터

파라미터타입설명
amountu64출금할 토큰 수량
userPubkey메인넷의 수신자 지갑
new_withdrawal_root[u8; 32]이 출금의 논스를 포함한 후 업데이트된 SMT 루트
transaction_nonceu64SMT에서 이 출금 리프를 식별하는 고유 논스
sibling_proofs[u8; 512]SMT 제외 증명을 위한 16개의 형제 해시 (각 32바이트)

반환값

TransactionBuilder를 반환하며, 이를 사용하여 트랜잭션을 빌드하고 전송할 수 있습니다.

예제

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

중요 사항

  • 호출자는 프로비저닝된 오퍼레이터여야 합니다: operator_pda가 존재해야 하며 (AddOperator에 의해 생성됨); 유효하지 않은 PDA는 InvalidOperatorPda를 발생시킵니다
  • sibling_proofs는 정확히 512바이트여야 합니다 (16 × 32바이트 해시, SMT 트리 높이 16에 해당)
  • new_withdrawal_root는 이 출금의 논스를 포함한 후 업데이트된 SMT 루트입니다. 호출 전에 오프체인에서 계산하세요
  • transaction_nonce는 Instance.current_tree_index에 대해 유효해야 하며; 유효하지 않은 논스는 InvalidTransactionNonceForCurrentTreeIndex를 발생시킵니다
  • 프로그램은 먼저 verify_smt_exclusion_proof를 실행하여 해당 논스가 현재 루트에 아직 존재하지 않음을 증명하고, 이후 별도의 verify_smt_inclusion_proof를 실행하여 호출자가 제공한 new_withdrawal_root에 논스가 존재함을 증명합니다. 둘 중 하나라도 실패하면 InvalidSmtProof가 발생합니다
  • 두 검증이 모두 통과된 후에만 Instance.withdrawal_transactions_root가 원자적으로 업데이트되며, 논스는 재사용될 수 없습니다
  • EmitEvent CPI를 통해 이벤트를 발행합니다

Is this page helpful?

목차

페이지 편집