solana_bpf_loader_program/syscalls/
sysvar.rs

1use {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    /// Get a Clock sysvar
27    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    /// Get a EpochSchedule sysvar
49    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    /// Get a Fees sysvar
71    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    /// Get a Rent sysvar
96    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);