Pembayaran Kembali
Instruksi pembayaran kembali melengkapi siklus flash loan kita dengan memastikan dana yang dipinjam dikembalikan dengan biaya yang sesuai. Instruksi ini melakukan dua langkah penting:
Ekstrak jumlah pinjaman: Gunakan introspeksi instruksi untuk mengambil
amount_borrowedasli dari data instruksi peminjamanTransfer dana kembali: Hitung
feedan transfer jumlah yang dipinjam plus biaya kembali ke protokol
Introspeksi Instruksi
Pertama, kita perlu memeriksa instruksi pertama dalam transaksi untuk mengekstrak jumlah pinjaman asli:
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());
}Transfer Dana
Selanjutnya, kita menghitung biaya protokol dan mentransfer jumlah total kembali:
// 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
)?;Biaya kita dikodekan tetap sebesar 500 basis poin, dan kita melakukan matematika "checked" untuk memastikan bahwa jumlahnya tidak overflow yang bisa dieksploitasi dengan angka yang sangat besar. Selain itu, kita mengkonversi jumlah ke u128 untuk perkalian guna mencegah overflow menengah, kemudian kita dengan aman mengkonversi kembali ke u64