Skip to main content

dlp_api/
account_size_class.rs

1const KB: u32 = 1024;
2const MB: u32 = 1024 * KB;
3
4//
5// PERFORMANCE TIP: if a single transaction contains N dlp-instructions, add
6// DLP_PROGRAM_DATA_SIZE_CLASS once, not N times. So consider doing something like this:
7//
8//  let size_budget = commit_diff_size_budget(blah)
9//      + finalize_size_budget(blah)
10//      + undelegate_size_budget(blah)
11//      - 2 * DLP_PROGRAM_DATA_SIZE_CLASS.size_budget();
12//
13//  That is because each *_size_budget() function includes this constant, so callers must subtract (N-1) instances
14//  when combining multiple instructions.
15//
16pub const DLP_PROGRAM_DATA_SIZE_CLASS: AccountSizeClass =
17    AccountSizeClass::Dynamic(350 * KB);
18
19#[derive(Copy, Clone, Debug, PartialEq, Eq)]
20pub enum AccountSizeClass {
21    // account size <= 256 B
22    //
23    // - sysvars (rent, clock, epoch schedule)
24    // - SPL token account and ATA
25    // - SPL token mint
26    // - delegation_metadata_pda
27    // - delegation_record_pda
28    // - commit_record_pda
29    // - program_config_pda
30    // - validator
31    // - fees_vault_pda
32    Tiny,
33
34    // account size <= 1 KB
35    //
36    // - sysvars (recent blockhash)
37    Small,
38
39    // account size <= 8 KB
40    //
41    // - sysvars (instructions)
42    Medium,
43
44    // account size <= 64 KB
45    //
46    // - sysvars (state history)
47    Large,
48
49    // account size <= 256 KB
50    //
51    ExtraLarge,
52
53    // account size <= 1 MB
54    Huge,
55
56    // any legal value
57    Dynamic(u32),
58}
59
60impl AccountSizeClass {
61    pub const fn size_budget(self) -> u32 {
62        match self {
63            Self::Tiny => 256,
64            Self::Small => KB,
65            Self::Medium => 8 * KB,
66            Self::Large => 64 * KB,
67            Self::ExtraLarge => 256 * KB,
68            Self::Huge => MB,
69            Self::Dynamic(n) => n,
70        }
71    }
72}
73
74pub fn total_size_budget(classes: &[AccountSizeClass]) -> u32 {
75    classes.iter().map(|f| f.size_budget()).sum()
76}