@@ -8,10 +8,12 @@ pub fn make_pruned_branch(
8
8
context : & dyn CellContext ,
9
9
) -> Result < Cell , Error > {
10
10
let descriptor = cell. descriptor ( ) ;
11
- let cell_level_mask = descriptor. level_mask ( ) ;
11
+ let mut cell_level_mask = descriptor. level_mask ( ) ;
12
12
13
13
let mut builder = CellBuilder :: new ( ) ;
14
- let level_mask = LevelMask :: new ( cell_level_mask. to_byte ( ) | ( 1 << merkle_depth) ) ;
14
+
15
+ let new_level = 1 << merkle_depth;
16
+ let level_mask = LevelMask :: new ( cell_level_mask. to_byte ( ) | new_level) ;
15
17
16
18
builder. set_exotic ( true ) ;
17
19
@@ -20,6 +22,9 @@ pub fn make_pruned_branch(
20
22
level_mask. to_byte ( ) ,
21
23
] ) ) ;
22
24
25
+ // Only write levels lower than the new level.
26
+ cell_level_mask = LevelMask :: new ( cell_level_mask. to_byte ( ) & ( new_level - 1 ) ) ;
27
+
23
28
for level in cell_level_mask {
24
29
_ = builder. store_u256 ( cell. hash ( level) ) ;
25
30
}
@@ -33,6 +38,9 @@ pub fn make_pruned_branch(
33
38
34
39
#[ cfg( test) ]
35
40
mod test {
41
+ use crate :: boc:: Boc ;
42
+ use crate :: merkle:: MerkleProof ;
43
+
36
44
use super :: * ;
37
45
38
46
#[ test]
@@ -56,4 +64,29 @@ mod test {
56
64
make_pruned_branch ( virtual_cell, 0 , Cell :: empty_context ( ) ) . unwrap ( ) ;
57
65
assert_eq ! ( pruned_branch. as_ref( ) , virtual_pruned_branch. as_ref( ) ) ;
58
66
}
67
+
68
+ #[ test]
69
+ fn partial_pruned ( ) -> anyhow:: Result < ( ) > {
70
+ let cell = CellBuilder :: build_from ( (
71
+ CellBuilder :: build_from ( ( 0xaa_u8 , Cell :: empty_cell ( ) ) ) ?,
72
+ CellBuilder :: build_from ( ( 0xbb_u8 , Cell :: empty_cell ( ) ) ) ?,
73
+ ) ) ?;
74
+ println ! ( "Original: {}" , Boc :: encode_base64( & cell) ) ;
75
+
76
+ // Prune left cell.
77
+ let with_left_pruned = {
78
+ let usage_tree = UsageTree :: new ( UsageTreeMode :: OnLoad ) ;
79
+ let tracked = usage_tree. track ( & cell) ;
80
+ tracked. reference ( 1 ) . unwrap ( ) . touch_recursive ( ) ;
81
+
82
+ MerkleProof :: create ( cell. as_ref ( ) , usage_tree) . build_raw_ext ( Cell :: empty_context ( ) ) ?
83
+ } ;
84
+ println ! ( "Left pruned: {}" , Boc :: encode_base64( & with_left_pruned) ) ;
85
+
86
+ // Full pruned.
87
+ let pruned = make_pruned_branch ( with_left_pruned. as_ref ( ) , 0 , Cell :: empty_context ( ) ) ?;
88
+ println ! ( "Full pruned: {}" , Boc :: encode_base64( & pruned) ) ;
89
+
90
+ Ok ( ( ) )
91
+ }
59
92
}
0 commit comments