1
0
mirror of https://github.com/payden/libwsclient synced 2025-06-13 12:53:52 +00:00
payden_libwsclient/bot/risk_manager.rs
2025-05-16 15:09:24 +09:00

52 lines
1.8 KiB
Rust

use solana_client::rpc_client::RpcClient;
use solana_sdk::transaction::Transaction;
pub struct RiskManager {
rpc_client: RpcClient,
max_capital_per_trade: f64,
max_slippage: f64,
}
impl RiskManager {
pub fn new(rpc_client: RpcClient) -> Self {
Self {
rpc_client,
max_capital_per_trade: 1000.0,
max_slippage: 0.05,
}
}
pub fn update(&mut self, max_capital_per_trade: f64, max_slippage: f64) {
self.max_capital_per_trade = max_capital_per_trade;
self.max_slippage = max_slippage;
}
pub async fn is_safe(&self, tx: &Transaction) -> bool {
let tx_cost = self.calculate_tx_cost(tx).await;
tx_cost <= self.max_capital_per_trade && self.calculate_slippage(tx).await <= self.max_slippage
}
async fn calculate_tx_cost(&self, tx: &Transaction) -> f64 {
let (result, _) = self.rpc_client.simulate_transaction(tx).await.unwrap();
let accounts_data = result.accounts.unwrap();
let mut cost = 0.0;
for account in &accounts_data {
let lamports = account.lamports.unwrap();
cost += lamports as f64 / 1e9;
}
cost
}
async fn calculate_slippage(&self, tx: &Transaction) -> f64 {
let (result, _) = self.rpc_client.simulate_transaction(tx).await.unwrap();
let accounts_data = result.accounts.unwrap();
let mut balance_changes = Vec::new();
for account in &accounts_data {
let lamports = account.lamports.unwrap();
balance_changes.push(lamports as f64 / 1e9);
}
let max_balance_change = balance_changes.iter().cloned().fold(0.0 / 0.0, f64::max);
let min_balance_change = balance_changes.iter().cloned().fold(0.0 / 0.0, f64::min);
(max_balance_change - min_balance_change) / min_balance_change
}
}