use instant::Instant;
use crate::{
client::secret::SecretManage,
wallet::{
account::{
constants::PARALLEL_REQUESTS_AMOUNT, types::address::AddressWithUnspentOutputs, Account, OutputData,
},
task,
},
};
impl<S: 'static + SecretManage> Account<S>
where
crate::wallet::Error: From<S::Error>,
{
pub(crate) async fn get_outputs_from_address_output_ids(
&self,
addresses_with_unspent_outputs: Vec<AddressWithUnspentOutputs>,
) -> crate::wallet::Result<(Vec<AddressWithUnspentOutputs>, Vec<OutputData>)> {
log::debug!("[SYNC] start get_outputs_from_address_output_ids");
let address_outputs_start_time = Instant::now();
let mut addresses_with_outputs = Vec::new();
let mut outputs_data = Vec::new();
for addresses_chunk in &mut addresses_with_unspent_outputs
.chunks(PARALLEL_REQUESTS_AMOUNT)
.map(|x: &[AddressWithUnspentOutputs]| x.to_vec())
{
let mut tasks = Vec::new();
for address in addresses_chunk {
let account = self.clone();
tasks.push(async move {
task::spawn(async move {
let output_responses = account.get_outputs(address.output_ids.clone()).await?;
let outputs = account
.output_response_to_output_data(output_responses, &address)
.await?;
crate::wallet::Result::Ok((address, outputs))
})
.await
});
}
let results = futures::future::try_join_all(tasks).await?;
for res in results {
let (address, outputs): (AddressWithUnspentOutputs, Vec<OutputData>) = res?;
addresses_with_outputs.push(address);
outputs_data.extend(outputs);
}
}
log::debug!(
"[SYNC] finished get_outputs_from_address_output_ids in {:.2?}",
address_outputs_start_time.elapsed()
);
Ok((addresses_with_outputs, outputs_data))
}
}