use std::fmt::Display;
use alloy_primitives::{Address, U256};
use nautilus_core::UnixNanos;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumIter, EnumString};
use crate::{
defi::{PoolIdentifier, SharedChain, SharedDex},
identifiers::InstrumentId,
};
#[derive(
Debug,
Clone,
Copy,
Hash,
PartialOrd,
PartialEq,
Ord,
Eq,
Display,
EnumIter,
EnumString,
Serialize,
Deserialize,
)]
#[cfg_attr(
feature = "python",
pyo3::pyclass(
frozen,
eq,
eq_int,
module = "nautilus_trader.core.nautilus_pyo3.model",
from_py_object,
rename_all = "SCREAMING_SNAKE_CASE",
)
)]
#[cfg_attr(
feature = "python",
pyo3_stub_gen::derive::gen_stub_pyclass_enum(module = "nautilus_trader.model")
)]
#[non_exhaustive]
pub enum PoolLiquidityUpdateType {
Mint,
Burn,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(
feature = "python",
pyo3::pyclass(module = "nautilus_trader.core.nautilus_pyo3.model", from_py_object)
)]
#[cfg_attr(
feature = "python",
pyo3_stub_gen::derive::gen_stub_pyclass(module = "nautilus_trader.model")
)]
pub struct PoolLiquidityUpdate {
pub chain: SharedChain,
pub dex: SharedDex,
pub instrument_id: InstrumentId,
pub pool_identifier: PoolIdentifier,
pub kind: PoolLiquidityUpdateType,
pub block: u64,
pub transaction_hash: String,
pub transaction_index: u32,
pub log_index: u32,
pub sender: Option<Address>,
pub owner: Address,
pub position_liquidity: u128,
pub amount0: U256,
pub amount1: U256,
pub tick_lower: i32,
pub tick_upper: i32,
pub timestamp: Option<UnixNanos>,
pub ts_init: Option<UnixNanos>,
}
impl PoolLiquidityUpdate {
#[must_use]
#[allow(clippy::too_many_arguments)]
pub const fn new(
chain: SharedChain,
dex: SharedDex,
instrument_id: InstrumentId,
pool_identifier: PoolIdentifier,
kind: PoolLiquidityUpdateType,
block: u64,
transaction_hash: String,
transaction_index: u32,
log_index: u32,
sender: Option<Address>,
owner: Address,
position_liquidity: u128,
amount0: U256,
amount1: U256,
tick_lower: i32,
tick_upper: i32,
timestamp: Option<UnixNanos>,
) -> Self {
Self {
chain,
dex,
instrument_id,
pool_identifier,
kind,
block,
transaction_hash,
transaction_index,
log_index,
sender,
owner,
position_liquidity,
amount0,
amount1,
tick_lower,
tick_upper,
timestamp,
ts_init: timestamp,
}
}
}
impl Display for PoolLiquidityUpdate {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"PoolLiquidityUpdate(instrument_id={}, kind={}, amount0={}, amount1={}, liquidity={})",
self.instrument_id, self.kind, self.amount0, self.amount1, self.position_liquidity
)
}
}