1use crate::UtilsError;
2
3pub fn compute_rollover_fee(
4 rollover_threshold: u64,
5 tree_height: u32,
6 rent: u64,
7) -> Result<u64, UtilsError> {
8 let number_of_transactions = 1 << tree_height;
9 if rollover_threshold > 100 {
10 return Err(UtilsError::InvalidRolloverThreshold);
11 }
12 if rollover_threshold == 0 {
13 return Ok(rent);
14 }
15 Ok((rent * 100).div_ceil(number_of_transactions * rollover_threshold))
18}
19
20#[test]
21fn test_compute_rollover_fee() {
22 let rollover_threshold = 100;
23 let tree_height = 26;
24 let rent = 1392890880;
25 let total_number_of_leaves = 1 << tree_height;
26
27 let fee = compute_rollover_fee(rollover_threshold, tree_height, rent).unwrap();
28 assert!((fee + 1) * (total_number_of_leaves * 100 / rollover_threshold) > rent);
30
31 let rollover_threshold = 50;
32 let fee = compute_rollover_fee(rollover_threshold, tree_height, rent).unwrap();
33 assert!((fee + 1) * (total_number_of_leaves * 100 / rollover_threshold) > rent);
34 let rollover_threshold: u64 = 95;
35
36 let fee = compute_rollover_fee(rollover_threshold, tree_height, rent).unwrap();
37 assert!((fee + 1) * (total_number_of_leaves * 100 / rollover_threshold) > rent);
38}
39
40#[test]
41fn test_concurrent_tree_compute_rollover_fee() {
42 let merkle_tree_lamports = 9496836480;
43 let queue_lamports = 2293180800;
44 let cpi_context_lamports = 143487360;
45 let rollover_threshold = 95;
46 let height = 26;
47 let rollover_fee = compute_rollover_fee(
48 rollover_threshold,
49 height,
50 merkle_tree_lamports + cpi_context_lamports,
51 )
52 .unwrap()
53 + compute_rollover_fee(rollover_threshold, height, queue_lamports).unwrap();
54 let lifetime_lamports = rollover_fee * ((2u64.pow(height)) as f64 * 0.95) as u64;
55 println!("rollover_fee: {}", rollover_fee);
56 println!("lifetime_lamports: {}", lifetime_lamports);
57 println!(
58 "lifetime_lamports < total lamports: {}",
59 lifetime_lamports > merkle_tree_lamports + queue_lamports + cpi_context_lamports
60 );
61 println!(
62 "lifetime_lamports - total lamports: {}",
63 lifetime_lamports - (merkle_tree_lamports + queue_lamports + cpi_context_lamports)
64 );
65 assert!(lifetime_lamports > (merkle_tree_lamports + queue_lamports + cpi_context_lamports));
66}
67
68#[test]
69fn test_address_tree_compute_rollover_fee() {
70 let merkle_tree_lamports = 9639711360;
71 let queue_lamports = 2293180800;
72 let rollover_threshold = 95;
73 let height = 26;
74 let rollover_fee = compute_rollover_fee(rollover_threshold, height, merkle_tree_lamports)
75 .unwrap()
76 + compute_rollover_fee(rollover_threshold, height, queue_lamports).unwrap();
77 let lifetime_lamports = rollover_fee * ((2u64.pow(height)) as f64 * 0.95) as u64;
78 println!("rollover_fee: {}", rollover_fee);
79 println!("lifetime_lamports: {}", lifetime_lamports);
80 println!(
81 "lifetime_lamports < total lamports: {}",
82 lifetime_lamports > merkle_tree_lamports + queue_lamports
83 );
84 println!(
85 "lifetime_lamports - total lamports: {}",
86 lifetime_lamports - (merkle_tree_lamports + queue_lamports)
87 );
88 assert!(lifetime_lamports > (merkle_tree_lamports + queue_lamports));
89}