fix name and error message check in flash loan (#145)

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
microwavedcola1 2022-08-06 12:59:13 +02:00 committed by GitHub
parent 2880a2ec88
commit 59d28c97a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 22 additions and 18 deletions

View File

@ -77,19 +77,20 @@ pub fn flash_loan_begin<'key, 'accounts, 'remaining, 'info>(
require_keys_eq!(bank.group, ctx.accounts.group.key());
require_keys_eq!(bank.vault, *vault_ai.key);
let vault = Account::<TokenAccount>::try_from(vault_ai)?;
let token_account = Account::<TokenAccount>::try_from(token_account_ai)?;
bank.flash_loan_approved_amount = *amount;
bank.flash_loan_vault_initial = token_account.amount;
bank.flash_loan_token_account_initial = token_account.amount;
// Transfer the loaned funds
if *amount > 0 {
// Provide a readable error message in case the vault doesn't have enough tokens
if token_account.amount < *amount {
if vault.amount < *amount {
return err!(MangoError::InsufficentBankVaultFunds).with_context(|| {
format!(
"bank vault {} does not have enough tokens, need {} but have {}",
vault_ai.key, amount, token_account.amount
vault_ai.key, amount, vault.amount
)
});
}
@ -235,7 +236,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
// The Begin instruction only checks that End ends with the same vault accounts -
// but there could be an extra vault account in End, or a different bank could be
// used for the same vault.
require_neq!(bank.flash_loan_vault_initial, u64::MAX);
require_neq!(bank.flash_loan_token_account_initial, u64::MAX);
// Create the token position now, so we can compute the pre-health with fixed order health accounts
let (_, raw_token_index, _) = account.token_get_mut_or_create(bank.token_index)?;
@ -243,7 +244,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
// Transfer any excess over the inital balance of the token account back
// into the vault. Compute the total change in the vault balance.
let mut change = -I80F48::from(bank.flash_loan_approved_amount);
if token_account.amount > bank.flash_loan_vault_initial {
if token_account.amount > bank.flash_loan_token_account_initial {
let transfer_ctx = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
token::Transfer {
@ -252,7 +253,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
authority: ctx.accounts.owner.to_account_info(),
},
);
let repay = token_account.amount - bank.flash_loan_vault_initial;
let repay = token_account.amount - bank.flash_loan_token_account_initial;
token::transfer(transfer_ctx, repay)?;
let repay = I80F48::from(repay);
@ -324,7 +325,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>(
}
bank.flash_loan_approved_amount = 0;
bank.flash_loan_vault_initial = u64::MAX;
bank.flash_loan_token_account_initial = u64::MAX;
token_loan_details.push(FlashLoanTokenDetail {
token_index: position.token_index,

View File

@ -109,7 +109,7 @@ pub fn token_edit(
// unchanged -
// dust
// flash_loan_vault_initial
// flash_loan_token_account_initial
// flash_loan_approved_amount
// token_index
// bump

View File

@ -131,7 +131,7 @@ pub fn token_register(
init_liab_weight: I80F48::from_num(init_liab_weight),
liquidation_fee: I80F48::from_num(liquidation_fee),
dust: I80F48::ZERO,
flash_loan_vault_initial: u64::MAX,
flash_loan_token_account_initial: u64::MAX,
flash_loan_approved_amount: 0,
token_index,
bump: *ctx.bumps.get("bank").ok_or(MangoError::SomeError)?,

View File

@ -103,7 +103,7 @@ pub fn token_register_trustless(
init_liab_weight: I80F48::from_num(1.5),
liquidation_fee: I80F48::from_num(0.125),
dust: I80F48::ZERO,
flash_loan_vault_initial: u64::MAX,
flash_loan_token_account_initial: u64::MAX,
flash_loan_approved_amount: 0,
token_index,
bump: *ctx.bumps.get("bank").ok_or(MangoError::SomeError)?,

View File

@ -82,7 +82,7 @@ pub struct Bank {
// Collection of all fractions-of-native-tokens that got rounded away
pub dust: I80F48,
pub flash_loan_vault_initial: u64,
pub flash_loan_token_account_initial: u64,
pub flash_loan_approved_amount: u64,
// Index into TokenInfo on the group
@ -145,7 +145,10 @@ impl std::fmt::Debug for Bank {
"flash_loan_approved_amount",
&self.flash_loan_approved_amount,
)
.field("flash_loan_vault_initial", &self.flash_loan_vault_initial)
.field(
"flash_loan_token_account_initial",
&self.flash_loan_token_account_initial,
)
.field("reserved", &self.reserved)
.finish()
}
@ -185,7 +188,7 @@ impl Bank {
liquidation_fee: existing_bank.liquidation_fee,
dust: I80F48::ZERO,
flash_loan_approved_amount: 0,
flash_loan_vault_initial: u64::MAX,
flash_loan_token_account_initial: u64::MAX,
token_index: existing_bank.token_index,
bump: existing_bank.bump,
mint_decimals: existing_bank.mint_decimals,

View File

@ -63,7 +63,7 @@ export class Bank {
initLiabWeight: I80F48Dto;
liquidationFee: I80F48Dto;
dust: I80F48Dto;
flashLoanVaultInitial: BN;
flashLoanTokenAccountInitial: BN;
flashLoanApprovedAmount: BN;
tokenIndex: number;
mintDecimals: number;
@ -102,7 +102,7 @@ export class Bank {
obj.initLiabWeight,
obj.liquidationFee,
obj.dust,
obj.flashLoanVaultInitial,
obj.flashLoanTokenAccountInitial,
obj.flashLoanApprovedAmount,
obj.tokenIndex,
obj.mintDecimals,
@ -142,7 +142,7 @@ export class Bank {
initLiabWeight: I80F48Dto,
liquidationFee: I80F48Dto,
dust: I80F48Dto,
flashLoanVaultInitial: BN,
flashLoanTokenAccountInitial: BN,
flashLoanApprovedAmount: BN,
public tokenIndex: number,
public mintDecimals: number,

View File

@ -2830,7 +2830,7 @@ export type MangoV4 = {
}
},
{
"name": "flashLoanVaultInitial",
"name": "flashLoanTokenAccountInitial",
"type": "u64"
},
{
@ -7843,7 +7843,7 @@ export const IDL: MangoV4 = {
}
},
{
"name": "flashLoanVaultInitial",
"name": "flashLoanTokenAccountInitial",
"type": "u64"
},
{