From 349df28061e5772f375c373c4ae42bbe7e1c21cd Mon Sep 17 00:00:00 2001 From: y2kappa Date: Thu, 8 Aug 2024 16:02:04 +0100 Subject: [PATCH] Release 1.6.2 (#16) * release changes * . * . --- Cargo.lock | 14 ++++---- .../src/handlers/handler_init_obligation.rs | 2 +- ...ndler_init_obligation_farms_for_reserve.rs | 2 +- .../handlers/handler_update_reserve_config.rs | 6 +++- .../src/lending_market/lending_operations.rs | 36 +++++++++++++------ programs/klend/src/lib.rs | 2 ++ 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da41524..941c344 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -708,9 +708,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.83" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" dependencies = [ "jobserver", "libc", @@ -1391,9 +1391,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1450,9 +1450,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libsecp256k1" @@ -2181,7 +2181,7 @@ dependencies = [ "anchor-lang", "bytemuck", "cfg-if", - "num_enum 0.5.11", + "num_enum 0.7.1", "solana-program", ] diff --git a/programs/klend/src/handlers/handler_init_obligation.rs b/programs/klend/src/handlers/handler_init_obligation.rs index cbea250..ea97afb 100644 --- a/programs/klend/src/handlers/handler_init_obligation.rs +++ b/programs/klend/src/handlers/handler_init_obligation.rs @@ -1,5 +1,5 @@ use anchor_lang::{prelude::*, Accounts}; -use anchor_spl::token::Mint; +use anchor_spl::token_interface::Mint; use crate::{ state::{ diff --git a/programs/klend/src/handlers/handler_init_obligation_farms_for_reserve.rs b/programs/klend/src/handlers/handler_init_obligation_farms_for_reserve.rs index c7a49e0..55066ed 100644 --- a/programs/klend/src/handlers/handler_init_obligation_farms_for_reserve.rs +++ b/programs/klend/src/handlers/handler_init_obligation_farms_for_reserve.rs @@ -13,7 +13,7 @@ pub fn process(ctx: Context, mode: u8) -> Result< let obligation = &ctx.accounts.obligation.to_account_info().key; require!( - reserve.config.status() == ReserveStatus::Active, + reserve.config.status() != ReserveStatus::Obsolete, LendingError::ReserveObsolete ); diff --git a/programs/klend/src/handlers/handler_update_reserve_config.rs b/programs/klend/src/handlers/handler_update_reserve_config.rs index c7ba9e3..ae9bb0e 100644 --- a/programs/klend/src/handlers/handler_update_reserve_config.rs +++ b/programs/klend/src/handlers/handler_update_reserve_config.rs @@ -41,7 +41,11 @@ pub fn process( ); msg!("WARNING! Skipping validation of the config"); } else { - lending_operations::utils::validate_reserve_config(&reserve.config, &market)?; + lending_operations::utils::validate_reserve_config( + &reserve.config, + &market, + ctx.accounts.reserve.key(), + )?; } Ok(()) diff --git a/programs/klend/src/lending_market/lending_operations.rs b/programs/klend/src/lending_market/lending_operations.rs index d4deb25..4dbb715 100644 --- a/programs/klend/src/lending_market/lending_operations.rs +++ b/programs/klend/src/lending_market/lending_operations.rs @@ -1616,12 +1616,19 @@ where let absolute_referral_rate = Fraction::from_bits(borrow_reserve.liquidity.absolute_referral_rate_sf); + if absolute_referral_rate == Fraction::ZERO { + return Ok(()); + } + let fixed_rate = approximate_compounded_interest( Fraction::from_bps(borrow_reserve.config.host_fixed_interest_rate_bps), slots_elapsed, ); let net_new_debt = borrowed_amount_f - previous_borrowed_amount_f; let net_new_fixed_debt = previous_borrowed_amount_f * fixed_rate - previous_borrowed_amount_f; + if net_new_fixed_debt > net_new_debt { + return Err(LendingError::CannotCalculateReferralAmountDueToSlotsMismatch.into()); + } let net_new_variable_debt_f = net_new_debt - net_new_fixed_debt; let referrer_fee_f = net_new_variable_debt_f * absolute_referral_rate; @@ -2932,7 +2939,11 @@ pub mod utils { Ok(()) } - pub fn validate_reserve_config(config: &ReserveConfig, market: &LendingMarket) -> Result<()> { + pub fn validate_reserve_config( + config: &ReserveConfig, + market: &LendingMarket, + reserve_address: Pubkey, + ) -> Result<()> { if config.loan_to_value_pct >= 100 { msg!("Loan to value ratio must be in range [0, 100)"); return err!(LendingError::InvalidConfig); @@ -3008,21 +3019,24 @@ pub mod utils { return err!(LendingError::InvalidConfig); } - if elevation_group.liquidation_threshold_pct < config.liquidation_threshold_pct { - msg!("Invalid liquidation threshold, elevation id liquidation threshold must be greater than the config's"); - return err!(LendingError::InvalidConfig); - } - - if elevation_group.ltv_pct < config.loan_to_value_pct { - msg!("Invalid ltv ratio, cannot be bigger than the ltv ratio"); - return err!(LendingError::InvalidConfig); - } - if elevation_group.debt_reserve == Pubkey::default() { msg!("Invalid elevation group debt reserve"); return err!(LendingError::InvalidConfig); } + if elevation_group.debt_reserve != reserve_address { + if elevation_group.liquidation_threshold_pct < config.liquidation_threshold_pct + { + msg!("Invalid liquidation threshold, elevation id liquidation threshold must be greater than the config's"); + return err!(LendingError::InvalidConfig); + } + + if elevation_group.ltv_pct < config.loan_to_value_pct { + msg!("Invalid ltv ratio, cannot be bigger than the ltv ratio"); + return err!(LendingError::InvalidConfig); + } + } + if elevation_group.max_reserves_as_collateral == 0 { msg!("Invalid elevation group max collateral reserves"); return err!(LendingError::InvalidConfig); diff --git a/programs/klend/src/lib.rs b/programs/klend/src/lib.rs index 0904424..bddb6eb 100644 --- a/programs/klend/src/lib.rs +++ b/programs/klend/src/lib.rs @@ -494,6 +494,8 @@ pub enum LendingError { UnsupportedTokenExtension, #[msg("Can't have an spl token mint with a t22 account")] InvalidTokenAccount, + #[msg("Cannot calculate referral amount due to slots mismatch")] + CannotCalculateReferralAmountDueToSlotsMismatch, } pub type LendingResult = std::result::Result;