use crate::core::events::*;
use crate::instr::inner_common::*;
use solana_sdk::pubkey::Pubkey;
pub mod discriminators {
pub const SWAP: [u8; 16] =
[143, 190, 90, 218, 196, 30, 51, 222, 155, 167, 108, 32, 122, 76, 173, 64];
pub const ADD_LIQUIDITY: [u8; 16] =
[181, 157, 89, 67, 143, 182, 52, 72, 155, 167, 108, 32, 122, 76, 173, 64];
pub const REMOVE_LIQUIDITY: [u8; 16] =
[80, 85, 209, 72, 24, 206, 35, 178, 155, 167, 108, 32, 122, 76, 173, 64];
pub const INITIALIZE_POOL: [u8; 16] =
[95, 180, 10, 172, 84, 174, 232, 40, 155, 167, 108, 32, 122, 76, 173, 64];
pub const INITIALIZE_BIN_ARRAY: [u8; 16] =
[11, 18, 155, 194, 33, 115, 238, 119, 155, 167, 108, 32, 122, 76, 173, 64];
pub const CREATE_POSITION: [u8; 16] =
[123, 233, 11, 43, 146, 180, 97, 119, 155, 167, 108, 32, 122, 76, 173, 64];
pub const CLOSE_POSITION: [u8; 16] =
[94, 168, 102, 45, 59, 122, 137, 54, 155, 167, 108, 32, 122, 76, 173, 64];
pub const CLAIM_FEE: [u8; 16] =
[152, 70, 208, 111, 104, 91, 44, 1, 155, 167, 108, 32, 122, 76, 173, 64];
}
#[inline]
pub fn parse(disc: &[u8; 16], data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
match disc {
&discriminators::SWAP => parse_swap(data, metadata),
&discriminators::ADD_LIQUIDITY => parse_add_liquidity(data, metadata),
&discriminators::REMOVE_LIQUIDITY => parse_remove_liquidity(data, metadata),
&discriminators::INITIALIZE_POOL => parse_initialize_pool(data, metadata),
&discriminators::INITIALIZE_BIN_ARRAY => parse_initialize_bin_array(data, metadata),
&discriminators::CREATE_POSITION => parse_create_position(data, metadata),
&discriminators::CLOSE_POSITION => parse_close_position(data, metadata),
&discriminators::CLAIM_FEE => parse_claim_fee(data, metadata),
_ => None,
}
}
#[inline(always)]
fn parse_swap(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_swap_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_swap_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_swap_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const SWAP_EVENT_SIZE: usize = 32 + 32 + 4 + 4 + 8 + 8 + 1 + 8 + 8 + 16 + 8;
if data.len() < SWAP_EVENT_SIZE {
return None;
}
let mut event = borsh::from_slice::<MeteoraDlmmSwapEvent>(&data[..SWAP_EVENT_SIZE]).ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmSwap(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_swap_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 4 + 4 + 8 + 8 + 1 + 8 + 8 + 16 + 8) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let from = read_pubkey_unchecked(data, 32);
let start_bin_id = read_i32_unchecked(data, 64);
let end_bin_id = read_i32_unchecked(data, 68);
let amount_in = read_u64_unchecked(data, 72);
let amount_out = read_u64_unchecked(data, 80);
let swap_for_y = read_bool_unchecked(data, 88);
let fee = read_u64_unchecked(data, 89);
let protocol_fee = read_u64_unchecked(data, 97);
let fee_bps = read_u128_unchecked(data, 105);
let host_fee = read_u64_unchecked(data, 121);
Some(DexEvent::MeteoraDlmmSwap(MeteoraDlmmSwapEvent {
metadata,
pool,
from,
start_bin_id,
end_bin_id,
amount_in,
amount_out,
swap_for_y,
fee,
protocol_fee,
fee_bps,
host_fee,
}))
}
}
#[inline(always)]
fn parse_add_liquidity(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_add_liquidity_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_add_liquidity_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_add_liquidity_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const ADD_LIQUIDITY_EVENT_SIZE: usize = 32 + 32 + 32 + 16 + 4;
if data.len() < ADD_LIQUIDITY_EVENT_SIZE {
return None;
}
let mut event =
borsh::from_slice::<MeteoraDlmmAddLiquidityEvent>(&data[..ADD_LIQUIDITY_EVENT_SIZE])
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmAddLiquidity(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_add_liquidity_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 32 + 16 + 4) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let from = read_pubkey_unchecked(data, 32);
let position = read_pubkey_unchecked(data, 64);
let amount_0 = read_u64_unchecked(data, 96);
let amount_1 = read_u64_unchecked(data, 104);
let active_bin_id = read_i32_unchecked(data, 112);
Some(DexEvent::MeteoraDlmmAddLiquidity(MeteoraDlmmAddLiquidityEvent {
metadata,
pool,
from,
position,
amounts: [amount_0, amount_1],
active_bin_id,
}))
}
}
#[inline(always)]
fn parse_remove_liquidity(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_remove_liquidity_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_remove_liquidity_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_remove_liquidity_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const REMOVE_LIQUIDITY_EVENT_SIZE: usize = 32 + 32 + 32 + 16 + 4;
if data.len() < REMOVE_LIQUIDITY_EVENT_SIZE {
return None;
}
let mut event = borsh::from_slice::<MeteoraDlmmRemoveLiquidityEvent>(
&data[..REMOVE_LIQUIDITY_EVENT_SIZE],
)
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmRemoveLiquidity(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_remove_liquidity_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 32 + 16 + 4) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let from = read_pubkey_unchecked(data, 32);
let position = read_pubkey_unchecked(data, 64);
let amount_0 = read_u64_unchecked(data, 96);
let amount_1 = read_u64_unchecked(data, 104);
let active_bin_id = read_i32_unchecked(data, 112);
Some(DexEvent::MeteoraDlmmRemoveLiquidity(MeteoraDlmmRemoveLiquidityEvent {
metadata,
pool,
from,
position,
amounts: [amount_0, amount_1],
active_bin_id,
}))
}
}
#[inline(always)]
fn parse_initialize_pool(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_initialize_pool_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_initialize_pool_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_initialize_pool_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const INITIALIZE_POOL_EVENT_SIZE: usize = 32 + 32 + 4 + 2;
if data.len() < INITIALIZE_POOL_EVENT_SIZE {
return None;
}
let mut event = borsh::from_slice::<MeteoraDlmmInitializePoolEvent>(
&data[..INITIALIZE_POOL_EVENT_SIZE],
)
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmInitializePool(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_initialize_pool_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 4 + 2) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let creator = read_pubkey_unchecked(data, 32);
let active_bin_id = read_i32_unchecked(data, 64);
let bin_step = read_u16_unchecked(data, 68);
Some(DexEvent::MeteoraDlmmInitializePool(MeteoraDlmmInitializePoolEvent {
metadata,
pool,
creator,
active_bin_id,
bin_step,
}))
}
}
#[inline(always)]
fn parse_initialize_bin_array(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_initialize_bin_array_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_initialize_bin_array_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_initialize_bin_array_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const INITIALIZE_BIN_ARRAY_EVENT_SIZE: usize = 32 + 32 + 8;
if data.len() < INITIALIZE_BIN_ARRAY_EVENT_SIZE {
return None;
}
let mut event = borsh::from_slice::<MeteoraDlmmInitializeBinArrayEvent>(
&data[..INITIALIZE_BIN_ARRAY_EVENT_SIZE],
)
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmInitializeBinArray(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_initialize_bin_array_zero_copy(
data: &[u8],
metadata: EventMetadata,
) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 8) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let bin_array = read_pubkey_unchecked(data, 32);
let index = read_i64_unchecked(data, 64);
Some(DexEvent::MeteoraDlmmInitializeBinArray(MeteoraDlmmInitializeBinArrayEvent {
metadata,
pool,
bin_array,
index,
}))
}
}
#[inline(always)]
fn parse_create_position(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_create_position_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_create_position_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_create_position_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const CREATE_POSITION_EVENT_SIZE: usize = 32 + 32 + 32 + 4 + 4;
if data.len() < CREATE_POSITION_EVENT_SIZE {
return None;
}
let mut event = borsh::from_slice::<MeteoraDlmmCreatePositionEvent>(
&data[..CREATE_POSITION_EVENT_SIZE],
)
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmCreatePosition(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_create_position_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 32 + 4 + 4) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let position = read_pubkey_unchecked(data, 32);
let owner = read_pubkey_unchecked(data, 64);
let lower_bin_id = read_i32_unchecked(data, 96);
let width = read_u32_unchecked(data, 100);
Some(DexEvent::MeteoraDlmmCreatePosition(MeteoraDlmmCreatePositionEvent {
metadata,
pool,
position,
owner,
lower_bin_id,
width,
}))
}
}
#[inline(always)]
fn parse_close_position(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_close_position_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_close_position_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_close_position_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const CLOSE_POSITION_EVENT_SIZE: usize = 32 + 32 + 32;
if data.len() < CLOSE_POSITION_EVENT_SIZE {
return None;
}
let mut event =
borsh::from_slice::<MeteoraDlmmClosePositionEvent>(&data[..CLOSE_POSITION_EVENT_SIZE])
.ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmClosePosition(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_close_position_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 32) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let position = read_pubkey_unchecked(data, 32);
let owner = read_pubkey_unchecked(data, 64);
Some(DexEvent::MeteoraDlmmClosePosition(MeteoraDlmmClosePositionEvent {
metadata,
pool,
position,
owner,
}))
}
}
#[inline(always)]
fn parse_claim_fee(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
#[cfg(feature = "parse-borsh")]
{
parse_claim_fee_borsh(data, metadata)
}
#[cfg(feature = "parse-zero-copy")]
{
parse_claim_fee_zero_copy(data, metadata)
}
}
#[cfg(feature = "parse-borsh")]
#[inline(always)]
fn parse_claim_fee_borsh(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
const CLAIM_FEE_EVENT_SIZE: usize = 32 + 32 + 32 + 8 + 8;
if data.len() < CLAIM_FEE_EVENT_SIZE {
return None;
}
let mut event =
borsh::from_slice::<MeteoraDlmmClaimFeeEvent>(&data[..CLAIM_FEE_EVENT_SIZE]).ok()?;
event.metadata = metadata;
Some(DexEvent::MeteoraDlmmClaimFee(event))
}
#[cfg(feature = "parse-zero-copy")]
#[inline(always)]
fn parse_claim_fee_zero_copy(data: &[u8], metadata: EventMetadata) -> Option<DexEvent> {
unsafe {
if !check_length(data, 32 + 32 + 32 + 8 + 8) {
return None;
}
let pool = read_pubkey_unchecked(data, 0);
let position = read_pubkey_unchecked(data, 32);
let owner = read_pubkey_unchecked(data, 64);
let fee_x = read_u64_unchecked(data, 96);
let fee_y = read_u64_unchecked(data, 104);
Some(DexEvent::MeteoraDlmmClaimFee(MeteoraDlmmClaimFeeEvent {
metadata,
pool,
position,
owner,
fee_x,
fee_y,
}))
}
}