Support json parsing of epoch-rewards partition data sysvar accounts (#34914)

This commit is contained in:
Tyera 2024-01-23 21:54:06 -07:00 committed by GitHub
parent bd103865df
commit b9947bd327
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 28 additions and 1 deletions

View File

@ -9,6 +9,7 @@ use {
bv::BitVec,
solana_sdk::{
clock::{Clock, Epoch, Slot, UnixTimestamp},
epoch_rewards_partition_data::EpochRewardsPartitionDataVersion,
epoch_schedule::EpochSchedule,
pubkey::Pubkey,
rent::Rent,
@ -96,7 +97,24 @@ pub fn parse_sysvar(data: &[u8], pubkey: &Pubkey) -> Result<SysvarAccountType, P
.ok()
.map(SysvarAccountType::EpochRewards)
} else {
None
// EpochRewards PartitionData accounts are owned by the sysvar
// program, but have dynamically generated addresses. Test on
// whether account content deserializes properly.
if let Ok(epoch_rewards_partition_data) =
deserialize::<EpochRewardsPartitionDataVersion>(data)
{
let EpochRewardsPartitionDataVersion::V0(partition_data) =
epoch_rewards_partition_data;
Some(SysvarAccountType::EpochRewardsPartitionData(
UiEpochRewardsPartitionData {
version: 0,
num_partitions: partition_data.num_partitions as u64,
parent_blockhash: partition_data.parent_blockhash.to_string(),
},
))
} else {
None
}
}
};
parsed_account.ok_or(ParseAccountError::AccountNotParsable(
@ -120,6 +138,7 @@ pub enum SysvarAccountType {
StakeHistory(Vec<UiStakeHistoryEntry>),
LastRestartSlot(UiLastRestartSlot),
EpochRewards(EpochRewards),
EpochRewardsPartitionData(UiEpochRewardsPartitionData),
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
@ -239,6 +258,14 @@ pub struct UiLastRestartSlot {
pub last_restart_slot: Slot,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "camelCase")]
pub struct UiEpochRewardsPartitionData {
pub version: u32,
pub num_partitions: u64,
pub parent_blockhash: String,
}
#[cfg(test)]
mod test {
#[allow(deprecated)]