2022-07-16 10:33:57 -07:00
|
|
|
use {super::*, crate::declare_syscall};
|
|
|
|
|
|
|
|
fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId + Clone>(
|
|
|
|
sysvar: Result<Arc<T>, InstructionError>,
|
|
|
|
var_addr: u64,
|
|
|
|
check_aligned: bool,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
|
|
|
invoke_context: &mut InvokeContext,
|
2023-04-05 06:50:34 -07:00
|
|
|
) -> Result<u64, Error> {
|
2022-11-15 06:21:11 -08:00
|
|
|
consume_compute_meter(
|
|
|
|
invoke_context,
|
2022-07-16 10:33:57 -07:00
|
|
|
invoke_context
|
|
|
|
.get_compute_budget()
|
|
|
|
.sysvar_base_cost
|
|
|
|
.saturating_add(size_of::<T>() as u64),
|
|
|
|
)?;
|
|
|
|
let var = translate_type_mut::<T>(memory_mapping, var_addr, check_aligned)?;
|
|
|
|
|
2023-04-05 06:50:34 -07:00
|
|
|
let sysvar: Arc<T> = sysvar?;
|
2022-07-16 10:33:57 -07:00
|
|
|
*var = T::clone(sysvar.as_ref());
|
|
|
|
|
|
|
|
Ok(SUCCESS)
|
|
|
|
}
|
|
|
|
|
|
|
|
declare_syscall!(
|
|
|
|
/// Get a Clock sysvar
|
|
|
|
SyscallGetClockSysvar,
|
2022-10-06 11:31:58 -07:00
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
2022-07-16 10:33:57 -07:00
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
2023-04-05 06:50:34 -07:00
|
|
|
) -> Result<u64, Error> {
|
2022-10-06 11:31:58 -07:00
|
|
|
get_sysvar(
|
2022-07-16 10:33:57 -07:00
|
|
|
invoke_context.get_sysvar_cache().get_clock(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
2022-10-06 11:31:58 -07:00
|
|
|
invoke_context,
|
|
|
|
)
|
2022-07-16 10:33:57 -07:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
declare_syscall!(
|
|
|
|
/// Get a EpochSchedule sysvar
|
|
|
|
SyscallGetEpochScheduleSysvar,
|
2022-10-06 11:31:58 -07:00
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
2022-07-16 10:33:57 -07:00
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
2023-04-05 06:50:34 -07:00
|
|
|
) -> Result<u64, Error> {
|
2022-10-06 11:31:58 -07:00
|
|
|
get_sysvar(
|
2022-07-16 10:33:57 -07:00
|
|
|
invoke_context.get_sysvar_cache().get_epoch_schedule(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
2022-10-06 11:31:58 -07:00
|
|
|
invoke_context,
|
|
|
|
)
|
2022-07-16 10:33:57 -07:00
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2023-06-27 07:14:43 -07:00
|
|
|
declare_syscall!(
|
|
|
|
/// Get a EpochRewards sysvar
|
|
|
|
SyscallGetEpochRewardsSysvar,
|
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
|
|
|
) -> Result<u64, Error> {
|
|
|
|
get_sysvar(
|
|
|
|
invoke_context.get_sysvar_cache().get_epoch_rewards(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
|
|
|
invoke_context,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2022-07-16 10:33:57 -07:00
|
|
|
declare_syscall!(
|
|
|
|
/// Get a Fees sysvar
|
|
|
|
SyscallGetFeesSysvar,
|
2022-10-06 11:31:58 -07:00
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
2022-07-16 10:33:57 -07:00
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
2023-04-05 06:50:34 -07:00
|
|
|
) -> Result<u64, Error> {
|
2022-07-16 10:33:57 -07:00
|
|
|
#[allow(deprecated)]
|
|
|
|
{
|
2022-10-06 11:31:58 -07:00
|
|
|
get_sysvar(
|
2022-07-16 10:33:57 -07:00
|
|
|
invoke_context.get_sysvar_cache().get_fees(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
2022-10-06 11:31:58 -07:00
|
|
|
invoke_context,
|
|
|
|
)
|
2022-07-16 10:33:57 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
declare_syscall!(
|
|
|
|
/// Get a Rent sysvar
|
|
|
|
SyscallGetRentSysvar,
|
2022-10-06 11:31:58 -07:00
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
2022-07-16 10:33:57 -07:00
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
2023-04-05 06:50:34 -07:00
|
|
|
) -> Result<u64, Error> {
|
2022-10-06 11:31:58 -07:00
|
|
|
get_sysvar(
|
2022-07-16 10:33:57 -07:00
|
|
|
invoke_context.get_sysvar_cache().get_rent(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
2022-10-06 11:31:58 -07:00
|
|
|
invoke_context,
|
|
|
|
)
|
2022-07-16 10:33:57 -07:00
|
|
|
}
|
|
|
|
);
|
2023-06-16 13:14:02 -07:00
|
|
|
|
|
|
|
declare_syscall!(
|
|
|
|
/// Get a Last Restart Slot sysvar
|
|
|
|
SyscallGetLastRestartSlotSysvar,
|
|
|
|
fn inner_call(
|
|
|
|
invoke_context: &mut InvokeContext,
|
|
|
|
var_addr: u64,
|
|
|
|
_arg2: u64,
|
|
|
|
_arg3: u64,
|
|
|
|
_arg4: u64,
|
|
|
|
_arg5: u64,
|
|
|
|
memory_mapping: &mut MemoryMapping,
|
|
|
|
) -> Result<u64, Error> {
|
|
|
|
get_sysvar(
|
|
|
|
invoke_context.get_sysvar_cache().get_last_restart_slot(),
|
|
|
|
var_addr,
|
|
|
|
invoke_context.get_check_aligned(),
|
|
|
|
memory_mapping,
|
|
|
|
invoke_context,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
);
|