From 4167e898246c5d54f9463fa28a2179048e8be09b Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Fri, 7 Aug 2026 20:35:11 +0200 Subject: [PATCH] Trade event structure --- src/bot.rs | 28 ++++++++++++++++++++-------- src/data/mod.rs | 6 ++++++ src/launchpad/mod.rs | 6 +++--- src/launchpad/pump_fun.rs | 5 +++-- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/bot.rs b/src/bot.rs index 9c97977..d86e245 100644 --- a/src/bot.rs +++ b/src/bot.rs @@ -6,7 +6,7 @@ use tokio::sync::{Mutex, mpsc, watch}; use crate::{ data::{ - NewToken, + Event, NewToken, account::{Account, AccountManager}, tradelog::TradeLog, }, @@ -77,13 +77,25 @@ impl Bot { Ok(()) } - pub async fn tick(self: &Arc, rx: &mut mpsc::Receiver) -> anyhow::Result { - if let Some(token) = rx.recv().await { - self.strategy - .lock() - .await - .on_new_coin(self.clone(), token) - .await?; + pub async fn tick(self: &Arc, rx: &mut mpsc::Receiver) -> anyhow::Result { + if let Some(event) = rx.recv().await { + match event { + Event::NewToken(token) => { + self.strategy + .lock() + .await + .on_new_coin(self.clone(), token) + .await?; + } + + Event::Trade(trade) => { + self.strategy + .lock() + .await + .on_trade(self.clone(), trade) + .await?; + } + } Ok(false) } else { diff --git a/src/data/mod.rs b/src/data/mod.rs index 1ee8d25..1715e9f 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -3,6 +3,12 @@ pub mod tradelog; use serde::Deserialize; +#[derive(Debug, Clone)] +pub enum Event { + NewToken(NewToken), + Trade(Trade), +} + #[derive(Debug, Clone, Deserialize)] pub struct NewToken { pub mint: String, diff --git a/src/launchpad/mod.rs b/src/launchpad/mod.rs index d5a9142..896c62f 100644 --- a/src/launchpad/mod.rs +++ b/src/launchpad/mod.rs @@ -4,7 +4,7 @@ use rust_decimal::Decimal; use std::{collections::HashMap, sync::Arc}; use tokio::sync::{Mutex, mpsc}; -use crate::{data::NewToken, launchpad::pump_fun::PumpFun}; +use crate::{data::Event, launchpad::pump_fun::PumpFun}; pub struct Client( pub Mutex< @@ -44,7 +44,7 @@ pub trait Launchpad: Send + Sync { slippage: u16, ) -> anyhow::Result<()>; - async fn listen(client: Arc, tx: mpsc::Sender) -> anyhow::Result<()>; + async fn listen(client: Arc, tx: mpsc::Sender) -> anyhow::Result<()>; fn get_positions(&self) -> HashMap; } @@ -113,7 +113,7 @@ impl Executor { Ok(()) } - pub async fn listen(self: &Arc) -> anyhow::Result> { + pub async fn listen(self: &Arc) -> anyhow::Result> { let (tx, rx) = mpsc::channel(100); tokio::spawn(PumpFun::listen(self.new_tokens_client.clone(), tx)); diff --git a/src/launchpad/pump_fun.rs b/src/launchpad/pump_fun.rs index f8f2adf..1f6f305 100644 --- a/src/launchpad/pump_fun.rs +++ b/src/launchpad/pump_fun.rs @@ -9,6 +9,7 @@ use serde::Deserialize; use tokio::sync::mpsc; use tokio_tungstenite::tungstenite::Message; +use crate::data::Event; use crate::data::NewToken; use crate::launchpad::Client; use crate::launchpad::Launchpad; @@ -55,7 +56,7 @@ impl Launchpad for PumpFun { Ok(()) } - async fn listen(client: Arc, tx: mpsc::Sender) -> anyhow::Result<()> { + async fn listen(client: Arc, tx: mpsc::Sender) -> anyhow::Result<()> { let mut ws = client.0.lock().await; ws.send( @@ -124,7 +125,7 @@ impl Launchpad for PumpFun { token.mint ); - if tx.send(token).await.is_err() { + if tx.send(Event::NewToken(token)).await.is_err() { break; } }