use std::collections::{BTreeMap, BTreeSet};
use commit_verify::CommitConceal;
use rgb_core::bundle::NoDataError;
use rgb_core::{
seal, ConcealSeals, ConcealState, Node, RevealSeals, SealEndpoint, TransitionBundle,
};
use super::StateTransfer;
impl StateTransfer {
pub fn finalize(&mut self, expose: &BTreeSet<SealEndpoint>) -> Result<usize, NoDataError> {
let concealed_endpoints = expose
.iter()
.map(SealEndpoint::commit_conceal)
.collect::<Vec<_>>();
let mut removed_endpoints = vec![];
self.endseals = self
.endseals
.clone()
.into_iter()
.filter(|(_, endpoint)| {
if expose.contains(endpoint) {
true
} else {
removed_endpoints.push(*endpoint);
false
}
})
.collect();
let seals_to_conceal = removed_endpoints
.iter()
.map(SealEndpoint::commit_conceal)
.collect::<Vec<_>>();
let mut count = 0usize;
self.anchored_bundles = self
.anchored_bundles
.iter()
.map(|(anchor, bundle)| {
let bundle = bundle
.revealed_iter()
.map(|(transition, inputs)| {
let mut transition = transition.clone();
count += transition.conceal_state_except(&concealed_endpoints)
+ transition.conceal_seals(&seals_to_conceal);
(transition, inputs.clone())
})
.collect::<BTreeMap<_, _>>();
let new_bundle = TransitionBundle::try_from(bundle)?;
Ok((anchor.clone(), new_bundle))
})
.collect::<Result<Vec<_>, _>>()?
.try_into()
.expect("the size of the original collection has not changed");
count = self
.state_extensions
.iter_mut()
.fold(count, |count, extension| {
count + extension.conceal_state_except(&concealed_endpoints)
});
Ok(count)
}
}
impl RevealSeals for StateTransfer {
fn reveal_seals(&mut self, known_seals: &[seal::Revealed]) -> usize {
let mut counter = 0;
for (_, bundle) in self.anchored_bundles.iter_mut() {
counter += bundle.reveal_seals(known_seals);
}
for extension in self.state_extensions.iter_mut() {
for (_, assignment) in extension.owned_rights_mut().iter_mut() {
counter += assignment.reveal_seals(known_seals)
}
}
counter
}
}