This commit is contained in:
2026-06-16 06:57:32 +02:00
parent 045af4931c
commit be12f5810b
23 changed files with 4118 additions and 107 deletions

View File

@@ -112,7 +112,7 @@ WHERE decoded_event_id IN (
WHERE transaction_id = ?
AND protocol_name IN (
'raydium_amm_v4', 'raydium_cpmm', 'raydium_clmm', 'raydium_launchpad',
'pump_fun', 'pump_swap', 'meteora_dbc', 'meteora_dlmm', 'meteora_damm_v1',
'pump_fun', 'pump_fees', 'pump_swap', 'meteora_dbc', 'meteora_dlmm', 'meteora_damm_v1',
'meteora_damm_v2', 'orca_whirlpools', 'fluxbeam', 'dexlab', 'openbook_v2',
'phoenix_v1'
)
@@ -160,7 +160,7 @@ DELETE FROM k_sol_dex_decoded_events
WHERE transaction_id = ?
AND protocol_name IN (
'raydium_amm_v4', 'raydium_cpmm', 'raydium_clmm', 'raydium_launchpad',
'pump_fun', 'pump_swap', 'meteora_dbc', 'meteora_dlmm', 'meteora_damm_v1',
'pump_fun', 'pump_fees', 'pump_swap', 'meteora_dbc', 'meteora_dlmm', 'meteora_damm_v1',
'meteora_damm_v2', 'orca_whirlpools', 'fluxbeam', 'dexlab', 'openbook_v2',
'phoenix_v1'
)

View File

@@ -11,6 +11,7 @@ mod meteora_dlmm;
mod openbook_v2;
mod orca_whirlpools;
mod phoenix_v1;
mod pump_fees;
mod pump_fun;
mod pump_swap;
mod raydium_amm_v4;
@@ -61,14 +62,17 @@ pub use orca_whirlpools::OrcaWhirlpoolsSwapDecoded;
pub use phoenix_v1::PhoenixV1AuditDecoded;
pub use phoenix_v1::PhoenixV1DecodedEvent;
pub use phoenix_v1::PhoenixV1Decoder;
pub use pump_fees::PumpFeesDecodedEvent;
pub use pump_fees::PumpFeesDecoder;
pub use pump_fees::PumpFeesInstructionDecoded;
pub use pump_fun::PumpFunCreateV2TokenDecoded;
pub use pump_fun::PumpFunInstructionAuditDecoded;
pub use pump_fun::PumpFunDecodedEvent;
pub use pump_fun::PumpFunDecoder;
pub use pump_fun::PumpFunInstructionAuditDecoded;
pub use pump_fun::PumpFunTradeDecoded;
pub use pump_swap::PumpSwapDecodedEvent;
pub use pump_swap::PumpSwapInstructionDecoded;
pub use pump_swap::PumpSwapDecoder;
pub use pump_swap::PumpSwapInstructionDecoded;
pub use pump_swap::PumpSwapTradeDecoded;
pub use raydium_amm_v4::RaydiumAmmV4DecodedEvent;
pub use raydium_amm_v4::RaydiumAmmV4Decoder;

2447
kb_lib/src/dex/pump_fees.rs Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,7 @@ pub struct DexDecodeService {
raydium_clmm_decoder: crate::RaydiumClmmDecoder,
raydium_stable_swap_decoder: crate::RaydiumStableSwapDecoder,
pump_fun_decoder: crate::PumpFunDecoder,
pump_fees_decoder: crate::PumpFeesDecoder,
pump_swap_decoder: crate::PumpSwapDecoder,
orca_whirlpools_decoder: crate::OrcaWhirlpoolsDecoder,
meteora_dbc_decoder: crate::MeteoraDbcDecoder,
@@ -36,6 +37,7 @@ impl DexDecodeService {
raydium_clmm_decoder: crate::RaydiumClmmDecoder::new(),
raydium_stable_swap_decoder: crate::RaydiumStableSwapDecoder::new(),
pump_fun_decoder: crate::PumpFunDecoder::new(),
pump_fees_decoder: crate::PumpFeesDecoder::new(),
pump_swap_decoder: crate::PumpSwapDecoder::new(),
orca_whirlpools_decoder: crate::OrcaWhirlpoolsDecoder::new(),
meteora_dbc_decoder: crate::MeteoraDbcDecoder::new(),
@@ -133,6 +135,13 @@ impl DexDecodeService {
if let Err(error) = append_result {
return Err(error);
}
let append_result = append_persisted_events_result(
&mut persisted,
self.decode_and_persist_pump_fees_events(&transaction, &instructions).await,
);
if let Err(error) = append_result {
return Err(error);
}
let append_result = append_persisted_events_result(
&mut persisted,
self.decode_and_persist_meteora_dbc_events(&transaction, &instructions).await,
@@ -1679,32 +1688,31 @@ impl DexDecodeService {
}
}
fn pump_fun_payload_string(
payload: &serde_json::Value,
keys: &[&str],
) -> std::option::Option<std::string::String> {
if let Some(object) = payload.as_object() {
for key in keys {
let value = object.get(*key);
if let Some(value) = value {
if let Some(text) = value.as_str() {
if !text.trim().is_empty() {
return Some(text.to_string());
fn pump_fun_payload_string(
payload: &serde_json::Value,
keys: &[&str],
) -> std::option::Option<std::string::String> {
if let Some(object) = payload.as_object() {
for key in keys {
let value = object.get(*key);
if let Some(value) = value {
if let Some(text) = value.as_str() {
if !text.trim().is_empty() {
return Some(text.to_string());
}
}
}
}
}
let decoded_arguments = object.get("decodedArguments");
if let Some(decoded_arguments) = decoded_arguments {
let nested = Self::pump_fun_payload_string(decoded_arguments, keys);
if nested.is_some() {
return nested;
let decoded_arguments = object.get("decodedArguments");
if let Some(decoded_arguments) = decoded_arguments {
let nested = Self::pump_fun_payload_string(decoded_arguments, keys);
if nested.is_some() {
return nested;
}
}
}
return None;
}
return None;
}
async fn persist_pump_fun_trade_event(
&self,
@@ -1739,6 +1747,44 @@ fn pump_fun_payload_string(
.await;
}
async fn persist_pump_fees_event(
&self,
transaction: &crate::ChainTransactionDto,
decoded_event: &crate::PumpFeesDecodedEvent,
) -> Result<crate::DexDecodedEventDto, crate::Error> {
match decoded_event {
crate::PumpFeesDecodedEvent::Instruction(event) => {
return self.persist_pump_fees_instruction_event(transaction, event).await;
},
crate::PumpFeesDecodedEvent::AnchorEvent(event) => {
return self.persist_pump_fees_instruction_event(transaction, event).await;
},
}
}
async fn persist_pump_fees_instruction_event(
&self,
transaction: &crate::ChainTransactionDto,
event: &crate::PumpFeesInstructionDecoded,
) -> Result<crate::DexDecodedEventDto, crate::Error> {
return self
.materialize_named_dex_event(
transaction,
event.transaction_id,
event.instruction_id,
"pump_fees",
event.program_id.clone(),
event.event_kind.as_str(),
event.pool_account.clone(),
None,
event.token_a_mint.clone(),
event.token_b_mint.clone(),
event.lp_mint.clone(),
event.payload_json.clone(),
)
.await;
}
async fn persist_pump_swap_event(
&self,
transaction: &crate::ChainTransactionDto,
@@ -2392,6 +2438,28 @@ fn pump_fun_payload_string(
return Ok(persisted);
}
async fn decode_and_persist_pump_fees_events(
&self,
transaction: &crate::ChainTransactionDto,
instructions: &[crate::ChainInstructionDto],
) -> Result<std::vec::Vec<crate::DexDecodedEventDto>, crate::Error> {
let decoded_result = self.pump_fees_decoder.decode_transaction(transaction, instructions);
let decoded_events = match decoded_result {
Ok(decoded_events) => decoded_events,
Err(error) => return Err(error),
};
let mut persisted = std::vec::Vec::new();
for decoded_event in &decoded_events {
let persist_result = self.persist_pump_fees_event(transaction, decoded_event).await;
let persisted_event = match persist_result {
Ok(persisted_event) => persisted_event,
Err(error) => return Err(error),
};
persisted.push(persisted_event);
}
return Ok(persisted);
}
async fn decode_and_persist_meteora_dbc_events(
&self,
transaction: &crate::ChainTransactionDto,
@@ -4404,7 +4472,6 @@ fn dex_decode_extract_first_amount_string(
return dex_decode_extract_first_number_as_string(value, candidate_keys);
}
fn pump_fun_enrich_trade_events_with_instruction_context(
decoded_events: std::vec::Vec<crate::PumpFunDecodedEvent>,
) -> std::vec::Vec<crate::PumpFunDecodedEvent> {
@@ -4439,18 +4506,12 @@ fn pump_fun_merge_matching_instruction_context_into_trade_event(
trade_event: &mut crate::PumpFunInstructionAuditDecoded,
) {
let trade_payload = trade_event.payload_json.clone();
let trade_instruction_id = dex_decode_extract_first_i64(
&trade_payload,
&["instructionId", "instruction_id"],
);
let trade_mint = dex_decode_extract_first_string(
&trade_payload,
&["mint", "tokenMint", "tokenAMint"],
);
let trade_actor = dex_decode_extract_first_string(
&trade_payload,
&["user", "actorWallet", "userWallet"],
);
let trade_instruction_id =
dex_decode_extract_first_i64(&trade_payload, &["instructionId", "instruction_id"]);
let trade_mint =
dex_decode_extract_first_string(&trade_payload, &["mint", "tokenMint", "tokenAMint"]);
let trade_actor =
dex_decode_extract_first_string(&trade_payload, &["user", "actorWallet", "userWallet"]);
for sibling in decoded_events {
let sibling_event = match sibling {
crate::PumpFunDecodedEvent::InstructionAudit(sibling_event) => sibling_event,
@@ -4506,18 +4567,12 @@ fn pump_fun_mark_trade_event_duplicate_when_direct_instruction_exists(
trade_event: &mut crate::PumpFunInstructionAuditDecoded,
) {
let trade_payload = trade_event.payload_json.clone();
let trade_instruction_id = dex_decode_extract_first_i64(
&trade_payload,
&["instructionId", "instruction_id"],
);
let trade_mint = dex_decode_extract_first_string(
&trade_payload,
&["mint", "tokenMint", "tokenAMint"],
);
let trade_actor = dex_decode_extract_first_string(
&trade_payload,
&["user", "actorWallet", "userWallet"],
);
let trade_instruction_id =
dex_decode_extract_first_i64(&trade_payload, &["instructionId", "instruction_id"]);
let trade_mint =
dex_decode_extract_first_string(&trade_payload, &["mint", "tokenMint", "tokenAMint"]);
let trade_actor =
dex_decode_extract_first_string(&trade_payload, &["user", "actorWallet", "userWallet"]);
for sibling in decoded_events {
let direct_match = match sibling {
crate::PumpFunDecodedEvent::BuyTrade(event) => {
@@ -4613,7 +4668,6 @@ fn pump_fun_direct_trade_matches_anchor_trade_event(
return true;
}
fn pump_fun_merge_instruction_context_payload(
instruction_payload: &serde_json::Value,
trade_payload: &mut serde_json::Value,

View File

@@ -294,6 +294,9 @@ pub fn is_dex_informational_event_kind(event_kind: &str) -> bool {
if event_kind == crate::UPSTREAM_REGISTRY_INSTRUCTION_MATCH_EVENT_KIND {
return true;
}
if event_kind == "pump_fees.get_fees" {
return true;
}
if event_kind.contains(".instruction_audit") {
return true;
}
@@ -487,6 +490,13 @@ pub fn is_dex_position_close_event_kind(event_kind: &str) -> bool {
/// Returns true for fee collection events.
pub fn is_dex_fee_event_kind(event_kind: &str) -> bool {
if event_kind.starts_with("pump_fees.")
&& (event_kind.contains("donation_fee_pda_cranked")
|| event_kind.contains("sweep_buyback")
|| event_kind.contains("crank_donation_fee_pda"))
{
return true;
}
if event_kind.contains("claim_creator_fee") {
return true;
}
@@ -543,6 +553,12 @@ pub fn is_dex_fee_event_kind(event_kind: &str) -> bool {
/// Returns true for reward or incentive events.
pub fn is_dex_reward_event_kind(event_kind: &str) -> bool {
if event_kind.starts_with("pump_fees.")
&& (event_kind.contains("social_fee_pda_claimed")
|| event_kind.contains("claim_social_fee_pda"))
{
return true;
}
if event_kind.contains("reward") {
return true;
}
@@ -607,6 +623,19 @@ pub fn is_dex_orderbook_event_kind(event_kind: &str) -> bool {
/// Returns true for pool, pair, launch, mint, burn or migration lifecycle events.
pub fn is_dex_pool_lifecycle_event_kind(event_kind: &str) -> bool {
if event_kind.starts_with("pump_fees.")
&& (event_kind.contains("create_fee_sharing_config")
|| event_kind.contains("create_social_fee_pda")
|| event_kind.contains("create_donation_fee_pda")
|| event_kind.contains("social_fee_pda_created")
|| event_kind.contains("donation_fee_pda_created")
|| event_kind.contains("initialize_fee_config")
|| event_kind.contains("initialize_fee_program_global")
|| event_kind.contains("initialize_buyback")
|| event_kind.contains("extend_fee_config"))
{
return true;
}
if event_kind == "raydium_amm_v4.pre_initialize" {
return true;
}
@@ -795,6 +824,19 @@ pub fn is_dex_token_account_close_event_kind(event_kind: &str) -> bool {
/// Returns true for admin, configuration or permission changes.
pub fn is_dex_admin_event_kind(event_kind: &str) -> bool {
if event_kind.starts_with("pump_fees.")
&& (event_kind.contains("authority")
|| event_kind.contains("admin")
|| event_kind.contains("config")
|| event_kind.contains("tier")
|| event_kind.contains("disable")
|| event_kind.contains("reset_fee_sharing")
|| event_kind.contains("update_fee_shares")
|| event_kind.contains("set_claim_rate_limit")
|| event_kind.contains("buyback_claim_rate_limit"))
{
return true;
}
if event_kind.contains(".admin_cancel_orders") {
return false;
}
@@ -1233,9 +1275,7 @@ mod tests {
super::classify_dex_event_category_code("pump_swap.migrate_pool_coin_creator"),
"admin"
);
assert!(!super::is_dex_pool_lifecycle_event_kind(
"pump_swap.migrate_pool_coin_creator"
));
assert!(!super::is_dex_pool_lifecycle_event_kind("pump_swap.migrate_pool_coin_creator"));
assert_eq!(
super::classify_dex_event_category_code("raydium_clmm.increase_liquidity_v2"),
"liquidity"

View File

@@ -321,6 +321,9 @@ fn infer_expected_db_target_for_entry(
if decoder_code == "pump_fun" {
return infer_pump_fun_expected_db_target(entry_name, entry_kind);
}
if decoder_code == "pump_fees" {
return infer_pump_fees_expected_db_target(entry_name, entry_kind);
}
if decoder_code == "raydium_cpmm"
&& (entry_name == "swap_event" || entry_name == "anchor_idl_instruction")
{
@@ -527,6 +530,51 @@ fn infer_expected_db_target(
return Some(target.to_string());
}
fn infer_pump_fees_expected_db_target(
entry_name: &str,
entry_kind: &str,
) -> std::option::Option<std::string::String> {
if entry_kind == crate::ENTRY_KIND_PROGRAM || entry_kind == crate::ENTRY_KIND_ACCOUNT {
return None;
}
if entry_name == "get_fees" {
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_DECODED_EVENTS_ONLY.to_string());
}
if entry_name == "claim_social_fee_pda"
|| entry_name == "claim_social_fee_pda_v2"
|| entry_name == "social_fee_pda_claimed"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_REWARD_EVENTS.to_string());
}
if entry_name == "crank_donation_fee_pda"
|| entry_name == "donation_fee_pda_cranked"
|| entry_name == "sweep_buyback"
|| entry_name == "sweep_buyback_event"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_FEE_EVENTS.to_string());
}
if entry_name.contains("create_")
|| entry_name.contains("created")
|| entry_name.contains("initialize_")
|| entry_name == "extend_fee_config"
|| entry_name == "extend_fee_config_event"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_POOL_LIFECYCLE_EVENTS.to_string());
}
if entry_name.contains("config")
|| entry_name.contains("authority")
|| entry_name.contains("admin")
|| entry_name.contains("tier")
|| entry_name.contains("disable")
|| entry_name.contains("reset_fee_sharing")
|| entry_name.contains("update_fee_shares")
|| entry_name.contains("buyback_claim_rate_limit")
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_POOL_ADMIN_EVENTS.to_string());
}
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_DECODED_EVENTS_ONLY.to_string());
}
fn infer_pump_fun_expected_db_target(
entry_name: &str,
entry_kind: &str,
@@ -555,9 +603,7 @@ fn infer_pump_fun_expected_db_target(
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_LAUNCH_EVENTS.to_string());
}
if entry_name == "initialize" {
return Some(
crate::DexEventCoverageEntryDto::DB_TARGET_POOL_LIFECYCLE_EVENTS.to_string(),
);
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_POOL_LIFECYCLE_EVENTS.to_string());
}
if entry_name == "migrate"
|| entry_name == "migrate_v2"
@@ -755,6 +801,58 @@ fn infer_pump_swap_event_family(
return infer_event_family(entry_name, entry_kind);
}
fn infer_pump_fees_event_family(
entry_name: &str,
entry_kind: &str,
) -> std::option::Option<std::string::String> {
if entry_kind == crate::ENTRY_KIND_PROGRAM || entry_kind == crate::ENTRY_KIND_ACCOUNT {
return None;
}
if entry_name == "get_fees" {
return Some("audit".to_string());
}
if entry_name == "claim_social_fee_pda"
|| entry_name == "claim_social_fee_pda_v2"
|| entry_name == "social_fee_pda_claimed"
{
return Some("reward".to_string());
}
if entry_name == "crank_donation_fee_pda"
|| entry_name == "donation_fee_pda_cranked"
|| entry_name == "sweep_buyback"
|| entry_name == "sweep_buyback_event"
{
return Some("fee".to_string());
}
if entry_name.contains("create_")
|| entry_name.contains("created")
|| entry_name.contains("initialize_")
|| entry_name == "extend_fee_config"
|| entry_name == "extend_fee_config_event"
{
return Some("pool_create".to_string());
}
if entry_name.contains("config")
|| entry_name.contains("authority")
|| entry_name.contains("admin")
|| entry_name.contains("tier")
|| entry_name.contains("disable")
|| entry_name.contains("reset_fee_sharing")
|| entry_name.contains("update_fee_shares")
|| entry_name.contains("buyback_claim_rate_limit")
{
return Some("admin_config".to_string());
}
return Some("audit".to_string());
}
fn pump_fees_local_event_kind(entry_name: &str) -> std::option::Option<std::string::String> {
if entry_name == "program" || entry_name == "program_alias" {
return None;
}
return Some(format!("pump_fees.{}", entry_name));
}
fn infer_pump_fun_event_family(
entry_name: &str,
entry_kind: &str,
@@ -975,6 +1073,9 @@ fn infer_event_family_for_entry(
if decoder_code == "pump_fun" {
return infer_pump_fun_event_family(entry_name, entry_kind);
}
if decoder_code == "pump_fees" {
return infer_pump_fees_event_family(entry_name, entry_kind);
}
if decoder_code == "pump_swap" {
return infer_pump_swap_event_family(entry_name, entry_kind);
}
@@ -1268,7 +1369,7 @@ fn infer_event_family(
if normalized.contains("stake") {
return Some("stake".to_string());
}
return Some("unknown".to_string());
return Some("audit".to_string());
}
fn contains_any(value: &str, needles: &[&str]) -> bool {
@@ -1372,6 +1473,9 @@ pub(crate) fn known_local_event_kind(
if decoder_code == "pump_fun" {
return pump_fun_local_event_kind(entry_name);
}
if decoder_code == "pump_fees" {
return pump_fees_local_event_kind(entry_name);
}
if decoder_code == "pump_swap" {
return pump_swap_local_event_kind(entry_name);
}
@@ -1590,6 +1694,26 @@ mod tests {
return std::sync::Arc::new(database);
}
#[test]
fn generic_event_family_fallback_is_audit_not_unknown() {
assert_eq!(
super::infer_event_family("non_matching_entry", crate::ENTRY_KIND_INSTRUCTION),
Some("audit".to_string())
);
}
#[test]
fn pump_fees_event_family_fallback_is_audit() {
assert_eq!(
super::infer_event_family_for_entry(
"pump_fees",
"non_matching_entry",
crate::ENTRY_KIND_INSTRUCTION
),
Some("audit".to_string())
);
}
#[test]
fn event_family_inference_covers_raydium_cpmm_core_entries() {
assert_eq!(
@@ -1777,7 +1901,11 @@ mod tests {
Some("pump_fun.claim_cashback_event".to_string())
);
assert_eq!(
super::infer_event_family_for_entry("pump_fun", "create_event", crate::ENTRY_KIND_EVENT),
super::infer_event_family_for_entry(
"pump_fun",
"create_event",
crate::ENTRY_KIND_EVENT
),
Some("launch".to_string())
);
assert_eq!(
@@ -1797,7 +1925,11 @@ mod tests {
Some("reward".to_string())
);
assert_eq!(
super::infer_event_family_for_entry("pump_fun", "buy_v2", crate::ENTRY_KIND_INSTRUCTION),
super::infer_event_family_for_entry(
"pump_fun",
"buy_v2",
crate::ENTRY_KIND_INSTRUCTION
),
Some("swap".to_string())
);
assert_eq!(

View File

@@ -319,6 +319,42 @@ fn resolve_instruction_name(
};
return Some(format!("raydium_launchpad.{}", layout.instruction_name));
}
if program_id == crate::PUMP_FEES_PROGRAM_ID || decoder_code == Some("pump_fees") {
let name = match discriminator_hex {
"e445a52e51cb9a1d" => "anchor_self_cpi_log",
"e115fb85a11ec7e2" => "claim_social_fee_pda",
"114df0863abc3595" => "claim_social_fee_pda_v2",
"dc0abda7a9111945" => "crank_donation_fee_pda",
"f48b10580eff7a1a" => "create_donation_fee_pda",
"c34e564c6f34fbd5" => "create_fee_sharing_config",
"90e03bd34ef8cadc" => "create_social_fee_pda",
"44b3f45aad3811d9" => "extend_fee_config",
"e7257e55cf5b3f34" => "get_fees",
"fa81eca0e3246786" => "initialize_buyback",
"3ea214857941911b" => "initialize_fee_config",
"23d78254e9387ca7" => "initialize_fee_program_global",
"0a02b65f107f81ba" => "reset_fee_sharing_config",
"a9f511d15e5bf880" => "reset_fee_sharing_config_v2",
"12e99e27b9cf3a68" => "revoke_fee_sharing_authority",
"85fa25156ea31a79" => "set_authority",
"b9d39faed4315804" => "set_claim_rate_limit",
"c2d9702372de33be" => "set_disable_flags",
"9336b89a88edb999" => "set_social_claim_authority",
"8a21cc26cfa19fe2" => "sweep_buyback",
"ca0a4bc8a422d260" => "transfer_fee_sharing_authority",
"a1b028d53cb8b3e4" => "update_admin",
"426271ca7925db6b" => "update_buyback_authority",
"ba5f87beffc789aa" => "update_buyback_claim_rate_limit",
"68b867f258976b14" => "update_fee_config",
"bd0d8863bba4ed23" => "update_fee_shares",
"6ffb31064e4e6a12" => "update_fee_shares_v2",
"6ba964b3869b92dd" => "update_stable_fee_config",
"e317960c4d565e04" => "upsert_fee_tiers",
"b5a0a2fc4a4ce0dd" => "upsert_stable_fee_tiers",
_ => return None,
};
return Some(format!("pump_fees.{}", name));
}
if program_id == crate::PUMP_FUN_PROGRAM_ID || decoder_code == Some("pump_fun") {
let name = match discriminator_hex {
"e445a52e51cb9a1d" => "anchor_self_cpi_log",

View File

@@ -1171,6 +1171,12 @@ pub use dex::PhoenixV1AuditDecoded;
pub use dex::PhoenixV1DecodedEvent;
/// Phoenix v1 audit-only decoder.
pub use dex::PhoenixV1Decoder;
/// Decoded Pump Fees event.
pub use dex::PumpFeesDecodedEvent;
/// Pump Fees decoder.
pub use dex::PumpFeesDecoder;
/// Decoded Pump Fees instruction or Anchor event.
pub use dex::PumpFeesInstructionDecoded;
/// Decoded Pump.fun `create_v2` token event.
pub use dex::PumpFunCreateV2TokenDecoded;
/// Decoded Pump.fun event.

View File

@@ -16,6 +16,35 @@ const RAYDIUM_IDL_SOURCE_REPO: &str = "raydium-io/raydium-idl";
const MANUAL_SOLSCAN_SOURCE_REPO: &str = "manual-solscan";
const RAYDIUM_IDL_DISCRIMINATOR_NOTES: &str = "entry name and discriminator extracted from Raydium official IDL snapshot; not corpus-verified; no trade/candle/materialization proof";
const MANUAL_SOLSCAN_DISCRIMINATOR_NOTES: &str = "entry name and discriminator derived from manual Solscan program IDL or Solscan transaction-log inspection; no trade/candle/materialization proof";
const LOCAL_IDL_SOURCE_REPO: &str = "local-idl";
const LOCAL_IDL_DISCRIMINATOR_NOTES: &str = "entry name and discriminator extracted from local IDL snapshot; not corpus-verified; no trade/candle/materialization proof";
const fn local_idl_discriminator_entry(
decoder_code: &'static str,
program_id: std::option::Option<&'static str>,
program_family: &'static str,
surface_kind: &'static str,
entry_kind: &'static str,
entry_name: &'static str,
discriminator_hex: &'static str,
discriminator_len: u16,
source_path: &'static str,
) -> crate::UpstreamRegistryEntry {
return crate::UpstreamRegistryEntry {
source_repo: Some(LOCAL_IDL_SOURCE_REPO),
source_path: Some(source_path),
decoder_code,
program_id,
program_family,
surface_kind,
entry_kind,
entry_name,
discriminator_hex: Some(discriminator_hex),
discriminator_len: Some(discriminator_len),
proof_status: crate::PROOF_STATUS_UPSTREAM_GIT_UNVERIFIED,
notes: LOCAL_IDL_DISCRIMINATOR_NOTES,
};
}
const fn manual_solscan_discriminator_entry(
decoder_code: &'static str,
@@ -10459,6 +10488,204 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[
8,
"decoders/pump-fees-decoder/src/events/upsert_fee_tiers_event.rs",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"claim_social_fee_pda_v2",
"114df0863abc3595",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"crank_donation_fee_pda",
"dc0abda7a9111945",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"create_donation_fee_pda",
"f48b10580eff7a1a",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"extend_fee_config",
"44b3f45aad3811d9",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"initialize_buyback",
"fa81eca0e3246786",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"reset_fee_sharing_config_v2",
"a9f511d15e5bf880",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"sweep_buyback",
"8a21cc26cfa19fe2",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"update_buyback_authority",
"426271ca7925db6b",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"update_buyback_claim_rate_limit",
"ba5f87beffc789aa",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"update_fee_shares_v2",
"6ffb31064e4e6a12",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"update_stable_fee_config",
"6ba964b3869b92dd",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_INSTRUCTION,
"upsert_stable_fee_tiers",
"b5a0a2fc4a4ce0dd",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"donation_fee_pda_cranked",
"1ed06b5db100df4e",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"donation_fee_pda_created",
"5e1489ef234de1eb",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"extend_fee_config_event",
"e2cbe023990a5833",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"sweep_buyback_event",
"2b382ad69939a689",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"update_stable_fee_config_event",
"5e052bed6793e8f5",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
local_idl_discriminator_entry(
"pump_fees",
Some(crate::PUMP_FEES_PROGRAM_ID),
"pump",
"fee_program",
crate::ENTRY_KIND_EVENT,
"upsert_stable_fee_tiers_event",
"e8eded34629249f3",
8,
"idls/pump_fees.pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ.json",
),
upstream_git_discriminator_entry(
"pump_swap",
Some(crate::PUMP_SWAP_PROGRAM_ID),