use crate::client::evm::precompiles::fields::{Fields, bare, tokens};
use crate::client::evm::precompiles::read::{Arg, Read, read};
use crate::utils::Dec;
#[must_use]
pub fn mark_px(index: u32) -> Read<u64> {
read(0x806, &[Arg::Uint(u64::from(index))], |answer| bare(0x806, answer))
}
#[must_use]
pub fn oracle_px(index: u32) -> Read<u64> {
read(0x807, &[Arg::Uint(u64::from(index))], |answer| bare(0x807, answer))
}
#[must_use]
pub fn spot_px(index: u32) -> Read<u64> {
read(0x808, &[Arg::Uint(u64::from(index))], |answer| bare(0x808, answer))
}
#[must_use]
pub fn l1_block_number() -> Read<u64> {
read(0x809, &[], |answer| bare(0x809, answer))
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Bbo {
pub bid: u64,
pub ask: u64,
}
#[must_use]
pub fn bbo(asset: u32) -> Read<Bbo> {
read(0x80e, &[Arg::Uint(u64::from(asset))], |answer| {
let tokens = tokens(0x80e, answer)?;
let mut fields = Fields::of("bbo", &tokens)?;
Ok(Bbo { bid: fields.u64()?, ask: fields.u64()? })
})
}
#[must_use]
pub fn perp_price(raw: u64, sz_decimals: u8) -> Option<Dec> {
Dec::new(i128::from(raw), 6u32.checked_sub(u32::from(sz_decimals))?)
}
#[must_use]
pub fn spot_price(raw: u64, base_sz_decimals: u8) -> Option<Dec> {
Dec::new(i128::from(raw), 8u32.checked_sub(u32::from(base_sz_decimals))?)
}
#[cfg(test)]
#[path = "tests/prices.rs"]
mod tests;