use serde::{Deserialize, Serialize};
use crate::primitives::{Address, Amount};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum Objective {
Price,
Speed,
Stealth,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum Side {
Buy,
Sell,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Constraints {
pub max_slippage_bps: u32,
pub deadline_unix: u64,
pub max_legs: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Intent {
pub input_mint: Address,
pub output_mint: Address,
pub amount_in: Amount,
pub side: Side,
pub objective: Objective,
pub constraints: Constraints,
}
impl Intent {
pub fn digest(&self) -> String {
let s = serde_json::to_string(self).unwrap_or_default();
let mut h: u64 = 0xcbf2_9ce4_8422_2325;
for b in s.bytes() {
h ^= b as u64;
h = h.wrapping_mul(0x0000_0100_0000_01b3);
}
format!("{h:016x}")
}
}