Operator-only instruction that rotates the Sparse Merkle Tree by incrementing
Instance.current_tree_index and resetting the withdrawal root, allowing a new
epoch of 65,536 withdrawals.
The escrow program is migrating from this Sparse Merkle Tree design to an
on-chain nonce bitmap (tracked upstream), where this instruction becomes
RotateBitmap. This page is accurate against the current escrow program and
will be reworked once that change lands.
Accounts
| Account | Writable | Signer | Description |
|---|---|---|---|
payer | ✓ | ✓ | Fee payer |
operator | ✓ | Operator signer | |
instance | ✓ | Escrow instance PDA (current_tree_index incremented) | |
operator_pda | Operator PDA proving the signer is provisioned | ||
event_authority | Event authority PDA for EmitEvent CPI | ||
private_channel_escrow_program | Escrow Program (self-reference for CPI) |
Parameters
| Parameter | Type | Description |
|---|---|---|
expected_current_tree_index | u64 | Replay guard; must match Instance.current_tree_index or the call fails |
Returns
Returns a TransactionBuilder that can be used to build and send the
transaction.
Example
import { getResetSmtRootInstruction } from "../private-channel-escrow-program/clients/typescript/src/generated";const resetIx = getResetSmtRootInstruction({payer: operatorPayerSigner,operator: operatorSigner,instance: instancePda,operatorPda: operatorPdaAddress,eventAuthority: eventAuthorityPda,privateChannelEscrowProgram: ESCROW_PROGRAM_ID,expectedCurrentTreeIndex: currentTreeIndex // u64});
Important Notes
- Operator-only: requires a valid
operator_pda; throwsInvalidOperatorPdaotherwise expected_current_tree_indexmust equalInstance.current_tree_indexat call time; a stale value throwsUnexpectedTreeIndex, guarding against replaying a reset that already landed- Increments
Instance.current_tree_index; nonces valid in the previous tree epoch are invalidated after rotation - The
operator-private-channelservice calls this automatically whentransaction_nonce % 65536 == 0(andnonce > 0), signaling the start of a new epoch; it should not need to be called manually under normal operation - After rotation, the withdrawal root resets to the empty tree, so new withdrawals start from a fresh SMT
- Emits an event via
EmitEventCPI
Is this page helpful?