use crate::streaming::event_parser::{
common::EventMetadata,
protocols::{
bonk::parser as bonk, pumpfun::parser as pumpfun, pumpswap::parser as pumpswap,
raydium_amm_v4::parser as raydium_amm_v4, raydium_clmm::parser as raydium_clmm,
raydium_cpmm::parser as raydium_cpmm,
},
DexEvent, Protocol,
};
use solana_sdk::pubkey::Pubkey;
pub struct EventDispatcher;
impl EventDispatcher {
#[inline]
pub fn dispatch_instruction(
protocol: Protocol,
instruction_discriminator: &[u8],
instruction_data: &[u8],
accounts: &[Pubkey],
mut metadata: EventMetadata,
) -> Option<DexEvent> {
use crate::streaming::event_parser::common::ProtocolType;
metadata.protocol = match protocol {
Protocol::PumpFun => ProtocolType::PumpFun,
Protocol::PumpSwap => ProtocolType::PumpSwap,
Protocol::Bonk => ProtocolType::Bonk,
Protocol::RaydiumCpmm => ProtocolType::RaydiumCpmm,
Protocol::RaydiumClmm => ProtocolType::RaydiumClmm,
Protocol::RaydiumAmmV4 => ProtocolType::RaydiumAmmV4,
};
match protocol {
Protocol::PumpFun => pumpfun::parse_pumpfun_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
Protocol::PumpSwap => pumpswap::parse_pumpswap_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
Protocol::Bonk => bonk::parse_bonk_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
Protocol::RaydiumCpmm => raydium_cpmm::parse_raydium_cpmm_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
Protocol::RaydiumClmm => raydium_clmm::parse_raydium_clmm_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
Protocol::RaydiumAmmV4 => raydium_amm_v4::parse_raydium_amm_v4_instruction_data(
instruction_discriminator,
instruction_data,
accounts,
metadata,
),
}
}
#[inline]
pub fn dispatch_inner_instruction(
protocol: Protocol,
inner_instruction_discriminator: &[u8],
inner_instruction_data: &[u8],
mut metadata: EventMetadata,
) -> Option<DexEvent> {
use crate::streaming::event_parser::common::ProtocolType;
metadata.protocol = match protocol {
Protocol::PumpFun => ProtocolType::PumpFun,
Protocol::PumpSwap => ProtocolType::PumpSwap,
Protocol::Bonk => ProtocolType::Bonk,
Protocol::RaydiumCpmm => ProtocolType::RaydiumCpmm,
Protocol::RaydiumClmm => ProtocolType::RaydiumClmm,
Protocol::RaydiumAmmV4 => ProtocolType::RaydiumAmmV4,
};
match protocol {
Protocol::PumpFun => pumpfun::parse_pumpfun_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
Protocol::PumpSwap => pumpswap::parse_pumpswap_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
Protocol::Bonk => bonk::parse_bonk_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
Protocol::RaydiumCpmm => raydium_cpmm::parse_raydium_cpmm_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
Protocol::RaydiumClmm => raydium_clmm::parse_raydium_clmm_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
Protocol::RaydiumAmmV4 => raydium_amm_v4::parse_raydium_amm_v4_inner_instruction_data(
inner_instruction_discriminator,
inner_instruction_data,
metadata,
),
}
}
#[inline]
pub fn match_protocol_by_program_id(program_id: &Pubkey) -> Option<Protocol> {
if program_id == &pumpfun::PUMPFUN_PROGRAM_ID {
Some(Protocol::PumpFun)
} else if program_id == &pumpswap::PUMPSWAP_PROGRAM_ID {
Some(Protocol::PumpSwap)
} else if program_id == &bonk::BONK_PROGRAM_ID {
Some(Protocol::Bonk)
} else if program_id == &raydium_cpmm::RAYDIUM_CPMM_PROGRAM_ID {
Some(Protocol::RaydiumCpmm)
} else if program_id == &raydium_clmm::RAYDIUM_CLMM_PROGRAM_ID {
Some(Protocol::RaydiumClmm)
} else if program_id == &raydium_amm_v4::RAYDIUM_AMM_V4_PROGRAM_ID {
Some(Protocol::RaydiumAmmV4)
} else {
None
}
}
#[inline]
pub fn get_program_id(protocol: Protocol) -> Pubkey {
match protocol {
Protocol::PumpFun => pumpfun::PUMPFUN_PROGRAM_ID,
Protocol::PumpSwap => pumpswap::PUMPSWAP_PROGRAM_ID,
Protocol::Bonk => bonk::BONK_PROGRAM_ID,
Protocol::RaydiumCpmm => raydium_cpmm::RAYDIUM_CPMM_PROGRAM_ID,
Protocol::RaydiumClmm => raydium_clmm::RAYDIUM_CLMM_PROGRAM_ID,
Protocol::RaydiumAmmV4 => raydium_amm_v4::RAYDIUM_AMM_V4_PROGRAM_ID,
}
}
pub fn get_program_ids(protocols: &[Protocol]) -> Vec<Pubkey> {
protocols.iter().map(|p| Self::get_program_id(p.clone())).collect()
}
pub fn dispatch_account(
protocol: Protocol,
discriminator: &[u8],
account: &crate::streaming::grpc::AccountPretty,
mut metadata: crate::streaming::event_parser::common::EventMetadata,
) -> Option<DexEvent> {
use crate::streaming::event_parser::common::ProtocolType;
metadata.protocol = match protocol {
Protocol::PumpFun => ProtocolType::PumpFun,
Protocol::PumpSwap => ProtocolType::PumpSwap,
Protocol::Bonk => ProtocolType::Bonk,
Protocol::RaydiumCpmm => ProtocolType::RaydiumCpmm,
Protocol::RaydiumClmm => ProtocolType::RaydiumClmm,
Protocol::RaydiumAmmV4 => ProtocolType::RaydiumAmmV4,
};
match protocol {
Protocol::PumpFun => {
pumpfun::parse_pumpfun_account_data(discriminator, account, metadata)
}
Protocol::PumpSwap => {
pumpswap::parse_pumpswap_account_data(discriminator, account, metadata)
}
Protocol::Bonk => bonk::parse_bonk_account_data(discriminator, account, metadata),
Protocol::RaydiumCpmm => {
raydium_cpmm::parse_raydium_cpmm_account_data(discriminator, account, metadata)
}
Protocol::RaydiumClmm => {
raydium_clmm::parse_raydium_clmm_account_data(discriminator, account, metadata)
}
Protocol::RaydiumAmmV4 => {
raydium_amm_v4::parse_raydium_amm_v4_account_data(discriminator, account, metadata)
}
}
}
}