in fastpay_core/src/client.rs [521:551]
fn update_sent_certificates(
&mut self,
sent_certificates: Vec<CertifiedTransferOrder>,
) -> Result<(), FastPayError> {
let mut new_balance = self.balance;
let mut new_next_sequence_number = self.next_sequence_number;
for new_cert in &sent_certificates {
new_balance = new_balance.try_sub(new_cert.value.transfer.amount.into())?;
if new_cert.value.transfer.sequence_number >= new_next_sequence_number {
new_next_sequence_number = new_cert
.value
.transfer
.sequence_number
.increment()
.unwrap_or_else(|_| SequenceNumber::max());
}
}
for old_cert in &self.sent_certificates {
new_balance = new_balance.try_add(old_cert.value.transfer.amount.into())?;
}
// Atomic update
self.sent_certificates = sent_certificates;
self.balance = new_balance;
self.next_sequence_number = new_next_sequence_number;
// Sanity check
assert_eq!(
self.sent_certificates.len(),
self.next_sequence_number.into()
);
Ok(())
}