use std::{
fmt::{self, Formatter},
sync::Arc,
};
use datasize::DataSize;
use derive_more::From;
use fmt::Display;
use serde::{Deserialize, Serialize};
use super::{BlockHeight, BlockProposerDeploySets};
use crate::{
effect::requests::BlockProposerRequest,
types::{DeployHash, DeployHeader, ProtoBlock},
Chainspec,
};
use casper_execution_engine::shared::motes::Motes;
#[derive(Clone, DataSize, Debug, Deserialize, Serialize)]
pub enum DeployType {
Transfer {
header: DeployHeader,
payment_amount: Motes,
size: usize,
},
Other {
header: DeployHeader,
payment_amount: Motes,
size: usize,
},
}
impl DeployType {
pub fn header(&self) -> &DeployHeader {
match self {
Self::Transfer { header, .. } => header,
Self::Other { header, .. } => header,
}
}
pub fn take_header(self) -> DeployHeader {
match self {
Self::Transfer { header, .. } => header,
Self::Other { header, .. } => header,
}
}
pub fn payment_amount(&self) -> Motes {
match self {
Self::Transfer { payment_amount, .. } => *payment_amount,
Self::Other { payment_amount, .. } => *payment_amount,
}
}
pub fn size(&self) -> usize {
match self {
Self::Transfer { size, .. } => *size,
Self::Other { size, .. } => *size,
}
}
pub fn is_transfer(&self) -> bool {
matches!(self, DeployType::Transfer { .. })
}
pub fn is_wasm(&self) -> bool {
matches!(self, DeployType::Other { .. })
}
}
#[derive(DataSize, Debug, From)]
pub enum Event {
#[from]
Request(BlockProposerRequest),
Loaded {
chainspec: Arc<Chainspec>,
sets: Option<BlockProposerDeploySets>,
next_finalized_block: BlockHeight,
},
BufferDeploy {
hash: DeployHash,
deploy_type: Box<DeployType>,
},
Prune,
FinalizedProtoBlock {
block: ProtoBlock,
height: BlockHeight,
},
}
impl Display for Event {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Event::Request(req) => write!(f, "block-proposer request: {}", req),
Event::Loaded {
sets: Some(sets),
next_finalized_block,
..
} => write!(
f,
"loaded block-proposer deploy sets: {}; expected next finalized block: {}",
sets, next_finalized_block
),
Event::Loaded {
sets: None,
next_finalized_block,
..
} => write!(
f,
"loaded block-proposer deploy sets, none found in storage; \
expected next finalized block: {}",
next_finalized_block
),
Event::BufferDeploy { hash, .. } => write!(f, "block-proposer add {}", hash),
Event::Prune => write!(f, "block-proposer prune"),
Event::FinalizedProtoBlock { block, height } => {
write!(
f,
"deploy-buffer finalized proto block {} at height {}",
block, height
)
}
}
}
}