2023-03-12 16:32:12 -07:00
|
|
|
use std::{collections::HashMap, str::FromStr};
|
|
|
|
|
2023-03-11 14:50:22 -08:00
|
|
|
use crate::{
|
2023-03-12 00:13:57 -08:00
|
|
|
candle_batching::batch_candles,
|
2023-03-12 16:32:12 -07:00
|
|
|
database::{
|
|
|
|
insert::{persist_candles, persist_fill_events},
|
|
|
|
Candle,
|
|
|
|
},
|
|
|
|
trade_fetching::{
|
|
|
|
backfill::backfill,
|
|
|
|
parsing::OpenBookFillEventLog,
|
|
|
|
scrape::{fetch_market_infos, scrape},
|
|
|
|
},
|
2023-03-11 14:50:22 -08:00
|
|
|
utils::Config,
|
|
|
|
};
|
2023-03-12 16:32:12 -07:00
|
|
|
use database::initialize::{connect_to_database, setup_database};
|
2023-03-07 22:45:37 -08:00
|
|
|
use dotenv;
|
2023-03-11 14:50:22 -08:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
2023-03-05 22:52:42 -08:00
|
|
|
use tokio::sync::mpsc;
|
|
|
|
|
2023-03-11 14:50:22 -08:00
|
|
|
mod candle_batching;
|
2023-03-05 22:52:42 -08:00
|
|
|
mod database;
|
|
|
|
mod trade_fetching;
|
|
|
|
mod utils;
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> anyhow::Result<()> {
|
2023-03-07 22:45:37 -08:00
|
|
|
dotenv::dotenv().ok();
|
|
|
|
|
|
|
|
let rpc_url: String = dotenv::var("RPC_URL").unwrap();
|
|
|
|
let database_url: String = dotenv::var("DATABASE_URL").unwrap();
|
|
|
|
|
|
|
|
let config = Config {
|
2023-03-12 16:32:12 -07:00
|
|
|
rpc_url: rpc_url.clone(),
|
2023-03-07 22:45:37 -08:00
|
|
|
database_url,
|
|
|
|
max_pg_pool_connections: 5,
|
2023-03-05 22:52:42 -08:00
|
|
|
};
|
|
|
|
|
2023-03-09 20:54:51 -08:00
|
|
|
let markets = utils::load_markets("/Users/dboures/dev/openbook-candles/markets.json");
|
|
|
|
let market_infos = fetch_market_infos(&config, markets).await?;
|
2023-03-12 16:32:12 -07:00
|
|
|
let mut target_markets = HashMap::new();
|
|
|
|
for m in market_infos.clone() {
|
|
|
|
target_markets.insert(Pubkey::from_str(&m.address)?, 0);
|
|
|
|
}
|
|
|
|
println!("{:?}", target_markets);
|
2023-03-05 22:52:42 -08:00
|
|
|
|
|
|
|
let pool = connect_to_database(&config).await?;
|
2023-03-12 16:32:12 -07:00
|
|
|
setup_database(&pool).await?;
|
2023-03-07 22:45:37 -08:00
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
let (fill_sender, fill_receiver) = mpsc::channel::<OpenBookFillEventLog>(1000);
|
2023-03-05 22:52:42 -08:00
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
let bf_sender = fill_sender.clone();
|
|
|
|
let targets = target_markets.clone();
|
|
|
|
tokio::spawn(async move {
|
|
|
|
backfill(&rpc_url.clone(), &bf_sender, &targets).await;
|
|
|
|
});
|
2023-03-11 14:50:22 -08:00
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
tokio::spawn(async move {
|
|
|
|
scrape(&config, &fill_sender, &target_markets).await; //TODO: send the vec, it's okay
|
|
|
|
});
|
2023-03-12 00:13:57 -08:00
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
let fills_pool = pool.clone();
|
2023-03-12 00:13:57 -08:00
|
|
|
tokio::spawn(async move {
|
2023-03-12 16:32:12 -07:00
|
|
|
persist_fill_events(&fills_pool, fill_receiver).await;
|
2023-03-12 00:13:57 -08:00
|
|
|
});
|
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
// let (candle_sender, candle_receiver) = mpsc::channel::<Vec<Candle>>(1000);
|
|
|
|
|
|
|
|
// let batch_pool = pool.clone();
|
2023-03-12 00:13:57 -08:00
|
|
|
// tokio::spawn(async move {
|
2023-03-12 16:32:12 -07:00
|
|
|
// batch_candles(batch_pool, &candle_sender, market_infos).await;
|
2023-03-12 00:13:57 -08:00
|
|
|
// });
|
|
|
|
|
2023-03-12 16:32:12 -07:00
|
|
|
// let persist_pool = pool.clone();
|
|
|
|
// // tokio::spawn(async move {
|
|
|
|
// persist_candles(persist_pool, candle_receiver).await;
|
|
|
|
// // });
|
|
|
|
|
|
|
|
loop {} // tokio drop if one thread drops or something
|
2023-03-11 14:50:22 -08:00
|
|
|
|
2023-03-05 22:52:42 -08:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
// use getconfirmedsignaturesforaddres2 to scan txns
|
|
|
|
// find filleventlog events
|
|
|
|
// parse trade data
|
|
|
|
// persist the last 3 months on differnet timescales
|