use aptos_types::{account_address::AccountAddress, transaction::SignedTransaction};
use serde::{Deserialize, Serialize};
use std::fmt;
pub type Round = u64;
pub type Author = AccountAddress;
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct TransactionSummary {
pub sender: AccountAddress,
pub sequence_number: u64,
}
impl fmt::Display for TransactionSummary {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}:{}", self.sender, self.sequence_number,)
}
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
pub enum Payload {
DirectMempool(Vec<SignedTransaction>),
InQuorumStore(Vec<ProofOfStore>),
}
impl Payload {
pub fn new_empty() -> Self {
Payload::DirectMempool(Vec::new())
}
pub fn len(&self) -> usize {
match self {
Payload::DirectMempool(txns) => txns.len(),
Payload::InQuorumStore(_poavs) => todo!(),
}
}
pub fn is_empty(&self) -> bool {
match self {
Payload::DirectMempool(txns) => txns.is_empty(),
Payload::InQuorumStore(_poavs) => todo!(),
}
}
}
impl IntoIterator for Payload {
type Item = SignedTransaction;
type IntoIter = std::vec::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
match self {
Payload::DirectMempool(txns) => txns.into_iter(),
Payload::InQuorumStore(_poavs) => todo!(),
}
}
}
impl fmt::Display for Payload {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Payload::DirectMempool(txns) => {
write!(f, "InMemory txns: {}", txns.len())
}
Payload::InQuorumStore(_poavs) => todo!(),
}
}
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
pub enum PayloadFilter {
DirectMempool(Vec<TransactionSummary>),
InQuorumStore(Vec<ProofOfStore>),
}
impl From<&Vec<&Payload>> for PayloadFilter {
fn from(exclude_payloads: &Vec<&Payload>) -> Self {
if exclude_payloads.is_empty() {
return PayloadFilter::DirectMempool(vec![]);
}
match exclude_payloads.first().unwrap() {
Payload::DirectMempool(_) => {
let mut exclude_txns = vec![];
for payload in exclude_payloads {
if let Payload::DirectMempool(txns) = payload {
for txn in txns {
exclude_txns.push(TransactionSummary {
sender: txn.sender(),
sequence_number: txn.sequence_number(),
});
}
}
}
PayloadFilter::DirectMempool(exclude_txns)
}
Payload::InQuorumStore(_) => todo!(),
}
}
}
impl fmt::Display for PayloadFilter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
PayloadFilter::DirectMempool(excluded_txns) => {
let mut txns_str = "".to_string();
for tx in excluded_txns.iter() {
txns_str += &format!("{} ", tx);
}
write!(f, "{}", txns_str)
}
PayloadFilter::InQuorumStore(_poavs) => todo!(),
}
}
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
pub struct ProofOfStore {
placeholder: u64,
}