Rückzahlung
Die Rückzahlungsanweisung schließt unseren Flash-Loan-Zyklus ab, indem sie sicherstellt, dass die geliehenen Mittel mit entsprechenden Gebühren zurückgegeben werden. Diese Anweisung führt zwei wesentliche Schritte aus:
Kreditbetrag extrahieren: Verwenden Sie Anweisungsintrospektion, um den ursprünglichen
amount_borrowedaus den Daten der Ausleihungsanweisung abzurufenMittel zurücküberweisen: Berechnen Sie die
feeund überweisen Sie den geliehenen Betrag plus Gebühr zurück an das Protokoll
Anweisungsintrospektion
Zunächst müssen wir die erste Anweisung in der Transaktion untersuchen, um den ursprünglichen Kreditbetrag zu extrahieren:
let ixs = ctx.accounts.instructions.to_account_info();
let mut amount_borrowed: u64;
if let Ok(borrow_ix) = load_instruction_at_checked(0, &ixs) {
// Check the amount borrowed:
let mut borrowed_data: [u8;8] = [0u8;8];
borrowed_data.copy_from_slice(&borrow_ix.data[8..16]);
amount_borrowed = u64::from_le_bytes(borrowed_data)
} else {
return Err(ProtocolError::MissingBorrowIx.into());
}Mittelüberweisung
Als Nächstes berechnen wir die Protokollgebühr und überweisen den Gesamtbetrag zurück:
// Add the fee to the amount borrowed (In our case we hardcoded it to 500 basis point)
let fee = (amount_borrowed as u128).checked_mul(500).unwrap().checked_div(10_000).ok_or(ProtocolError::Overflow)? as u64;
amount_borrowed = amount_borrowed.checked_add(fee).ok_or(ProtocolError::Overflow)?;
// Transfer the funds from the protocol to the borrower
transfer(
CpiContext::new(ctx.accounts.token_program.to_account_info(), Transfer {
from: ctx.accounts.borrower_ata.to_account_info(),
to: ctx.accounts.protocol_ata.to_account_info(),
authority: ctx.accounts.borrower.to_account_info(),
}),
amount_borrowed
)?;Unsere Gebühr ist fest auf 500 Basispunkte codiert, und wir führen "geprüfte" Mathematik durch, um sicherzustellen, dass der Betrag nicht überläuft, was mit sehr großen Zahlen ausgenutzt werden könnte. Zusätzlich konvertieren wir den Betrag in u128 für die Multiplikation, um einen Zwischenüberlauf zu verhindern, dann wandeln wir sicher zurück in u64