solana_bpf_loader_program/syscalls/
sysvar.rs1use {super::*, crate::declare_syscall};
2
3fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId + Clone>(
4 sysvar: Result<Arc<T>, InstructionError>,
5 var_addr: u64,
6 check_aligned: bool,
7 memory_mapping: &mut MemoryMapping,
8 invoke_context: &mut InvokeContext,
9) -> Result<u64, EbpfError> {
10 consume_compute_meter(
11 invoke_context,
12 invoke_context
13 .get_compute_budget()
14 .sysvar_base_cost
15 .saturating_add(size_of::<T>() as u64),
16 )?;
17 let var = translate_type_mut::<T>(memory_mapping, var_addr, check_aligned)?;
18
19 let sysvar: Arc<T> = sysvar.map_err(SyscallError::InstructionError)?;
20 *var = T::clone(sysvar.as_ref());
21
22 Ok(SUCCESS)
23}
24
25declare_syscall!(
26 SyscallGetClockSysvar,
28 fn inner_call(
29 invoke_context: &mut InvokeContext,
30 var_addr: u64,
31 _arg2: u64,
32 _arg3: u64,
33 _arg4: u64,
34 _arg5: u64,
35 memory_mapping: &mut MemoryMapping,
36 ) -> Result<u64, EbpfError> {
37 get_sysvar(
38 invoke_context.get_sysvar_cache().get_clock(),
39 var_addr,
40 invoke_context.get_check_aligned(),
41 memory_mapping,
42 invoke_context,
43 )
44 }
45);
46
47declare_syscall!(
48 SyscallGetEpochScheduleSysvar,
50 fn inner_call(
51 invoke_context: &mut InvokeContext,
52 var_addr: u64,
53 _arg2: u64,
54 _arg3: u64,
55 _arg4: u64,
56 _arg5: u64,
57 memory_mapping: &mut MemoryMapping,
58 ) -> Result<u64, EbpfError> {
59 get_sysvar(
60 invoke_context.get_sysvar_cache().get_epoch_schedule(),
61 var_addr,
62 invoke_context.get_check_aligned(),
63 memory_mapping,
64 invoke_context,
65 )
66 }
67);
68
69declare_syscall!(
70 SyscallGetFeesSysvar,
72 fn inner_call(
73 invoke_context: &mut InvokeContext,
74 var_addr: u64,
75 _arg2: u64,
76 _arg3: u64,
77 _arg4: u64,
78 _arg5: u64,
79 memory_mapping: &mut MemoryMapping,
80 ) -> Result<u64, EbpfError> {
81 #[allow(deprecated)]
82 {
83 get_sysvar(
84 invoke_context.get_sysvar_cache().get_fees(),
85 var_addr,
86 invoke_context.get_check_aligned(),
87 memory_mapping,
88 invoke_context,
89 )
90 }
91 }
92);
93
94declare_syscall!(
95 SyscallGetRentSysvar,
97 fn inner_call(
98 invoke_context: &mut InvokeContext,
99 var_addr: u64,
100 _arg2: u64,
101 _arg3: u64,
102 _arg4: u64,
103 _arg5: u64,
104 memory_mapping: &mut MemoryMapping,
105 ) -> Result<u64, EbpfError> {
106 get_sysvar(
107 invoke_context.get_sysvar_cache().get_rent(),
108 var_addr,
109 invoke_context.get_check_aligned(),
110 memory_mapping,
111 invoke_context,
112 )
113 }
114);