@ocash/sdk 0.1.4-rc.0 → 0.1.4-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -203,6 +203,13 @@ interface OCashSdkConfig {
203
203
  * Merkle depth used by the on-chain tree (defaults to 32).
204
204
  */
205
205
  treeDepth?: number;
206
+ /**
207
+ * Optional callback to read `merkleRoots(rootIndex)` from the on-chain contract.
208
+ * When provided, each batch merge is verified against the contract root.
209
+ * Return null if the contract hasn't committed this index yet (treated as "skip").
210
+ * A zero root (0x000...0) is also treated as "not yet committed".
211
+ */
212
+ readContractRoot?: (chainId: number, rootIndex: number) => Promise<Hex | null>;
206
213
  };
207
214
  sync?: {
208
215
  pageSize?: number;
@@ -634,19 +641,26 @@ type ListUtxosResult = {
634
641
  total: number;
635
642
  rows: UtxoRecord[];
636
643
  };
637
- /** Persisted merkle tree state metadata. */
638
- type MerkleTreeState = {
639
- /** Chain id (scoped). */
644
+ /** ChairmanMerkle tree (persistent segment tree) node. */
645
+ type ChairmanMerkleNodeRecord = {
640
646
  chainId: number;
641
- /** Current tree root (for the merged/main tree). */
642
- root: Hex;
643
- /**
644
- * Total elements that have been merged into the main tree.
645
- * This matches `totalElementsInTree(contract.totalElements, tempArraySize)`.
646
- */
647
- totalElements: number;
648
- /** Last updated timestamp (ms). */
649
- lastUpdated: number;
647
+ /** Unique node ID. Main tree: `cm-{version}-{level}`, subtree internal: `st-{level}-{position}` */
648
+ id: string;
649
+ hash: Hex;
650
+ /** Left child node ID (null for leaf/subtree nodes). */
651
+ leftId: string | null;
652
+ /** Right child node ID (null for leaf/subtree nodes). */
653
+ rightId: string | null;
654
+ };
655
+ /** ChairmanMerkle tree version — maps a mergedElements count to a persistent root. */
656
+ type ChairmanMerkleVersionRecord = {
657
+ chainId: number;
658
+ /** Version = mergedElements count (0, 32, 64, …). */
659
+ version: number;
660
+ /** Root node ID for this version. */
661
+ rootId: string;
662
+ /** Root hash (cached for quick lookup without traversal). */
663
+ rootHash: Hex;
650
664
  };
651
665
  /** Persisted merkle leaf record. */
652
666
  type MerkleLeafRecord = {
@@ -654,19 +668,6 @@ type MerkleLeafRecord = {
654
668
  cid: number;
655
669
  commitment: Hex;
656
670
  };
657
- /** Persisted merkle node record. */
658
- type MerkleNodeRecord = {
659
- chainId: number;
660
- /**
661
- * Node id.
662
- * - Normal node: `${level}-${position}`
663
- * - Frontier node: `frontier-${level}`
664
- */
665
- id: string;
666
- level: number;
667
- position: number;
668
- hash: Hex;
669
- };
670
671
  /** Storage adapter interface for persistence. */
671
672
  interface StorageAdapter {
672
673
  /**
@@ -739,11 +740,19 @@ interface StorageAdapter {
739
740
  */
740
741
  getMerkleLeaf?(chainId: number, cid: number): Promise<MerkleLeafRecord | undefined>;
741
742
  /**
742
- * Optional Merkle DB: node lookup by id (fast path for proof generation and incremental updates).
743
+ * ChairmanMerkle tree (persistent segment tree) node storage.
744
+ * Used for both main-tree versioned nodes and subtree internal nodes.
743
745
  */
744
- getMerkleNode?(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
745
- upsertMerkleNodes?(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
746
- clearMerkleNodes?(chainId: number): Promise<void>;
746
+ getChairmanMerkleNode?(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
747
+ putChairmanMerkleNodes?(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
748
+ /**
749
+ * ChairmanMerkle tree version storage.
750
+ * Each version maps a mergedElements count to a persistent root.
751
+ */
752
+ getChairmanMerkleVersion?(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
753
+ getLatestChairmanMerkleVersion?(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
754
+ putChairmanMerkleVersion?(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
755
+ clearChairmanMerkleTree?(chainId: number): Promise<void>;
747
756
  /**
748
757
  * Optional entry memo persistence (raw EntryService payloads).
749
758
  * Useful for debugging, rebuilds, and app-like local caches.
@@ -758,13 +767,6 @@ interface StorageAdapter {
758
767
  upsertEntryNullifiers?(nullifiers: EntryNullifierRecord[]): Promise<void> | void;
759
768
  listEntryNullifiers?(query: ListEntryNullifiersQuery): Promise<ListEntryNullifiersResult>;
760
769
  clearEntryNullifiers?(chainId: number): Promise<void> | void;
761
- /**
762
- * Optional merkle tree state persistence (merged/main-tree only).
763
- * This mirrors the client/app `MerkleDexie.trees` metadata.
764
- */
765
- getMerkleTree?(chainId: number): Promise<MerkleTreeState | undefined>;
766
- setMerkleTree?(chainId: number, tree: MerkleTreeState): Promise<void>;
767
- clearMerkleTree?(chainId: number): Promise<void>;
768
770
  }
769
771
  /** WASM & circuit initialization. Call `ready()` before any proof operations. */
770
772
  /** Core API for WASM initialization and eventing. */
@@ -2796,8 +2798,8 @@ declare class MemoryStore implements StorageAdapter {
2796
2798
  private readonly utxos;
2797
2799
  private operations;
2798
2800
  private readonly merkleLeavesByChain;
2799
- private readonly merkleTreesByChain;
2800
- private readonly merkleNodesByChain;
2801
+ private readonly chairmanMerkleVersionsByChain;
2802
+ private readonly chairmanMerkleNodesByChain;
2801
2803
  private readonly entryMemosByChain;
2802
2804
  private readonly entryNullifiersByChain;
2803
2805
  private readonly maxOperations;
@@ -2870,29 +2872,29 @@ declare class MemoryStore implements StorageAdapter {
2870
2872
  */
2871
2873
  getMerkleLeaf(chainId: number, cid: number): Promise<MerkleLeafRecord | undefined>;
2872
2874
  /**
2873
- * Get a merkle node by id.
2875
+ * Get a chairmanMerkle tree node by id.
2874
2876
  */
2875
- getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
2877
+ getChairmanMerkleNode(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
2876
2878
  /**
2877
- * Upsert merkle nodes for a chain.
2879
+ * Put chairmanMerkle tree nodes for a chain.
2878
2880
  */
2879
- upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
2881
+ putChairmanMerkleNodes(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
2880
2882
  /**
2881
- * Clear merkle nodes for a chain.
2883
+ * Get a chairmanMerkle version record by chain and version number.
2882
2884
  */
2883
- clearMerkleNodes(chainId: number): Promise<void>;
2885
+ getChairmanMerkleVersion(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
2884
2886
  /**
2885
- * Get persisted merkle tree state.
2887
+ * Get the latest chairmanMerkle version record (highest version number) for a chain.
2886
2888
  */
2887
- getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined>;
2889
+ getLatestChairmanMerkleVersion(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
2888
2890
  /**
2889
- * Persist merkle tree state.
2891
+ * Persist a chairmanMerkle version record.
2890
2892
  */
2891
- setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void>;
2893
+ putChairmanMerkleVersion(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
2892
2894
  /**
2893
- * Clear merkle tree state.
2895
+ * Clear all chairmanMerkle tree state (both nodes and versions) for a chain.
2894
2896
  */
2895
- clearMerkleTree(chainId: number): Promise<void>;
2897
+ clearChairmanMerkleTree(chainId: number): Promise<void>;
2896
2898
  /**
2897
2899
  * Upsert entry memos (raw EntryService cache).
2898
2900
  */
@@ -3010,13 +3012,14 @@ declare class KeyValueStore implements StorageAdapter {
3010
3012
  private readonly utxoCache;
3011
3013
  private readonly operationCache;
3012
3014
  private merkleLeafCids;
3013
- private merkleTrees;
3014
- private merkleNodeIds;
3015
+ private chairmanMerkleLatestVersions;
3016
+ private chairmanMerkleNodeIds;
3017
+ private chairmanMerkleVersionNums;
3015
3018
  private entryMemoCids;
3016
3019
  private entryNullifierNids;
3017
3020
  private readonly loadedMerkleLeaves;
3018
- private readonly loadedMerkleTrees;
3019
- private readonly loadedMerkleNodes;
3021
+ private readonly loadedChairmanMerkleVersions;
3022
+ private readonly loadedChairmanMerkleNodes;
3020
3023
  private readonly loadedEntryMemos;
3021
3024
  private readonly loadedEntryNullifiers;
3022
3025
  private saveChain;
@@ -3033,7 +3036,6 @@ declare class KeyValueStore implements StorageAdapter {
3033
3036
  private walletCursorKey;
3034
3037
  private walletUtxoKey;
3035
3038
  private walletOperationKey;
3036
- private sharedChainKey;
3037
3039
  private sharedChainMetaKey;
3038
3040
  private sharedRecordKey;
3039
3041
  private parseJson;
@@ -3052,16 +3054,16 @@ declare class KeyValueStore implements StorageAdapter {
3052
3054
  private readUtxo;
3053
3055
  private pruneOperationIds;
3054
3056
  private ensureMerkleLeavesLoaded;
3055
- private ensureMerkleTreeLoaded;
3056
- private ensureMerkleNodesLoaded;
3057
+ private ensureChairmanMerkleVersionsLoaded;
3058
+ private ensureChairmanMerkleNodesLoaded;
3057
3059
  private ensureEntryMemosLoaded;
3058
3060
  private ensureEntryNullifiersLoaded;
3059
- getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
3060
- upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
3061
- clearMerkleNodes(chainId: number): Promise<void>;
3062
- getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined>;
3063
- setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void>;
3064
- clearMerkleTree(chainId: number): Promise<void>;
3061
+ getChairmanMerkleNode(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
3062
+ putChairmanMerkleNodes(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
3063
+ getChairmanMerkleVersion(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
3064
+ getLatestChairmanMerkleVersion(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
3065
+ putChairmanMerkleVersion(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
3066
+ clearChairmanMerkleTree(chainId: number): Promise<void>;
3065
3067
  upsertEntryMemos(memos: EntryMemoRecord[]): Promise<void>;
3066
3068
  listEntryMemos(query: ListEntryMemosQuery): Promise<{
3067
3069
  total: number;
@@ -3166,4 +3168,4 @@ declare const OcashSdk: {
3166
3168
  readonly MemoryStore: typeof MemoryStore;
3167
3169
  };
3168
3170
 
3169
- export { SEPOLIA_TESTNET as $, App_ABI as A, BABYJUBJUB_SCALAR_FIELD as B, type ChainConfigInput as C, type DepositOperation as D, type EntryMemoRecord as E, LedgerInfo as F, MemoKit as G, type Hex as H, MemoryStore as I, type MerkleLeafRecord as J, KeyManager as K, type ListEntryMemosQuery as L, type MerkleNodeRecord as M, type OCashSdk as N, type OperationType as O, type OCashSdkConfig as P, type OperationCreateInput as Q, type OpsApi as R, type StorageAdapter as S, type PlannerEstimateTransferResult as T, type UtxoRecord as U, type PlannerEstimateWithdrawResult as V, type ProofResult as W, RedisStore as X, type RedisStoreOptions as Y, type RelayerRequest as Z, SEPOLIA_DEV as _, type MerkleTreeState as a, type SdkEvent as a0, type SyncChainStatus as a1, type TokenMetadata as a2, type TransactionReceipt as a3, type TransferOperation as a4, type TransferOperationDetail as a5, type TransferWitnessInput as a6, Utils as a7, type WalletSessionInput as a8, type WithdrawOperation as a9, type WithdrawOperationDetail as aa, type WithdrawWitnessInput as ab, type WitnessBuildResult as ac, type WitnessContext as ad, assertChainConfigInput as ae, assertTokenList as af, assertTokenMetadata as ag, calcTransferProofBinding as ah, calcWithdrawProofBinding as ai, createSdk as aj, OcashSdk as ak, defaultAssetsOverrideMainnet as al, defaultAssetsOverrideTestnet as am, fetchPoolTokensFromContract as an, normalizeTokenMetadata as ao, type EntryNullifierRecord as b, type ListEntryNullifiersQuery as c, type SyncCursor as d, type ListUtxosQuery as e, type StoredOperation as f, type OperationDetailFor as g, type OperationStatus as h, type ListOperationsQuery as i, type AssetOverrideEntry as j, type AssetsOverride as k, BASE_DEV as l, BASE_MAINNET as m, BSC_DEV as n, BSC_MAINNET as o, BSC_TESTNET as p, BSC_TESTNET_DEV as q, type CommitmentData as r, CryptoToolkit as s, type DepositOperationDetail as t, DummyFactory as u, ETH_DEV as v, ETH_MAINNET as w, type KeyValueClient as x, KeyValueStore as y, type KeyValueStoreOptions as z };
3171
+ export { SEPOLIA_TESTNET as $, App_ABI as A, BABYJUBJUB_SCALAR_FIELD as B, type ChairmanMerkleNodeRecord as C, type DepositOperation as D, type EntryMemoRecord as E, type KeyValueStoreOptions as F, LedgerInfo as G, type Hex as H, MemoryStore as I, type MerkleLeafRecord as J, KeyManager as K, type ListEntryMemosQuery as L, MemoKit as M, type OCashSdk as N, type OperationType as O, type OCashSdkConfig as P, type OperationCreateInput as Q, type OpsApi as R, type StorageAdapter as S, type PlannerEstimateTransferResult as T, type UtxoRecord as U, type PlannerEstimateWithdrawResult as V, type ProofResult as W, RedisStore as X, type RedisStoreOptions as Y, type RelayerRequest as Z, SEPOLIA_DEV as _, type ChairmanMerkleVersionRecord as a, type SdkEvent as a0, type SyncChainStatus as a1, type TokenMetadata as a2, type TransactionReceipt as a3, type TransferOperation as a4, type TransferOperationDetail as a5, type TransferWitnessInput as a6, Utils as a7, type WalletSessionInput as a8, type WithdrawOperation as a9, type WithdrawOperationDetail as aa, type WithdrawWitnessInput as ab, type WitnessBuildResult as ac, type WitnessContext as ad, assertChainConfigInput as ae, assertTokenList as af, assertTokenMetadata as ag, calcTransferProofBinding as ah, calcWithdrawProofBinding as ai, createSdk as aj, OcashSdk as ak, defaultAssetsOverrideMainnet as al, defaultAssetsOverrideTestnet as am, fetchPoolTokensFromContract as an, normalizeTokenMetadata as ao, type EntryNullifierRecord as b, type ListEntryNullifiersQuery as c, type SyncCursor as d, type ListUtxosQuery as e, type StoredOperation as f, type OperationDetailFor as g, type OperationStatus as h, type ListOperationsQuery as i, type AssetOverrideEntry as j, type AssetsOverride as k, BASE_DEV as l, BASE_MAINNET as m, BSC_DEV as n, BSC_MAINNET as o, BSC_TESTNET as p, BSC_TESTNET_DEV as q, type ChainConfigInput as r, type CommitmentData as s, CryptoToolkit as t, type DepositOperationDetail as u, DummyFactory as v, ETH_DEV as w, ETH_MAINNET as x, type KeyValueClient as y, KeyValueStore as z };
@@ -203,6 +203,13 @@ interface OCashSdkConfig {
203
203
  * Merkle depth used by the on-chain tree (defaults to 32).
204
204
  */
205
205
  treeDepth?: number;
206
+ /**
207
+ * Optional callback to read `merkleRoots(rootIndex)` from the on-chain contract.
208
+ * When provided, each batch merge is verified against the contract root.
209
+ * Return null if the contract hasn't committed this index yet (treated as "skip").
210
+ * A zero root (0x000...0) is also treated as "not yet committed".
211
+ */
212
+ readContractRoot?: (chainId: number, rootIndex: number) => Promise<Hex | null>;
206
213
  };
207
214
  sync?: {
208
215
  pageSize?: number;
@@ -634,19 +641,26 @@ type ListUtxosResult = {
634
641
  total: number;
635
642
  rows: UtxoRecord[];
636
643
  };
637
- /** Persisted merkle tree state metadata. */
638
- type MerkleTreeState = {
639
- /** Chain id (scoped). */
644
+ /** ChairmanMerkle tree (persistent segment tree) node. */
645
+ type ChairmanMerkleNodeRecord = {
640
646
  chainId: number;
641
- /** Current tree root (for the merged/main tree). */
642
- root: Hex;
643
- /**
644
- * Total elements that have been merged into the main tree.
645
- * This matches `totalElementsInTree(contract.totalElements, tempArraySize)`.
646
- */
647
- totalElements: number;
648
- /** Last updated timestamp (ms). */
649
- lastUpdated: number;
647
+ /** Unique node ID. Main tree: `cm-{version}-{level}`, subtree internal: `st-{level}-{position}` */
648
+ id: string;
649
+ hash: Hex;
650
+ /** Left child node ID (null for leaf/subtree nodes). */
651
+ leftId: string | null;
652
+ /** Right child node ID (null for leaf/subtree nodes). */
653
+ rightId: string | null;
654
+ };
655
+ /** ChairmanMerkle tree version — maps a mergedElements count to a persistent root. */
656
+ type ChairmanMerkleVersionRecord = {
657
+ chainId: number;
658
+ /** Version = mergedElements count (0, 32, 64, …). */
659
+ version: number;
660
+ /** Root node ID for this version. */
661
+ rootId: string;
662
+ /** Root hash (cached for quick lookup without traversal). */
663
+ rootHash: Hex;
650
664
  };
651
665
  /** Persisted merkle leaf record. */
652
666
  type MerkleLeafRecord = {
@@ -654,19 +668,6 @@ type MerkleLeafRecord = {
654
668
  cid: number;
655
669
  commitment: Hex;
656
670
  };
657
- /** Persisted merkle node record. */
658
- type MerkleNodeRecord = {
659
- chainId: number;
660
- /**
661
- * Node id.
662
- * - Normal node: `${level}-${position}`
663
- * - Frontier node: `frontier-${level}`
664
- */
665
- id: string;
666
- level: number;
667
- position: number;
668
- hash: Hex;
669
- };
670
671
  /** Storage adapter interface for persistence. */
671
672
  interface StorageAdapter {
672
673
  /**
@@ -739,11 +740,19 @@ interface StorageAdapter {
739
740
  */
740
741
  getMerkleLeaf?(chainId: number, cid: number): Promise<MerkleLeafRecord | undefined>;
741
742
  /**
742
- * Optional Merkle DB: node lookup by id (fast path for proof generation and incremental updates).
743
+ * ChairmanMerkle tree (persistent segment tree) node storage.
744
+ * Used for both main-tree versioned nodes and subtree internal nodes.
743
745
  */
744
- getMerkleNode?(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
745
- upsertMerkleNodes?(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
746
- clearMerkleNodes?(chainId: number): Promise<void>;
746
+ getChairmanMerkleNode?(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
747
+ putChairmanMerkleNodes?(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
748
+ /**
749
+ * ChairmanMerkle tree version storage.
750
+ * Each version maps a mergedElements count to a persistent root.
751
+ */
752
+ getChairmanMerkleVersion?(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
753
+ getLatestChairmanMerkleVersion?(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
754
+ putChairmanMerkleVersion?(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
755
+ clearChairmanMerkleTree?(chainId: number): Promise<void>;
747
756
  /**
748
757
  * Optional entry memo persistence (raw EntryService payloads).
749
758
  * Useful for debugging, rebuilds, and app-like local caches.
@@ -758,13 +767,6 @@ interface StorageAdapter {
758
767
  upsertEntryNullifiers?(nullifiers: EntryNullifierRecord[]): Promise<void> | void;
759
768
  listEntryNullifiers?(query: ListEntryNullifiersQuery): Promise<ListEntryNullifiersResult>;
760
769
  clearEntryNullifiers?(chainId: number): Promise<void> | void;
761
- /**
762
- * Optional merkle tree state persistence (merged/main-tree only).
763
- * This mirrors the client/app `MerkleDexie.trees` metadata.
764
- */
765
- getMerkleTree?(chainId: number): Promise<MerkleTreeState | undefined>;
766
- setMerkleTree?(chainId: number, tree: MerkleTreeState): Promise<void>;
767
- clearMerkleTree?(chainId: number): Promise<void>;
768
770
  }
769
771
  /** WASM & circuit initialization. Call `ready()` before any proof operations. */
770
772
  /** Core API for WASM initialization and eventing. */
@@ -2796,8 +2798,8 @@ declare class MemoryStore implements StorageAdapter {
2796
2798
  private readonly utxos;
2797
2799
  private operations;
2798
2800
  private readonly merkleLeavesByChain;
2799
- private readonly merkleTreesByChain;
2800
- private readonly merkleNodesByChain;
2801
+ private readonly chairmanMerkleVersionsByChain;
2802
+ private readonly chairmanMerkleNodesByChain;
2801
2803
  private readonly entryMemosByChain;
2802
2804
  private readonly entryNullifiersByChain;
2803
2805
  private readonly maxOperations;
@@ -2870,29 +2872,29 @@ declare class MemoryStore implements StorageAdapter {
2870
2872
  */
2871
2873
  getMerkleLeaf(chainId: number, cid: number): Promise<MerkleLeafRecord | undefined>;
2872
2874
  /**
2873
- * Get a merkle node by id.
2875
+ * Get a chairmanMerkle tree node by id.
2874
2876
  */
2875
- getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
2877
+ getChairmanMerkleNode(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
2876
2878
  /**
2877
- * Upsert merkle nodes for a chain.
2879
+ * Put chairmanMerkle tree nodes for a chain.
2878
2880
  */
2879
- upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
2881
+ putChairmanMerkleNodes(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
2880
2882
  /**
2881
- * Clear merkle nodes for a chain.
2883
+ * Get a chairmanMerkle version record by chain and version number.
2882
2884
  */
2883
- clearMerkleNodes(chainId: number): Promise<void>;
2885
+ getChairmanMerkleVersion(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
2884
2886
  /**
2885
- * Get persisted merkle tree state.
2887
+ * Get the latest chairmanMerkle version record (highest version number) for a chain.
2886
2888
  */
2887
- getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined>;
2889
+ getLatestChairmanMerkleVersion(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
2888
2890
  /**
2889
- * Persist merkle tree state.
2891
+ * Persist a chairmanMerkle version record.
2890
2892
  */
2891
- setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void>;
2893
+ putChairmanMerkleVersion(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
2892
2894
  /**
2893
- * Clear merkle tree state.
2895
+ * Clear all chairmanMerkle tree state (both nodes and versions) for a chain.
2894
2896
  */
2895
- clearMerkleTree(chainId: number): Promise<void>;
2897
+ clearChairmanMerkleTree(chainId: number): Promise<void>;
2896
2898
  /**
2897
2899
  * Upsert entry memos (raw EntryService cache).
2898
2900
  */
@@ -3010,13 +3012,14 @@ declare class KeyValueStore implements StorageAdapter {
3010
3012
  private readonly utxoCache;
3011
3013
  private readonly operationCache;
3012
3014
  private merkleLeafCids;
3013
- private merkleTrees;
3014
- private merkleNodeIds;
3015
+ private chairmanMerkleLatestVersions;
3016
+ private chairmanMerkleNodeIds;
3017
+ private chairmanMerkleVersionNums;
3015
3018
  private entryMemoCids;
3016
3019
  private entryNullifierNids;
3017
3020
  private readonly loadedMerkleLeaves;
3018
- private readonly loadedMerkleTrees;
3019
- private readonly loadedMerkleNodes;
3021
+ private readonly loadedChairmanMerkleVersions;
3022
+ private readonly loadedChairmanMerkleNodes;
3020
3023
  private readonly loadedEntryMemos;
3021
3024
  private readonly loadedEntryNullifiers;
3022
3025
  private saveChain;
@@ -3033,7 +3036,6 @@ declare class KeyValueStore implements StorageAdapter {
3033
3036
  private walletCursorKey;
3034
3037
  private walletUtxoKey;
3035
3038
  private walletOperationKey;
3036
- private sharedChainKey;
3037
3039
  private sharedChainMetaKey;
3038
3040
  private sharedRecordKey;
3039
3041
  private parseJson;
@@ -3052,16 +3054,16 @@ declare class KeyValueStore implements StorageAdapter {
3052
3054
  private readUtxo;
3053
3055
  private pruneOperationIds;
3054
3056
  private ensureMerkleLeavesLoaded;
3055
- private ensureMerkleTreeLoaded;
3056
- private ensureMerkleNodesLoaded;
3057
+ private ensureChairmanMerkleVersionsLoaded;
3058
+ private ensureChairmanMerkleNodesLoaded;
3057
3059
  private ensureEntryMemosLoaded;
3058
3060
  private ensureEntryNullifiersLoaded;
3059
- getMerkleNode(chainId: number, id: string): Promise<MerkleNodeRecord | undefined>;
3060
- upsertMerkleNodes(chainId: number, nodes: MerkleNodeRecord[]): Promise<void>;
3061
- clearMerkleNodes(chainId: number): Promise<void>;
3062
- getMerkleTree(chainId: number): Promise<MerkleTreeState | undefined>;
3063
- setMerkleTree(chainId: number, tree: MerkleTreeState): Promise<void>;
3064
- clearMerkleTree(chainId: number): Promise<void>;
3061
+ getChairmanMerkleNode(chainId: number, id: string): Promise<ChairmanMerkleNodeRecord | undefined>;
3062
+ putChairmanMerkleNodes(chainId: number, nodes: ChairmanMerkleNodeRecord[]): Promise<void>;
3063
+ getChairmanMerkleVersion(chainId: number, version: number): Promise<ChairmanMerkleVersionRecord | undefined>;
3064
+ getLatestChairmanMerkleVersion(chainId: number): Promise<ChairmanMerkleVersionRecord | undefined>;
3065
+ putChairmanMerkleVersion(chainId: number, record: ChairmanMerkleVersionRecord): Promise<void>;
3066
+ clearChairmanMerkleTree(chainId: number): Promise<void>;
3065
3067
  upsertEntryMemos(memos: EntryMemoRecord[]): Promise<void>;
3066
3068
  listEntryMemos(query: ListEntryMemosQuery): Promise<{
3067
3069
  total: number;
@@ -3166,4 +3168,4 @@ declare const OcashSdk: {
3166
3168
  readonly MemoryStore: typeof MemoryStore;
3167
3169
  };
3168
3170
 
3169
- export { SEPOLIA_TESTNET as $, App_ABI as A, BABYJUBJUB_SCALAR_FIELD as B, type ChainConfigInput as C, type DepositOperation as D, type EntryMemoRecord as E, LedgerInfo as F, MemoKit as G, type Hex as H, MemoryStore as I, type MerkleLeafRecord as J, KeyManager as K, type ListEntryMemosQuery as L, type MerkleNodeRecord as M, type OCashSdk as N, type OperationType as O, type OCashSdkConfig as P, type OperationCreateInput as Q, type OpsApi as R, type StorageAdapter as S, type PlannerEstimateTransferResult as T, type UtxoRecord as U, type PlannerEstimateWithdrawResult as V, type ProofResult as W, RedisStore as X, type RedisStoreOptions as Y, type RelayerRequest as Z, SEPOLIA_DEV as _, type MerkleTreeState as a, type SdkEvent as a0, type SyncChainStatus as a1, type TokenMetadata as a2, type TransactionReceipt as a3, type TransferOperation as a4, type TransferOperationDetail as a5, type TransferWitnessInput as a6, Utils as a7, type WalletSessionInput as a8, type WithdrawOperation as a9, type WithdrawOperationDetail as aa, type WithdrawWitnessInput as ab, type WitnessBuildResult as ac, type WitnessContext as ad, assertChainConfigInput as ae, assertTokenList as af, assertTokenMetadata as ag, calcTransferProofBinding as ah, calcWithdrawProofBinding as ai, createSdk as aj, OcashSdk as ak, defaultAssetsOverrideMainnet as al, defaultAssetsOverrideTestnet as am, fetchPoolTokensFromContract as an, normalizeTokenMetadata as ao, type EntryNullifierRecord as b, type ListEntryNullifiersQuery as c, type SyncCursor as d, type ListUtxosQuery as e, type StoredOperation as f, type OperationDetailFor as g, type OperationStatus as h, type ListOperationsQuery as i, type AssetOverrideEntry as j, type AssetsOverride as k, BASE_DEV as l, BASE_MAINNET as m, BSC_DEV as n, BSC_MAINNET as o, BSC_TESTNET as p, BSC_TESTNET_DEV as q, type CommitmentData as r, CryptoToolkit as s, type DepositOperationDetail as t, DummyFactory as u, ETH_DEV as v, ETH_MAINNET as w, type KeyValueClient as x, KeyValueStore as y, type KeyValueStoreOptions as z };
3171
+ export { SEPOLIA_TESTNET as $, App_ABI as A, BABYJUBJUB_SCALAR_FIELD as B, type ChairmanMerkleNodeRecord as C, type DepositOperation as D, type EntryMemoRecord as E, type KeyValueStoreOptions as F, LedgerInfo as G, type Hex as H, MemoryStore as I, type MerkleLeafRecord as J, KeyManager as K, type ListEntryMemosQuery as L, MemoKit as M, type OCashSdk as N, type OperationType as O, type OCashSdkConfig as P, type OperationCreateInput as Q, type OpsApi as R, type StorageAdapter as S, type PlannerEstimateTransferResult as T, type UtxoRecord as U, type PlannerEstimateWithdrawResult as V, type ProofResult as W, RedisStore as X, type RedisStoreOptions as Y, type RelayerRequest as Z, SEPOLIA_DEV as _, type ChairmanMerkleVersionRecord as a, type SdkEvent as a0, type SyncChainStatus as a1, type TokenMetadata as a2, type TransactionReceipt as a3, type TransferOperation as a4, type TransferOperationDetail as a5, type TransferWitnessInput as a6, Utils as a7, type WalletSessionInput as a8, type WithdrawOperation as a9, type WithdrawOperationDetail as aa, type WithdrawWitnessInput as ab, type WitnessBuildResult as ac, type WitnessContext as ad, assertChainConfigInput as ae, assertTokenList as af, assertTokenMetadata as ag, calcTransferProofBinding as ah, calcWithdrawProofBinding as ai, createSdk as aj, OcashSdk as ak, defaultAssetsOverrideMainnet as al, defaultAssetsOverrideTestnet as am, fetchPoolTokensFromContract as an, normalizeTokenMetadata as ao, type EntryNullifierRecord as b, type ListEntryNullifiersQuery as c, type SyncCursor as d, type ListUtxosQuery as e, type StoredOperation as f, type OperationDetailFor as g, type OperationStatus as h, type ListOperationsQuery as i, type AssetOverrideEntry as j, type AssetsOverride as k, BASE_DEV as l, BASE_MAINNET as m, BSC_DEV as n, BSC_MAINNET as o, BSC_TESTNET as p, BSC_TESTNET_DEV as q, type ChainConfigInput as r, type CommitmentData as s, CryptoToolkit as t, type DepositOperationDetail as u, DummyFactory as v, ETH_DEV as w, ETH_MAINNET as x, type KeyValueClient as y, KeyValueStore as z };