use crate::libraries::full_math::MulDiv;
use crate::{
error::ErrorCode,
libraries::{fixed_point_32, liquidity_math},
};
use anchor_lang::prelude::*;
pub const POSITION_SEED: &str = "ps";
#[account(zero_copy)]
#[derive(Default)]
#[repr(packed)]
pub struct PositionState {
pub bump: u8,
pub liquidity: u64,
pub fee_growth_inside_0_last_x32: u64,
pub fee_growth_inside_1_last_x32: u64,
pub tokens_owed_0: u64,
pub tokens_owed_1: u64,
}
impl PositionState {
pub fn update(
&mut self,
liquidity_delta: i64,
fee_growth_inside_0_x32: u64,
fee_growth_inside_1_x32: u64,
) -> Result<()> {
let liquidity_next = if liquidity_delta == 0 {
require!(self.liquidity > 0, ErrorCode::NP); self.liquidity
} else {
liquidity_math::add_delta(self.liquidity, liquidity_delta)?
};
let tokens_owed_0 = (fee_growth_inside_0_x32 - self.fee_growth_inside_0_last_x32)
.mul_div_floor(self.liquidity as u64, fixed_point_32::Q32)
.unwrap();
let tokens_owed_1 = (fee_growth_inside_1_x32 - self.fee_growth_inside_1_last_x32)
.mul_div_floor(self.liquidity as u64, fixed_point_32::Q32)
.unwrap();
if liquidity_delta != 0 {
self.liquidity = liquidity_next;
}
self.fee_growth_inside_0_last_x32 = fee_growth_inside_0_x32;
self.fee_growth_inside_1_last_x32 = fee_growth_inside_1_x32;
if tokens_owed_0 > 0 || tokens_owed_1 > 0 {
self.tokens_owed_0 += tokens_owed_0;
self.tokens_owed_1 += tokens_owed_1;
}
Ok(())
}
}
#[event]
pub struct MintEvent {
#[index]
pub pool_state: Pubkey,
pub sender: Pubkey,
pub owner: Pubkey,
#[index]
pub tick_lower: i32,
#[index]
pub tick_upper: i32,
pub amount: u64,
pub amount_0: u64,
pub amount_1: u64,
}
#[event]
pub struct BurnEvent {
#[index]
pub pool_state: Pubkey,
pub owner: Pubkey,
#[index]
pub tick_lower: i32,
#[index]
pub tick_upper: i32,
pub amount: u64,
pub amount_0: u64,
pub amount_1: u64,
}
#[event]
pub struct CollectEvent {
#[index]
pub pool_state: Pubkey,
pub owner: Pubkey,
#[index]
pub tick_lower: i32,
#[index]
pub tick_upper: i32,
pub amount_0: u64,
pub amount_1: u64,
}