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}