light_utils/
fee.rs

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    // rent / (total_number_of_leaves * (rollover_threshold / 100))
16    // (with ceil division)
17    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_ne!(fee, 0u64);
29    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}