#![allow(clippy::type_complexity)]
use console::network::Network;
use snarkvm_ledger_block::{Ratify, Transaction};
use snarkvm_ledger_narwhal::{Transmission, TransmissionID};
use snarkvm_ledger_puzzle::Solution;
use anyhow::{Result, bail, ensure};
use std::collections::HashSet;
pub fn decouple_transmissions<N: Network>(
transmissions: impl Iterator<Item = (TransmissionID<N>, Transmission<N>)>,
) -> Result<(Vec<Ratify<N>>, Vec<Solution<N>>, Vec<Transaction<N>>)> {
let ratifications = Vec::new();
let mut solutions = Vec::new();
let mut transactions = Vec::new();
let mut unique = HashSet::new();
for (transmission_id, transmission) in transmissions {
ensure!(unique.insert(transmission_id), "Found a duplicate transmission ID - {transmission_id}");
match (transmission_id, transmission) {
(TransmissionID::Ratification, Transmission::Ratification) => (),
(TransmissionID::Solution(commitment, checksum), Transmission::Solution(solution)) => {
ensure!(checksum == solution.to_checksum::<N>()?, "Mismatching transmission checksum (solution)");
let solution = solution.deserialize_blocking()?;
ensure!(commitment == solution.id(), "Mismatching transmission ID (solution)");
solutions.push(solution);
}
(TransmissionID::Transaction(transaction_id, checksum), Transmission::Transaction(transaction)) => {
ensure!(checksum == transaction.to_checksum::<N>()?, "Mismatching transmission checksum (transaction)");
let transaction = transaction.deserialize_blocking()?;
ensure!(transaction_id == transaction.id(), "Mismatching transmission ID (transaction)");
transactions.push(transaction);
}
_ => bail!("Mismatching (transmission ID, transmission) entry"),
}
}
Ok((ratifications, solutions, transactions))
}