use anchor_lang::prelude::*;
use crate::{
states::{market::utils::Adl, Chainlink, Market, Oracle, Store, TokenMapHeader},
utils::internal,
};
#[derive(Accounts)]
pub struct UpdateAdlState<'info> {
pub authority: Signer<'info>,
#[account(has_one = token_map)]
pub store: AccountLoader<'info, Store>,
#[account(has_one = store)]
pub token_map: AccountLoader<'info, TokenMapHeader>,
#[account(mut, has_one = store)]
pub oracle: AccountLoader<'info, Oracle>,
#[account(mut, has_one = store)]
pub market: AccountLoader<'info, Market>,
pub chainlink_program: Option<Program<'info, Chainlink>>,
}
pub(crate) fn unchecked_update_adl_state<'info>(
ctx: Context<'_, '_, 'info, 'info, UpdateAdlState<'info>>,
is_long: bool,
) -> Result<()> {
let mut market = ctx.accounts.market.load_mut()?;
let tokens = market
.meta()
.ordered_tokens()
.into_iter()
.collect::<Vec<_>>();
ctx.accounts.oracle.load_mut()?.with_prices(
&ctx.accounts.store,
&ctx.accounts.token_map,
&tokens,
ctx.remaining_accounts,
ctx.accounts.chainlink_program.as_ref(),
|oracle, _remaining_accounts| market.update_adl_state(oracle, is_long),
)?;
Ok(())
}
impl<'info> internal::Authentication<'info> for UpdateAdlState<'info> {
fn authority(&self) -> &Signer<'info> {
&self.authority
}
fn store(&self) -> &AccountLoader<'info, Store> {
&self.store
}
}