use steel::*;
use crate::consts::PYTH_BTC_USD_FEED_ID;
use crate::error::StreakError;
use crate::event::PeriodSettled;
use crate::pyth::{load_fresh_price, outcome_from_open_close, Price};
use crate::state::Treasury;
pub struct SettlementResult {
pub outcome: u8,
pub close_px: Price,
pub open_px: Price,
}
pub fn resolve_settlement(
treasury: &Treasury,
pyth_price_feed_info: &AccountInfo<'_>,
unix_timestamp: i64,
) -> Result<SettlementResult, ProgramError> {
if treasury.last_close_price == 0 {
return Err(StreakError::GenesisNotSet.into());
}
let open_px = Price {
price: treasury.last_close_price,
conf: 0,
expo: treasury.last_close_expo,
publish_time: treasury.last_close_publish_time,
};
let close_px = load_fresh_price(pyth_price_feed_info, &PYTH_BTC_USD_FEED_ID, unix_timestamp)?;
let outcome = outcome_from_open_close(open_px, close_px)?;
Ok(SettlementResult { outcome, close_px, open_px })
}
pub fn commit_settlement(
treasury: &mut Treasury,
result: SettlementResult,
series_id: u16,
period: u64,
) {
PeriodSettled {
series_id,
outcome: result.outcome,
_pad: [0; 5],
period,
close_price: result.close_px.price,
close_expo: result.close_px.expo,
_pad2: [0; 4],
close_publish_time: result.close_px.publish_time,
open_price: result.open_px.price,
open_expo: result.open_px.expo,
_pad3: [0; 4],
}
.log();
treasury.last_close_price = result.close_px.price;
treasury.last_close_expo = result.close_px.expo;
treasury.last_close_publish_time = result.close_px.publish_time;
}
pub const SIDE_UP: u8 = 0;
pub const SIDE_DOWN: u8 = 1;