in fastpay_core/src/fastpay_smart_contract.rs [68:92]
fn handle_redeem_transaction(
&mut self,
transaction: RedeemTransaction,
) -> Result<(), failure::Error> {
transaction.transfer_certificate.check(&self.committee)?;
let order = transaction.transfer_certificate.value;
let transfer = &order.transfer;
ensure!(
self.total_balance >= transfer.amount,
"The balance on the blockchain cannot be negative",
);
let account = self
.accounts
.entry(transfer.sender)
.or_insert_with(AccountOnchainState::new);
ensure!(
account.last_redeemed < Some(transfer.sequence_number),
"Transfer certificates to Primary must have increasing sequence numbers.",
);
account.last_redeemed = Some(transfer.sequence_number);
self.total_balance = self.total_balance.try_sub(transfer.amount)?;
// Transfer Primary coins to order.recipient
Ok(())
}