use std::collections::HashMap;
use std::ops::{Deref, DerefMut};
use pchain_types::{
blockchain::{Command, Transaction},
cryptography::{PublicAddress, Sha256Hash},
};
#[derive(Clone, Default)]
pub(crate) struct BaseTx {
pub signer: PublicAddress,
pub hash: Sha256Hash,
pub nonce: u64,
pub gas_limit: u64,
pub priority_fee_per_gas: u64,
}
impl From<&Transaction> for BaseTx {
fn from(tx: &Transaction) -> Self {
Self {
signer: tx.signer,
hash: tx.hash,
nonce: tx.nonce,
gas_limit: tx.gas_limit,
priority_fee_per_gas: tx.priority_fee_per_gas,
}
}
}
#[derive(Clone)]
pub(crate) struct CallTx {
pub base_tx: BaseTx,
pub target: PublicAddress,
pub method: String,
pub arguments: Option<Vec<Vec<u8>>>,
pub amount: Option<u64>,
}
impl Deref for CallTx {
type Target = BaseTx;
fn deref(&self) -> &Self::Target {
&self.base_tx
}
}
impl DerefMut for CallTx {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.base_tx
}
}
#[derive(Clone, Debug)]
pub(crate) struct DeferredCommand {
pub contract_address: PublicAddress,
pub command: Command,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct BlockchainParams {
pub this_block_number: u64,
pub prev_block_hash: Sha256Hash,
pub this_base_fee: u64,
pub timestamp: u32,
pub random_bytes: Sha256Hash,
pub proposer_address: PublicAddress,
pub treasury_address: PublicAddress,
pub cur_view: u64,
pub validator_performance: Option<ValidatorPerformance>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ValidatorPerformance {
pub blocks_per_epoch: u32,
pub stats: HashMap<PublicAddress, BlockProposalStats>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BlockProposalStats {
pub num_of_proposed_blocks: u32,
}
impl BlockProposalStats {
pub fn new(num_of_proposed_blocks: u32) -> Self {
Self {
num_of_proposed_blocks,
}
}
}