use a Vec for fallbacks in ScannedBanksAndOracles
This commit is contained in:
parent
59001b3631
commit
b19678f874
|
@ -200,7 +200,7 @@ impl<T: KeyedAccountReader> AccountRetriever for FixedOrderAccountRetriever<T> {
|
||||||
pub struct ScannedBanksAndOracles<'a, 'info> {
|
pub struct ScannedBanksAndOracles<'a, 'info> {
|
||||||
banks: Vec<AccountInfoRefMut<'a, 'info>>,
|
banks: Vec<AccountInfoRefMut<'a, 'info>>,
|
||||||
oracles: Vec<AccountInfoRef<'a, 'info>>,
|
oracles: Vec<AccountInfoRef<'a, 'info>>,
|
||||||
fallback_oracles: HashMap<Pubkey, AccountInfoRef<'a, 'info>>,
|
fallback_oracles: Vec<AccountInfoRef<'a, 'info>>,
|
||||||
index_map: HashMap<TokenIndex, usize>,
|
index_map: HashMap<TokenIndex, usize>,
|
||||||
staleness_slot: Option<u64>,
|
staleness_slot: Option<u64>,
|
||||||
}
|
}
|
||||||
|
@ -227,7 +227,10 @@ impl<'a, 'info> ScannedBanksAndOracles<'a, 'info> {
|
||||||
let index = self.bank_index(token_index1)?;
|
let index = self.bank_index(token_index1)?;
|
||||||
let bank = self.banks[index].load_mut_fully_unchecked::<Bank>()?;
|
let bank = self.banks[index].load_mut_fully_unchecked::<Bank>()?;
|
||||||
let oracle = &self.oracles[index];
|
let oracle = &self.oracles[index];
|
||||||
let fallback_oracle_opt = self.fallback_oracles.get(&bank.fallback_oracle);
|
let fallback_oracle_opt = self
|
||||||
|
.fallback_oracles
|
||||||
|
.iter()
|
||||||
|
.find(|ai| ai.key() == &bank.fallback_oracle);
|
||||||
let price =
|
let price =
|
||||||
bank.oracle_price_with_fallback(oracle, fallback_oracle_opt, self.staleness_slot)?;
|
bank.oracle_price_with_fallback(oracle, fallback_oracle_opt, self.staleness_slot)?;
|
||||||
return Ok((bank, price, None));
|
return Ok((bank, price, None));
|
||||||
|
@ -247,8 +250,14 @@ impl<'a, 'info> ScannedBanksAndOracles<'a, 'info> {
|
||||||
let bank2 = second_bank_part[second - (first + 1)].load_mut_fully_unchecked::<Bank>()?;
|
let bank2 = second_bank_part[second - (first + 1)].load_mut_fully_unchecked::<Bank>()?;
|
||||||
let oracle1 = &self.oracles[first];
|
let oracle1 = &self.oracles[first];
|
||||||
let oracle2 = &self.oracles[second];
|
let oracle2 = &self.oracles[second];
|
||||||
let fallback_oracle_opt1 = self.fallback_oracles.get(&bank1.fallback_oracle);
|
let fallback_oracle_opt1 = self
|
||||||
let fallback_oracle_opt2 = self.fallback_oracles.get(&bank2.fallback_oracle);
|
.fallback_oracles
|
||||||
|
.iter()
|
||||||
|
.find(|ai| ai.key() == &bank1.fallback_oracle);
|
||||||
|
let fallback_oracle_opt2 = self
|
||||||
|
.fallback_oracles
|
||||||
|
.iter()
|
||||||
|
.find(|ai| ai.key() == &bank2.fallback_oracle);
|
||||||
let price1 =
|
let price1 =
|
||||||
bank1.oracle_price_with_fallback(oracle1, fallback_oracle_opt1, self.staleness_slot)?;
|
bank1.oracle_price_with_fallback(oracle1, fallback_oracle_opt1, self.staleness_slot)?;
|
||||||
let price2 =
|
let price2 =
|
||||||
|
@ -265,7 +274,10 @@ impl<'a, 'info> ScannedBanksAndOracles<'a, 'info> {
|
||||||
// The account was already loaded successfully during construction
|
// The account was already loaded successfully during construction
|
||||||
let bank = self.banks[index].load_fully_unchecked::<Bank>()?;
|
let bank = self.banks[index].load_fully_unchecked::<Bank>()?;
|
||||||
let oracle = &self.oracles[index];
|
let oracle = &self.oracles[index];
|
||||||
let fallback_oracle_opt = self.fallback_oracles.get(&bank.fallback_oracle);
|
let fallback_oracle_opt = self
|
||||||
|
.fallback_oracles
|
||||||
|
.iter()
|
||||||
|
.find(|ai| ai.key() == &bank.fallback_oracle);
|
||||||
let price =
|
let price =
|
||||||
bank.oracle_price_with_fallback(oracle, fallback_oracle_opt, self.staleness_slot)?;
|
bank.oracle_price_with_fallback(oracle, fallback_oracle_opt, self.staleness_slot)?;
|
||||||
|
|
||||||
|
@ -367,25 +379,21 @@ impl<'a, 'info> ScanningAccountRetriever<'a, 'info> {
|
||||||
let serum3_start = perp_oracles_start + n_perps;
|
let serum3_start = perp_oracles_start + n_perps;
|
||||||
let n_serum3 = ais[serum3_start..]
|
let n_serum3 = ais[serum3_start..]
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|x| serum3_cpi::load_open_orders_ref(x).is_ok())
|
.filter(|x| x.data_len() == std::mem::size_of::<serum_dex::state::OpenOrders>() + 12)
|
||||||
.count();
|
.count();
|
||||||
let fallback_oracles_start = serum3_start + n_serum3;
|
let fallback_oracles_start = serum3_start + n_serum3;
|
||||||
let fallback_oracles: HashMap<Pubkey, AccountInfoRef> = ais[fallback_oracles_start..]
|
|
||||||
.into_iter()
|
|
||||||
.map(|ai| (ai.key(), AccountInfoRef::borrow(ai).unwrap()))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
banks_and_oracles: ScannedBanksAndOracles {
|
banks_and_oracles: ScannedBanksAndOracles {
|
||||||
banks: AccountInfoRefMut::borrow_slice(&ais[..n_banks])?,
|
banks: AccountInfoRefMut::borrow_slice(&ais[..n_banks])?,
|
||||||
oracles: AccountInfoRef::borrow_slice(&ais[n_banks..perps_start])?,
|
oracles: AccountInfoRef::borrow_slice(&ais[n_banks..perps_start])?,
|
||||||
fallback_oracles,
|
fallback_oracles: AccountInfoRef::borrow_slice(&ais[fallback_oracles_start..])?,
|
||||||
index_map: token_index_map,
|
index_map: token_index_map,
|
||||||
staleness_slot,
|
staleness_slot,
|
||||||
},
|
},
|
||||||
perp_markets: AccountInfoRef::borrow_slice(&ais[perps_start..perp_oracles_start])?,
|
perp_markets: AccountInfoRef::borrow_slice(&ais[perps_start..perp_oracles_start])?,
|
||||||
perp_oracles: AccountInfoRef::borrow_slice(&ais[perp_oracles_start..serum3_start])?,
|
perp_oracles: AccountInfoRef::borrow_slice(&ais[perp_oracles_start..serum3_start])?,
|
||||||
serum3_oos: AccountInfoRef::borrow_slice(&ais[serum3_start..])?,
|
serum3_oos: AccountInfoRef::borrow_slice(&ais[serum3_start..fallback_oracles_start])?,
|
||||||
perp_index_map,
|
perp_index_map,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,11 +182,11 @@ pub fn token_withdraw(ctx: Context<TokenWithdraw>, amount: u64, allow_borrow: bo
|
||||||
// When borrowing the price has be trustworthy, so we can do a reasonable
|
// When borrowing the price has be trustworthy, so we can do a reasonable
|
||||||
// net borrow check.
|
// net borrow check.
|
||||||
let slot_opt = Some(Clock::get()?.slot);
|
let slot_opt = Some(Clock::get()?.slot);
|
||||||
unsafe_oracle_state.check_confidence_and_maybe_staleness(
|
unsafe_oracle_state
|
||||||
&bank.name(),
|
.check_confidence_and_maybe_staleness(&bank.name(), &bank.oracle_config, slot_opt)
|
||||||
&bank.oracle_config,
|
.with_context(|| {
|
||||||
slot_opt,
|
oracle_log_context(&unsafe_oracle_state, &bank.oracle_config, slot_opt)
|
||||||
).with_context(|| oracle_log_context(&unsafe_oracle_state, &bank.oracle_config, slot_opt))?;
|
})?;
|
||||||
bank.check_net_borrows(unsafe_oracle_state.price)?;
|
bank.check_net_borrows(unsafe_oracle_state.price)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue