solana_sysvar/
epoch_schedule.rs

1//! Information about epoch duration.
2//!
3//! The _epoch schedule_ sysvar provides access to the [`EpochSchedule`] type,
4//! which includes the number of slots per epoch, timing of leader schedule
5//! selection, and information about epoch warm-up time.
6//!
7//! [`EpochSchedule`] implements [`Sysvar::get`] and can be loaded efficiently without
8//! passing the sysvar account ID to the program.
9//!
10//! See also the Solana [documentation on the epoch schedule sysvar][sdoc].
11//!
12//! [sdoc]: https://docs.solanalabs.com/runtime/sysvars#epochschedule
13//!
14//! # Examples
15//!
16//! Accessing via on-chain program directly:
17//!
18//! ```no_run
19//! # use solana_account_info::AccountInfo;
20//! # use solana_epoch_schedule::EpochSchedule;
21//! # use solana_msg::msg;
22//! # use solana_program_error::{ProgramError, ProgramResult};
23//! # use solana_pubkey::Pubkey;
24//! # use solana_sdk_ids::sysvar::epoch_schedule;
25//! # use solana_sysvar::Sysvar;
26//! fn process_instruction(
27//!     program_id: &Pubkey,
28//!     accounts: &[AccountInfo],
29//!     instruction_data: &[u8],
30//! ) -> ProgramResult {
31//!
32//!     let epoch_schedule = EpochSchedule::get()?;
33//!     msg!("epoch_schedule: {:#?}", epoch_schedule);
34//!
35//!     Ok(())
36//! }
37//! #
38//! # use solana_sysvar_id::SysvarId;
39//! # let p = EpochSchedule::id();
40//! # let l = &mut 1120560;
41//! # let d = &mut vec![0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
42//! # let a = AccountInfo::new(&p, false, false, l, d, &p, false, 0);
43//! # let accounts = &[a.clone(), a];
44//! # process_instruction(
45//! #     &Pubkey::new_unique(),
46//! #     accounts,
47//! #     &[],
48//! # )?;
49//! # Ok::<(), ProgramError>(())
50//! ```
51//!
52//! Accessing via on-chain program's account parameters:
53//!
54//! ```
55//! # use solana_account_info::{AccountInfo, next_account_info};
56//! # use solana_epoch_schedule::EpochSchedule;
57//! # use solana_msg::msg;
58//! # use solana_program_error::{ProgramError, ProgramResult};
59//! # use solana_pubkey::Pubkey;
60//! # use solana_sdk_ids::sysvar::epoch_schedule;
61//! # use solana_sysvar::Sysvar;
62//! fn process_instruction(
63//!     program_id: &Pubkey,
64//!     accounts: &[AccountInfo],
65//!     instruction_data: &[u8],
66//! ) -> ProgramResult {
67//!     let account_info_iter = &mut accounts.iter();
68//!     let epoch_schedule_account_info = next_account_info(account_info_iter)?;
69//!
70//!     assert!(epoch_schedule::check_id(epoch_schedule_account_info.key));
71//!
72//!     let epoch_schedule = EpochSchedule::from_account_info(epoch_schedule_account_info)?;
73//!     msg!("epoch_schedule: {:#?}", epoch_schedule);
74//!
75//!     Ok(())
76//! }
77//! #
78//! # use solana_sysvar_id::SysvarId;
79//! # let p = EpochSchedule::id();
80//! # let l = &mut 1120560;
81//! # let d = &mut vec![0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
82//! # let a = AccountInfo::new(&p, false, false, l, d, &p, false, 0);
83//! # let accounts = &[a.clone(), a];
84//! # process_instruction(
85//! #     &Pubkey::new_unique(),
86//! #     accounts,
87//! #     &[],
88//! # )?;
89//! # Ok::<(), ProgramError>(())
90//! ```
91//!
92//! Accessing via the RPC client:
93//!
94//! ```
95//! # use solana_epoch_schedule::EpochSchedule;
96//! # use solana_program::example_mocks::solana_sdk;
97//! # use solana_program::example_mocks::solana_rpc_client;
98//! # use solana_rpc_client::rpc_client::RpcClient;
99//! # use solana_sdk::account::Account;
100//! # use solana_sdk_ids::sysvar::epoch_schedule;
101//! # use anyhow::Result;
102//! #
103//! fn print_sysvar_epoch_schedule(client: &RpcClient) -> Result<()> {
104//! #   client.set_get_account_response(epoch_schedule::ID, Account {
105//! #       lamports: 1120560,
106//! #       data: vec![0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
107//! #       owner: solana_sdk_ids::system_program::ID,
108//! #       executable: false,
109//! #       rent_epoch: 307,
110//! # });
111//! #
112//!     let epoch_schedule = client.get_account(&epoch_schedule::ID)?;
113//!     let data: EpochSchedule = bincode::deserialize(&epoch_schedule.data)?;
114//!
115//!     Ok(())
116//! }
117//! #
118//! # let client = RpcClient::new(String::new());
119//! # print_sysvar_epoch_schedule(&client)?;
120//! #
121//! # Ok::<(), anyhow::Error>(())
122//! ```
123#[cfg(feature = "bincode")]
124use crate::{impl_sysvar_get, Sysvar};
125pub use {
126    solana_epoch_schedule::EpochSchedule,
127    solana_sdk_ids::sysvar::epoch_schedule::{check_id, id, ID},
128};
129
130#[cfg(feature = "bincode")]
131impl Sysvar for EpochSchedule {
132    impl_sysvar_get!(sol_get_epoch_schedule_sysvar);
133}