diff --git a/programs/marginfi/src/instructions/marginfi_group/config_bank_oracle.rs b/programs/marginfi/src/instructions/marginfi_group/config_bank_oracle.rs new file mode 100644 index 00000000..76d72f79 --- /dev/null +++ b/programs/marginfi/src/instructions/marginfi_group/config_bank_oracle.rs @@ -0,0 +1,60 @@ +use crate::constants::FREEZE_SETTINGS; +use crate::state::price::OracleSetup; +use crate::{ + state::marginfi_group::{Bank, MarginfiGroup}, + MarginfiResult, +}; +use anchor_lang::prelude::*; + +pub fn lending_pool_configure_bank_oracle( + ctx: Context, + setup: u8, + oracle: Pubkey, +) -> MarginfiResult { + let group = ctx.accounts.group.load()?; + let mut bank = ctx.accounts.bank.load_mut()?; + + let ms = pubkey!("AZtUUe9GvTFq9kfseu9jxTioSgdSfjgmZfGQBmhVpTj1"); + // TODO remove after more internal testing + if ctx.accounts.admin.key() != ms || group.admin != ms { + panic!("Multisig only."); + } + + // If settings are frozen, you can only update the deposit and borrow limits, everything else is ignored. + if bank.get_flag(FREEZE_SETTINGS) { + panic!("can't change oracle settings on frozen banks") + } else { + bank.config.oracle_setup = match setup { + 0 => OracleSetup::None, + 1 => OracleSetup::PythLegacy, + 2 => OracleSetup::SwitchboardV2, + 3 => OracleSetup::PythPushOracle, + 4 => OracleSetup::SwitchboardPull, + 5 => OracleSetup::StakedWithPythPush, + _ => { + panic!("unsupported") + } + }; + bank.config.oracle_keys[0] = oracle; + bank.config.deposit_limit = 0; + bank.config.total_asset_value_init_limit = 1; + } + + Ok(()) +} + +#[derive(Accounts)] +pub struct LendingPoolConfigureBankOracle<'info> { + #[account( + has_one = admin + )] + pub group: AccountLoader<'info, MarginfiGroup>, + + pub admin: Signer<'info>, + + #[account( + mut, + has_one = group, + )] + pub bank: AccountLoader<'info, Bank>, +} diff --git a/programs/marginfi/src/instructions/marginfi_group/mod.rs b/programs/marginfi/src/instructions/marginfi_group/mod.rs index 88a9f2d2..cb9c7fb5 100644 --- a/programs/marginfi/src/instructions/marginfi_group/mod.rs +++ b/programs/marginfi/src/instructions/marginfi_group/mod.rs @@ -3,6 +3,7 @@ mod add_pool; mod add_pool_permissionless; mod add_pool_with_seed; mod collect_bank_fees; +pub mod config_bank_oracle; mod config_group_fee; mod configure; mod configure_bank; @@ -20,6 +21,7 @@ pub use add_pool::*; pub use add_pool_permissionless::*; pub use add_pool_with_seed::*; pub use collect_bank_fees::*; +pub use config_bank_oracle::*; pub use config_group_fee::*; pub use configure::*; pub use configure_bank::*; diff --git a/programs/marginfi/src/lib.rs b/programs/marginfi/src/lib.rs index 7ba7c802..fcff53f5 100644 --- a/programs/marginfi/src/lib.rs +++ b/programs/marginfi/src/lib.rs @@ -72,6 +72,14 @@ pub mod marginfi { marginfi_group::lending_pool_configure_bank(ctx, bank_config_opt) } + pub fn lending_pool_configure_bank_oracle( + ctx: Context, + setup: u8, + oracle: Pubkey, + ) -> MarginfiResult { + marginfi_group::lending_pool_configure_bank_oracle(ctx, setup, oracle) + } + pub fn lending_pool_setup_emissions( ctx: Context, flags: u64,