2023-03-05 22:52:42 -08:00
|
|
|
use solana_client::client_error::Result as ClientResult;
|
2023-03-13 22:34:23 -07:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
2023-03-05 22:52:42 -08:00
|
|
|
use solana_transaction_status::{
|
|
|
|
option_serializer::OptionSerializer, EncodedConfirmedTransactionWithStatusMeta,
|
|
|
|
};
|
2023-03-12 16:32:12 -07:00
|
|
|
use std::{collections::HashMap, io::Error};
|
2023-03-05 22:52:42 -08:00
|
|
|
|
2023-03-12 22:03:58 -07:00
|
|
|
use crate::structs::openbook::OpenBookFillEventLog;
|
2023-03-09 20:54:51 -08:00
|
|
|
|
2023-03-12 22:03:58 -07:00
|
|
|
const PROGRAM_DATA: &str = "Program data: ";
|
2023-03-09 20:54:51 -08:00
|
|
|
|
2023-03-07 22:45:37 -08:00
|
|
|
pub fn parse_trades_from_openbook_txns(
|
2023-03-05 22:52:42 -08:00
|
|
|
txns: &mut Vec<ClientResult<EncodedConfirmedTransactionWithStatusMeta>>,
|
2023-03-12 16:32:12 -07:00
|
|
|
target_markets: &HashMap<Pubkey, u8>,
|
2023-03-07 22:45:37 -08:00
|
|
|
) -> Vec<OpenBookFillEventLog> {
|
|
|
|
let mut fills_vector = Vec::<OpenBookFillEventLog>::new();
|
2023-03-05 22:52:42 -08:00
|
|
|
for txn in txns.iter_mut() {
|
|
|
|
match txn {
|
|
|
|
Ok(t) => {
|
|
|
|
if let Some(m) = &t.transaction.meta {
|
|
|
|
match &m.log_messages {
|
2023-03-07 22:45:37 -08:00
|
|
|
OptionSerializer::Some(logs) => {
|
2023-03-12 16:32:12 -07:00
|
|
|
match parse_openbook_fills_from_logs(logs, target_markets) {
|
2023-03-07 22:45:37 -08:00
|
|
|
Some(mut events) => fills_vector.append(&mut events),
|
|
|
|
None => {}
|
|
|
|
}
|
|
|
|
}
|
2023-03-05 22:52:42 -08:00
|
|
|
OptionSerializer::None => {}
|
|
|
|
OptionSerializer::Skip => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-03-07 22:45:37 -08:00
|
|
|
Err(_) => {}
|
2023-03-05 22:52:42 -08:00
|
|
|
}
|
|
|
|
}
|
2023-03-07 22:45:37 -08:00
|
|
|
fills_vector
|
2023-03-05 22:52:42 -08:00
|
|
|
}
|
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
fn parse_openbook_fills_from_logs(
|
|
|
|
logs: &Vec<String>,
|
|
|
|
target_markets: &HashMap<Pubkey, u8>,
|
|
|
|
) -> Option<Vec<OpenBookFillEventLog>> {
|
2023-03-07 22:45:37 -08:00
|
|
|
let mut fills_vector = Vec::<OpenBookFillEventLog>::new();
|
2023-03-05 22:52:42 -08:00
|
|
|
for l in logs {
|
|
|
|
match l.strip_prefix(PROGRAM_DATA) {
|
|
|
|
Some(log) => {
|
|
|
|
let borsh_bytes = match anchor_lang::__private::base64::decode(log) {
|
|
|
|
Ok(borsh_bytes) => borsh_bytes,
|
|
|
|
_ => continue,
|
|
|
|
};
|
|
|
|
let mut slice: &[u8] = &borsh_bytes[8..];
|
2023-03-07 22:45:37 -08:00
|
|
|
let event: Result<OpenBookFillEventLog, Error> =
|
2023-03-05 22:52:42 -08:00
|
|
|
anchor_lang::AnchorDeserialize::deserialize(&mut slice);
|
|
|
|
|
|
|
|
match event {
|
|
|
|
Ok(e) => {
|
2023-03-12 16:32:12 -07:00
|
|
|
if target_markets.contains_key(&e.market) {
|
|
|
|
fills_vector.push(e);
|
|
|
|
}
|
2023-03-05 22:52:42 -08:00
|
|
|
}
|
|
|
|
_ => continue,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if fills_vector.len() > 0 {
|
|
|
|
return Some(fills_vector);
|
|
|
|
} else {
|
|
|
|
return None;
|
|
|
|
}
|
|
|
|
}
|