use crate::{
bank::{Bank, BankRc, EnteredEpochCallback, StatusCacheRc},
blockhash_queue::BlockhashQueue,
epoch_stakes::EpochStakes,
message_processor::MessageProcessor,
rent_collector::RentCollector,
serde_utils::{
deserialize_atomicbool, deserialize_atomicu64, serialize_atomicbool, serialize_atomicu64,
},
stakes::Stakes,
storage_utils::StorageAccounts,
};
use serde::{Deserialize, Serialize};
use solana_sdk::{
clock::{Epoch, Slot, UnixTimestamp},
epoch_schedule::EpochSchedule,
fee_calculator::{FeeCalculator, FeeRateGovernor},
hard_forks::HardForks,
hash::Hash,
inflation::Inflation,
pubkey::Pubkey,
};
use std::{
collections::HashMap,
sync::atomic::{AtomicBool, AtomicU64},
sync::{Arc, RwLock},
};
#[derive(Deserialize, Serialize)]
pub struct Bank1_0 {
#[serde(skip)]
pub rc: BankRc,
#[serde(skip)]
pub src: StatusCacheRc,
pub blockhash_queue: RwLock<BlockhashQueue>,
pub ancestors: HashMap<Slot, usize>,
pub hash: RwLock<Hash>,
pub parent_hash: Hash,
pub parent_slot: Slot,
pub hard_forks: Arc<RwLock<HardForks>>,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub transaction_count: AtomicU64,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub tick_height: AtomicU64,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub signature_count: AtomicU64,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub capitalization: AtomicU64,
pub max_tick_height: u64,
pub hashes_per_tick: Option<u64>,
pub ticks_per_slot: u64,
pub ns_per_slot: u128,
pub genesis_creation_time: UnixTimestamp,
pub slots_per_year: f64,
pub slots_per_segment: u64,
pub slot: Slot,
pub epoch: Epoch,
pub block_height: u64,
pub collector_id: Pubkey,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub collector_fees: AtomicU64,
pub fee_calculator: FeeCalculator,
pub fee_rate_governor: FeeRateGovernor,
#[serde(serialize_with = "serialize_atomicu64")]
#[serde(deserialize_with = "deserialize_atomicu64")]
pub collected_rent: AtomicU64,
pub rent_collector: RentCollector,
pub epoch_schedule: EpochSchedule,
pub inflation: Arc<RwLock<Inflation>>,
pub stakes: RwLock<Stakes>,
pub storage_accounts: RwLock<StorageAccounts>,
pub epoch_stakes: HashMap<Epoch, Stakes>,
#[serde(serialize_with = "serialize_atomicbool")]
#[serde(deserialize_with = "deserialize_atomicbool")]
pub is_delta: AtomicBool,
pub message_processor: MessageProcessor,
#[serde(skip)]
pub entered_epoch_callback: Arc<RwLock<Option<EnteredEpochCallback>>>,
#[serde(skip)]
pub last_vote_sync: AtomicU64,
#[serde(skip)]
pub rewards: Option<Vec<(Pubkey, i64)>>,
}
impl Bank1_0 {
pub fn convert_to_current(self) -> Bank {
let old_epoch_stakes = self.epoch_stakes;
let epoch_stakes = old_epoch_stakes
.iter()
.map(|(epoch, stakes)| (*epoch, EpochStakes::new(&stakes, *epoch)))
.collect();
Bank {
rc: self.rc,
src: self.src,
blockhash_queue: self.blockhash_queue,
ancestors: self.ancestors,
hash: self.hash,
parent_hash: self.parent_hash,
parent_slot: self.parent_slot,
hard_forks: self.hard_forks,
transaction_count: self.transaction_count,
tick_height: self.tick_height,
signature_count: self.signature_count,
capitalization: self.capitalization,
max_tick_height: self.max_tick_height,
hashes_per_tick: self.hashes_per_tick,
ticks_per_slot: self.ticks_per_slot,
ns_per_slot: self.ns_per_slot,
genesis_creation_time: self.genesis_creation_time,
slots_per_year: self.slots_per_year,
slots_per_segment: self.slots_per_segment,
slot: self.slot,
epoch: self.epoch,
block_height: self.block_height,
collector_id: self.collector_id,
collector_fees: self.collector_fees,
fee_calculator: self.fee_calculator,
fee_rate_governor: self.fee_rate_governor,
collected_rent: self.collected_rent,
rent_collector: self.rent_collector,
epoch_schedule: self.epoch_schedule,
inflation: self.inflation,
stakes: self.stakes,
storage_accounts: self.storage_accounts,
epoch_stakes,
is_delta: self.is_delta,
message_processor: self.message_processor,
entered_epoch_callback: self.entered_epoch_callback,
last_vote_sync: self.last_vote_sync,
rewards: self.rewards,
}
}
}