Skip to content

Commit

Permalink
fix: swb deser
Browse files Browse the repository at this point in the history
  • Loading branch information
losman0s committed Sep 4, 2024
1 parent 812278b commit d763374
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 69 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions src/geyser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use anchor_lang::AccountDeserialize;
use crossbeam::channel::Sender;
use futures::StreamExt;
use log::{error, info};
use marginfi::{instructions::marginfi_account, state::marginfi_account::MarginfiAccount};
use marginfi::state::marginfi_account::MarginfiAccount;
use solana_program::pubkey::Pubkey;
use solana_sdk::account::Account;
use std::{collections::HashMap, mem::size_of};
Expand Down Expand Up @@ -170,7 +170,6 @@ impl GeyserService {
}
}
}
Ok(())
}

/// Builds a geyser subscription request payload
Expand Down
84 changes: 50 additions & 34 deletions src/liquidator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,8 @@ use solana_sdk::{
account::Account, account_info::IntoAccountInfo, bs58, clock::Clock, signature::Keypair,
};
use std::{
cell::RefCell,
cmp::min,
collections::HashMap,
rc::Rc,
sync::{atomic::AtomicBool, Arc},
};
use switchboard_on_demand::PullFeedAccountData;
Expand Down Expand Up @@ -155,28 +153,44 @@ impl Liquidator {
match msg.account_type {
AccountType::OracleAccount => {
if let Some(bank_to_update_pk) = self.oracle_to_bank.get(&msg.address) {
let oracle_ai = (&msg.address, &mut msg.account).into_account_info();
let bank_to_update: &mut BankWrapper =
self.banks.get_mut(bank_to_update_pk).unwrap();

let oracle_price_adapter =
OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank_to_update.bank.config,
&[oracle_ai.clone()],
&Clock::default(),
i64::MAX as u64,
)
.unwrap();

match oracle_price_adapter {
OraclePriceFeedAdapter::SwitchboardPull(_) => {
let full_swb =
crate::utils::load_swb_pull_account(&oracle_ai).unwrap();
let feed_hash = hex::encode(full_swb.feed_hash);
let oracle_price_adapter = match bank_to_update.bank.config.oracle_setup
{
OracleSetup::SwitchboardPull => {
let mut offsets_data =
[0u8; std::mem::size_of::<PullFeedAccountData>()];
offsets_data.copy_from_slice(
&msg.account.data
[8..std::mem::size_of::<PullFeedAccountData>() + 8],
);
let swb_feed = crate::utils::load_swb_pull_account_from_bytes(
&offsets_data,
)
.unwrap();

let feed_hash = hex::encode(swb_feed.feed_hash);
bank_to_update.oracle_adapter.swb_feed_hash = Some(feed_hash);

OraclePriceFeedAdapter::SwitchboardPull(
SwitchboardPullPriceFeed {
feed: Box::new((&swb_feed).into()),
},
)
}
_ => {}
}
_ => {
let oracle_account_info =
(&msg.address, &mut msg.account).into_account_info();
OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank_to_update.bank.config,
&[oracle_account_info],
&Clock::default(),
i64::MAX as u64,
)
.unwrap()
}
};

bank_to_update.oracle_adapter.price_adapter = oracle_price_adapter;
}
Expand Down Expand Up @@ -689,28 +703,30 @@ impl Liquidator {
(oracle_address.unwrap(), oracle_account.unwrap())
};

let mut oracle_account_info =
(&oracle_address, &mut oracle_account).into_account_info();

let price_adapter = match bank.config.oracle_setup {
OracleSetup::SwitchboardPull => {
let swb_feed = crate::utils::load_swb_pull_account_from_bytes(
&oracle_account_info.data.borrow()
[0..std::mem::size_of::<PullFeedAccountData>()],
)
.unwrap();
let mut offsets_data = [0u8; std::mem::size_of::<PullFeedAccountData>()];
offsets_data.copy_from_slice(
&oracle_account.data[8..std::mem::size_of::<PullFeedAccountData>() + 8],
);
let swb_feed =
crate::utils::load_swb_pull_account_from_bytes(&offsets_data).unwrap();

OraclePriceFeedAdapter::SwitchboardPull(SwitchboardPullPriceFeed {
feed: Box::new((&swb_feed).into()),
})
}
_ => OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank.config,
&[oracle_account_info],
&Clock::default(),
i64::MAX as u64,
)
.unwrap(),
_ => {
let oracle_account_info =
(&oracle_address, &mut oracle_account).into_account_info();
OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank.config,
&[oracle_account_info],
&Clock::default(),
i64::MAX as u64,
)
.unwrap()
}
};

self.banks.insert(
Expand Down
55 changes: 36 additions & 19 deletions src/rebalancer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use marginfi::{
constants::EXP_10_I80F48,
state::{
marginfi_account::{BalanceSide, MarginfiAccount, RequirementType},
price::{OraclePriceFeedAdapter, PriceAdapter, PriceBias},
price::{OraclePriceFeedAdapter, OracleSetup, PriceBias, SwitchboardPullPriceFeed},
},
};
use solana_client::rpc_client::RpcClient;
Expand All @@ -43,6 +43,7 @@ use std::{
collections::{HashMap, HashSet},
sync::{atomic::AtomicBool, Arc},
};
use switchboard_on_demand::PullFeedAccountData;

/// The rebalancer is responsible to keep the liquidator account
/// "rebalanced" -> Document this better
Expand Down Expand Up @@ -187,28 +188,44 @@ impl Rebalancer {
match msg.account_type {
AccountType::OracleAccount => {
if let Some(bank_to_update_pk) = self.oracle_to_bank.get(&msg.address) {
let oracle_ai = (&msg.address, &mut msg.account).into_account_info();
let bank_to_update: &mut BankWrapper =
self.banks.get_mut(bank_to_update_pk).unwrap();

let oracle_price_adapter =
OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank_to_update.bank.config,
&[oracle_ai.clone()],
&Clock::default(),
i64::MAX as u64,
)
.unwrap();

match oracle_price_adapter {
OraclePriceFeedAdapter::SwitchboardPull(_) => {
let full_swb =
crate::utils::load_swb_pull_account(&oracle_ai).unwrap();
let feed_hash = hex::encode(full_swb.feed_hash);
let oracle_price_adapter = match bank_to_update.bank.config.oracle_setup
{
OracleSetup::SwitchboardPull => {
let mut offsets_data =
[0u8; std::mem::size_of::<PullFeedAccountData>()];
offsets_data.copy_from_slice(
&msg.account.data
[8..std::mem::size_of::<PullFeedAccountData>() + 8],
);
let swb_feed = crate::utils::load_swb_pull_account_from_bytes(
&offsets_data,
)
.unwrap();

let feed_hash = hex::encode(swb_feed.feed_hash);
bank_to_update.oracle_adapter.swb_feed_hash = Some(feed_hash);

OraclePriceFeedAdapter::SwitchboardPull(
SwitchboardPullPriceFeed {
feed: Box::new((&swb_feed).into()),
},
)
}
_ => {
let oracle_account_info =
(&msg.address, &mut msg.account).into_account_info();
OraclePriceFeedAdapter::try_from_bank_config_with_max_age(
&bank_to_update.bank.config,
&[oracle_account_info],
&Clock::default(),
i64::MAX as u64,
)
.unwrap()
}
_ => {}
}
};

bank_to_update.oracle_adapter.price_adapter = oracle_price_adapter;
}
Expand Down Expand Up @@ -262,7 +279,7 @@ impl Rebalancer {
bank.oracle_adapter.simulated_price = Some(price);
}

self.should_stop_liquidations().await;
self.should_stop_liquidations().await.unwrap();
self.has_tokens_in_token_accounts()
|| self.has_non_preferred_deposits()
|| self.has_liabilities()
Expand Down
16 changes: 2 additions & 14 deletions src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ impl<'a> BankAccountWithPriceFeedEva<'a> {
.map(move |balance| {
let bank = banks
.get(&balance.bank_pk)
.ok_or_else(|| anyhow::anyhow!("Bank not found"))?
.ok_or_else(|| anyhow::anyhow!("Bank {:?} not found", balance.bank_pk))?
.clone();

Ok(BankAccountWithPriceFeedEva { bank, balance })
Expand Down Expand Up @@ -575,24 +575,12 @@ pub fn find_oracle_keys(bank_config: &BankConfig) -> Vec<Pubkey> {
}

pub fn load_swb_pull_account(account_info: &AccountInfo) -> anyhow::Result<PullFeedAccountData> {
let bytes = &account_info.data.borrow().to_vec();
let bytes = &account_info.data.borrow().to_vec()[8..std::mem::size_of::<PullFeedAccountData>()];

Ok(load_swb_pull_account_from_bytes(bytes)?)
}

pub fn load_swb_pull_account_from_bytes(bytes: &[u8]) -> anyhow::Result<PullFeedAccountData> {
println!(
"struct alignment {}",
std::mem::align_of::<PullFeedAccountData>()
);
println!("bytes alignment {}", std::mem::align_of_val(bytes));
println!(
"offset {}",
bytes
.as_ptr()
.align_offset(std::mem::align_of::<PullFeedAccountData>())
);

if bytes
.as_ptr()
.align_offset(std::mem::align_of::<PullFeedAccountData>())
Expand Down

0 comments on commit d763374

Please sign in to comment.