use alloy::{
primitives::{Address, U256},
rpc::types::Log,
};
use alloy_sol_types::sol;
use anyhow::{anyhow, Result};
sol! {
interface INonfungiblePositionManagerEvents {
event IncreaseLiquidity(
uint256 indexed tokenId,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
event DecreaseLiquidity(
uint256 indexed tokenId,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
event Collect(
uint256 indexed tokenId,
address recipient,
uint256 amount0,
uint256 amount1
);
}
}
#[derive(Debug, Clone)]
pub struct IncreaseLiquidityEvent {
pub token_id: U256,
pub liquidity: u128,
pub amount0: U256,
pub amount1: U256,
}
#[derive(Debug, Clone)]
pub struct DecreaseLiquidityEvent {
pub token_id: U256,
pub liquidity: u128,
pub amount0: U256,
pub amount1: U256,
}
#[derive(Debug, Clone)]
pub struct CollectEvent {
pub token_id: U256,
pub recipient: Address,
pub amount0: U256,
pub amount1: U256,
}
pub fn decode_increase_liquidity_event(
log: &Log,
position_manager_address: Address,
) -> Result<IncreaseLiquidityEvent> {
if log.address() != position_manager_address {
return Err(anyhow!(
"IncreaseLiquidity event from unexpected address: expected {:?}, got {:?}",
position_manager_address,
log.address()
));
}
let event = log
.log_decode::<INonfungiblePositionManagerEvents::IncreaseLiquidity>()
.map(|decoded| decoded.inner)
.map_err(|e| anyhow!("Not an IncreaseLiquidity event: {:?}", e))?;
Ok(IncreaseLiquidityEvent {
token_id: event.tokenId,
liquidity: event.liquidity,
amount0: event.amount0,
amount1: event.amount1,
})
}
pub fn decode_decrease_liquidity_event(
log: &Log,
position_manager_address: Address,
) -> Result<DecreaseLiquidityEvent> {
if log.address() != position_manager_address {
return Err(anyhow!(
"DecreaseLiquidity event from unexpected address: expected {:?}, got {:?}",
position_manager_address,
log.address()
));
}
let event = log
.log_decode::<INonfungiblePositionManagerEvents::DecreaseLiquidity>()
.map(|decoded| decoded.inner)
.map_err(|e| anyhow!("Not a DecreaseLiquidity event: {:?}", e))?;
Ok(DecreaseLiquidityEvent {
token_id: event.tokenId,
liquidity: event.liquidity,
amount0: event.amount0,
amount1: event.amount1,
})
}
pub fn decode_collect_event(log: &Log, position_manager_address: Address) -> Result<CollectEvent> {
if log.address() != position_manager_address {
return Err(anyhow!(
"Collect event from unexpected address: expected {:?}, got {:?}",
position_manager_address,
log.address()
));
}
let event = log
.log_decode::<INonfungiblePositionManagerEvents::Collect>()
.map(|decoded| decoded.inner)
.map_err(|e| anyhow!("Not a Collect event: {:?}", e))?;
Ok(CollectEvent {
token_id: event.tokenId,
recipient: event.recipient,
amount0: event.amount0,
amount1: event.amount1,
})
}