資金のリリース

プロビジョニングされたオペレーターによって呼び出され、出金ノンスに対する有効なSparse Merkle Tree除外証明を条件として、エスクローされたトークンをユーザーのMainnetウォレットにリリースします。

エスクロープログラムは、この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リリースするトークンの数量
userPubkeyMainnet上の受取人ウォレット
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バイトです(SMTのツリーの高さ16に対応する16 × 32バイトのハッシュ)。
  • 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?

目次

ページを編集
© 2026 Solana Foundation. 無断転載を禁じます。