Orderbook updates
* Subscribe to accounts rather than program * Process out of order writes correctly * Update native to ui helpers
This commit is contained in:
parent
5c8ebc53b1
commit
746174ce8e
|
@ -18,7 +18,6 @@ use std::{
|
||||||
mem::size_of,
|
mem::size_of,
|
||||||
time::{SystemTime, UNIX_EPOCH},
|
time::{SystemTime, UNIX_EPOCH},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::metrics::MetricU64;
|
use crate::metrics::MetricU64;
|
||||||
use anchor_lang::AccountDeserialize;
|
use anchor_lang::AccountDeserialize;
|
||||||
use mango_v4::{
|
use mango_v4::{
|
||||||
|
@ -106,6 +105,7 @@ pub struct MarketConfig {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub bids: Pubkey,
|
pub bids: Pubkey,
|
||||||
pub asks: Pubkey,
|
pub asks: Pubkey,
|
||||||
|
pub event_queue: Pubkey,
|
||||||
pub base_decimals: u8,
|
pub base_decimals: u8,
|
||||||
pub quote_decimals: u8,
|
pub quote_decimals: u8,
|
||||||
pub base_lot_size: i64,
|
pub base_lot_size: i64,
|
||||||
|
@ -113,26 +113,22 @@ pub struct MarketConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn base_lots_to_ui(native: i64, base_decimals: u8, base_lot_size: i64) -> f64 {
|
pub fn base_lots_to_ui(native: i64, base_decimals: u8, base_lot_size: i64) -> f64 {
|
||||||
let decimals: u32 = 3;
|
(native * base_lot_size) as f64 / 10i64.pow(base_decimals.into()) as f64
|
||||||
let res = native as f64 / (10i64.pow(decimals.into()) as f64);
|
|
||||||
//info!("res {} native {} base_d {} base ls {}", res, native, base_decimals, base_lot_size);
|
|
||||||
res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn base_lots_to_ui_perp(native: i64, base_decimals: u8, base_lot_size: i64) -> f64 {
|
pub fn base_lots_to_ui_perp(native: i64, base_decimals: u8, quote_decimals: u8) -> f64 {
|
||||||
let decimals: u32 = 4;
|
let decimals = base_decimals - quote_decimals;
|
||||||
let res = native as f64 / (10i64.pow(decimals.into()) as f64);
|
native as f64 / (10i64.pow(decimals.into()) as f64)
|
||||||
//info!("res {} native {} base_d {} base ls {}", res, native, base_decimals, base_lot_size);
|
|
||||||
res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn price_lots_to_ui(native: i64, base_decimals: u8, quote_decimals: u8) -> f64 {
|
pub fn price_lots_to_ui(native: i64, base_decimals: u8, quote_decimals: u8) -> f64 {
|
||||||
let decimals = base_decimals - quote_decimals;
|
let decimals = base_decimals - quote_decimals;
|
||||||
// let res = native as f64
|
native as f64 / (10u64.pow(decimals.into())) as f64
|
||||||
// * ((10u64.pow(decimals.into()) * quote_lot_size as u64) as f64 / base_lot_size as f64)
|
}
|
||||||
// as f64;
|
|
||||||
let res = native as f64 / (10u64.pow(decimals.into())) as f64;
|
pub fn spot_price_to_ui(native: i64, native_size: i64, base_decimals: u8, quote_decimals: u8) -> f64 {
|
||||||
res
|
// TODO: account for fees
|
||||||
|
((native * 10i64.pow(base_decimals.into())) / (10i64.pow(quote_decimals.into()) * native_size)) as f64
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn price_lots_to_ui_perp(
|
pub fn price_lots_to_ui_perp(
|
||||||
|
@ -143,13 +139,9 @@ pub fn price_lots_to_ui_perp(
|
||||||
quote_lot_size: i64,
|
quote_lot_size: i64,
|
||||||
) -> f64 {
|
) -> f64 {
|
||||||
let decimals = base_decimals - quote_decimals;
|
let decimals = base_decimals - quote_decimals;
|
||||||
let res = native as f64
|
let multiplier = 10u64.pow(decimals.into()) as f64;
|
||||||
* ((10u64.pow(decimals.into()) * quote_lot_size as u64) as f64 / base_lot_size as f64)
|
native as f64
|
||||||
as f64;
|
* ((multiplier * quote_lot_size as f64) / base_lot_size as f64)
|
||||||
// let res = native as f64
|
|
||||||
// / (10u64.pow(decimals.into()))
|
|
||||||
// as f64;
|
|
||||||
res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn publish_changes(
|
fn publish_changes(
|
||||||
|
@ -332,8 +324,16 @@ pub async fn init(
|
||||||
let side_pk_string = side_pk.to_string();
|
let side_pk_string = side_pk.to_string();
|
||||||
|
|
||||||
let write_version = (account_info.slot, account_info.write_version);
|
let write_version = (account_info.slot, account_info.write_version);
|
||||||
// todo: should this be <= so we don't overwrite with old data received late?
|
if write_version == *last_write_version {
|
||||||
if write_version <= *last_write_version {
|
continue;
|
||||||
|
}
|
||||||
|
if write_version.0 < last_write_version.0 {
|
||||||
|
debug!("evq version slot was old");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if write_version.0 == last_write_version.0 && write_version.1 < last_write_version.1
|
||||||
|
{
|
||||||
|
debug!("evq version slot was same and write version was old");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
last_write_versions.insert(side_pk_string.clone(), write_version);
|
last_write_versions.insert(side_pk_string.clone(), write_version);
|
||||||
|
@ -369,7 +369,7 @@ pub async fn init(
|
||||||
.map(|(_, quantity)| quantity)
|
.map(|(_, quantity)| quantity)
|
||||||
.fold(0, |acc, x| acc + x),
|
.fold(0, |acc, x| acc + x),
|
||||||
mkt.1.base_decimals,
|
mkt.1.base_decimals,
|
||||||
mkt.1.base_lot_size,
|
mkt.1.quote_decimals,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
@ -394,7 +394,7 @@ pub async fn init(
|
||||||
|
|
||||||
bookside_cache.insert(side_pk_string.clone(), bookside.clone());
|
bookside_cache.insert(side_pk_string.clone(), bookside.clone());
|
||||||
}
|
}
|
||||||
Err(_) => info!("chain_cache could not find {}", mkt_pk),
|
Err(_) => debug!("chain_cache could not find {}", mkt_pk),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -417,7 +417,7 @@ pub async fn init(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
last_write_versions.insert(side_pk_string.clone(), write_version);
|
last_write_versions.insert(side_pk_string.clone(), write_version);
|
||||||
info!("W {}", mkt.1.name);
|
debug!("W {}", mkt.1.name);
|
||||||
let account = &mut account_info.account.clone();
|
let account = &mut account_info.account.clone();
|
||||||
let data = account.data_as_mut_slice();
|
let data = account.data_as_mut_slice();
|
||||||
let len = data.len();
|
let len = data.len();
|
||||||
|
@ -473,7 +473,7 @@ pub async fn init(
|
||||||
|
|
||||||
serum_bookside_cache.insert(side_pk_string.clone(), bookside);
|
serum_bookside_cache.insert(side_pk_string.clone(), bookside);
|
||||||
}
|
}
|
||||||
Err(_) => info!("chain_cache could not find {}", side_pk),
|
Err(_) => debug!("chain_cache could not find {}", side_pk),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -309,6 +309,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
name: context.market.name().to_owned(),
|
name: context.market.name().to_owned(),
|
||||||
bids: context.market.bids,
|
bids: context.market.bids,
|
||||||
asks: context.market.asks,
|
asks: context.market.asks,
|
||||||
|
event_queue: context.market.event_queue,
|
||||||
base_decimals: context.market.base_decimals,
|
base_decimals: context.market.base_decimals,
|
||||||
quote_decimals,
|
quote_decimals,
|
||||||
base_lot_size: context.market.base_lot_size,
|
base_lot_size: context.market.base_lot_size,
|
||||||
|
@ -336,6 +337,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
name: context.market.name().to_owned(),
|
name: context.market.name().to_owned(),
|
||||||
bids: context.bids,
|
bids: context.bids,
|
||||||
asks: context.asks,
|
asks: context.asks,
|
||||||
|
event_queue: context.event_q,
|
||||||
base_decimals,
|
base_decimals,
|
||||||
quote_decimals,
|
quote_decimals,
|
||||||
base_lot_size: context.pc_lot_size as i64,
|
base_lot_size: context.pc_lot_size as i64,
|
||||||
|
@ -355,7 +357,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let (account_write_queue_sender, slot_queue_sender, orderbook_receiver) =
|
let (account_write_queue_sender, slot_queue_sender, orderbook_receiver) =
|
||||||
orderbook_filter::init(market_configs, serum_market_configs, metrics_tx.clone()).await?;
|
orderbook_filter::init(market_configs.clone(), serum_market_configs.clone(), metrics_tx.clone()).await?;
|
||||||
|
|
||||||
let checkpoints_ref_thread = checkpoints.clone();
|
let checkpoints_ref_thread = checkpoints.clone();
|
||||||
let peers_ref_thread = peers.clone();
|
let peers_ref_thread = peers.clone();
|
||||||
|
@ -422,12 +424,14 @@ async fn main() -> anyhow::Result<()> {
|
||||||
);
|
);
|
||||||
let use_geyser = true;
|
let use_geyser = true;
|
||||||
if use_geyser {
|
if use_geyser {
|
||||||
|
let relevant_pubkeys = [market_configs.clone()]
|
||||||
|
.concat()
|
||||||
|
.iter()
|
||||||
|
.flat_map(|m| [m.1.bids.to_string(), m.1.asks.to_string()])
|
||||||
|
.collect();
|
||||||
let filter_config = FilterConfig {
|
let filter_config = FilterConfig {
|
||||||
program_ids: vec![
|
program_ids: vec![],
|
||||||
"4MangoMjqJ2firMokCjjGgoK8d4MXcrgL7XJaL3w6fVg".into(),
|
account_ids: relevant_pubkeys,
|
||||||
"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX".into(),
|
|
||||||
],
|
|
||||||
account_ids: vec![],
|
|
||||||
};
|
};
|
||||||
grpc_plugin_source::process_events(
|
grpc_plugin_source::process_events(
|
||||||
&config.source,
|
&config.source,
|
||||||
|
|
Loading…
Reference in New Issue