This commit is contained in:
2026-06-15 20:16:27 +02:00
parent 3b908b318e
commit 045af4931c
44 changed files with 5328 additions and 113 deletions

View File

@@ -318,6 +318,9 @@ fn infer_expected_db_target_for_entry(
if decoder_code == "pump_swap" {
return infer_pump_swap_expected_db_target(entry_name, entry_kind);
}
if decoder_code == "pump_fun" {
return infer_pump_fun_expected_db_target(entry_name, entry_kind);
}
if decoder_code == "raydium_cpmm"
&& (entry_name == "swap_event" || entry_name == "anchor_idl_instruction")
{
@@ -524,6 +527,104 @@ fn infer_expected_db_target(
return Some(target.to_string());
}
fn infer_pump_fun_expected_db_target(
entry_name: &str,
entry_kind: &str,
) -> std::option::Option<std::string::String> {
if entry_kind == crate::ENTRY_KIND_PROGRAM {
return None;
}
if entry_name == "buy"
|| entry_name == "sell"
|| entry_name == "buy_v2"
|| entry_name == "sell_v2"
|| entry_name == "buy_exact_sol_in"
|| entry_name == "buy_exact_quote_in_v2"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_TRADE_EVENTS.to_string());
}
if entry_name == "trade_event" {
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_TRADE_EVENTS.to_string());
}
if entry_name == "create"
|| entry_name == "create_event"
|| entry_name == "create_v2"
|| entry_name == "create_v2_token"
|| entry_name == "complete_event"
{
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(),
);
}
if entry_name == "migrate"
|| entry_name == "migrate_v2"
|| entry_name == "migrate_bonding_curve_creator"
|| entry_name == "migrate_bonding_curve_creator_event"
|| entry_name == "complete_pump_amm_migration_event"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_LAUNCH_EVENTS.to_string());
}
if entry_name == "collect_creator_fee"
|| entry_name == "collect_creator_fee_v2"
|| entry_name == "collect_creator_fee_event"
|| entry_name == "distribute_creator_fees"
|| entry_name == "distribute_creator_fees_v2"
|| entry_name == "distribute_creator_fees_event"
|| entry_name == "get_minimum_distributable_fee"
|| entry_name == "minimum_distributable_fee_event"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_FEE_EVENTS.to_string());
}
if entry_name == "claim_cashback"
|| entry_name == "claim_cashback_v2"
|| entry_name == "claim_cashback_event"
|| entry_name == "claim_token_incentives"
|| entry_name == "claim_token_incentives_event"
|| entry_name == "admin_update_token_incentives"
|| entry_name == "admin_update_token_incentives_event"
|| entry_name == "init_user_volume_accumulator"
|| entry_name == "init_user_volume_accumulator_event"
|| entry_name == "sync_user_volume_accumulator"
|| entry_name == "sync_user_volume_accumulator_event"
|| entry_name == "close_user_volume_accumulator"
|| entry_name == "close_user_volume_accumulator_event"
{
return Some(crate::DexEventCoverageEntryDto::DB_TARGET_REWARD_EVENTS.to_string());
}
if entry_name == "admin_set_creator"
|| entry_name == "admin_set_creator_event"
|| entry_name == "admin_set_idl_authority"
|| entry_name == "admin_set_idl_authority_event"
|| entry_name == "add_quote_mint"
|| entry_name == "remove_quote_mint"
|| entry_name == "extend_account"
|| entry_name == "extend_account_event"
|| entry_name == "set_creator"
|| entry_name == "set_creator_event"
|| entry_name == "set_mayhem_virtual_params"
|| entry_name == "update_mayhem_virtual_params_event"
|| entry_name == "set_metaplex_creator"
|| entry_name == "set_metaplex_creator_event"
|| entry_name == "set_params"
|| entry_name == "set_params_event"
|| entry_name == "set_reserved_fee_recipients"
|| entry_name == "reserved_fee_recipients_event"
|| entry_name == "set_virtual_quote_reserves"
|| entry_name == "toggle_cashback_enabled"
|| entry_name == "toggle_create_v2"
|| entry_name == "toggle_mayhem_mode"
|| entry_name == "update_buyback_config"
|| entry_name == "update_global_authority"
|| entry_name == "update_global_authority_event"
{
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_swap_expected_db_target(
entry_name: &str,
entry_kind: &str,
@@ -654,6 +755,161 @@ fn infer_pump_swap_event_family(
return infer_event_family(entry_name, entry_kind);
}
fn infer_pump_fun_event_family(
entry_name: &str,
entry_kind: &str,
) -> std::option::Option<std::string::String> {
if entry_kind == crate::ENTRY_KIND_PROGRAM {
return None;
}
match entry_name {
"buy"
| "sell"
| "buy_v2"
| "sell_v2"
| "buy_exact_quote_in_v2"
| "buy_exact_sol_in"
| "trade_event" => return Some("swap".to_string()),
"create" | "create_event" | "create_v2" | "create_v2_token" | "complete_event" => {
return Some("launch".to_string());
},
"migrate"
| "migrate_v2"
| "migrate_bonding_curve_creator"
| "migrate_bonding_curve_creator_event"
| "complete_pump_amm_migration_event" => return Some("migration".to_string()),
"claim_cashback"
| "claim_cashback_v2"
| "claim_cashback_event"
| "claim_token_incentives"
| "claim_token_incentives_event"
| "admin_update_token_incentives"
| "admin_update_token_incentives_event"
| "init_user_volume_accumulator"
| "init_user_volume_accumulator_event"
| "sync_user_volume_accumulator"
| "sync_user_volume_accumulator_event"
| "close_user_volume_accumulator"
| "close_user_volume_accumulator_event" => return Some("reward".to_string()),
"collect_creator_fee"
| "collect_creator_fee_v2"
| "collect_creator_fee_event"
| "distribute_creator_fees"
| "distribute_creator_fees_v2"
| "distribute_creator_fees_event"
| "get_minimum_distributable_fee"
| "minimum_distributable_fee_event" => return Some("fee".to_string()),
"add_quote_mint"
| "remove_quote_mint"
| "admin_set_creator"
| "admin_set_creator_event"
| "admin_set_idl_authority"
| "admin_set_idl_authority_event"
| "extend_account"
| "extend_account_event"
| "set_creator"
| "set_creator_event"
| "set_mayhem_virtual_params"
| "update_mayhem_virtual_params_event"
| "set_metaplex_creator"
| "set_metaplex_creator_event"
| "set_params"
| "set_params_event"
| "set_reserved_fee_recipients"
| "reserved_fee_recipients_event"
| "set_virtual_quote_reserves"
| "toggle_cashback_enabled"
| "toggle_create_v2"
| "toggle_mayhem_mode"
| "update_buyback_config"
| "update_global_authority"
| "update_global_authority_event" => return Some("admin_config".to_string()),
"initialize" => return Some("pool_create".to_string()),
_ => return infer_event_family(entry_name, entry_kind),
}
}
fn pump_fun_local_event_kind(entry_name: &str) -> std::option::Option<std::string::String> {
if entry_name.ends_with("_event") {
return Some(format!("pump_fun.{}", entry_name));
}
match entry_name {
"buy" => return Some("pump_fun.buy".to_string()),
"sell" => return Some("pump_fun.sell".to_string()),
"create_v2" => return Some("pump_fun.create_v2_token".to_string()),
"add_quote_mint" => return Some("pump_fun.add_quote_mint".to_string()),
"admin_set_creator" => return Some("pump_fun.admin_set_creator".to_string()),
"admin_set_idl_authority" => {
return Some("pump_fun.admin_set_idl_authority".to_string());
},
"admin_update_token_incentives" => {
return Some("pump_fun.admin_update_token_incentives".to_string());
},
"buy_exact_quote_in_v2" => {
return Some("pump_fun.buy_exact_quote_in_v2".to_string());
},
"buy_exact_sol_in" => return Some("pump_fun.buy_exact_sol_in".to_string()),
"buy_v2" => return Some("pump_fun.buy_v2".to_string()),
"claim_cashback" => return Some("pump_fun.claim_cashback".to_string()),
"claim_cashback_v2" => return Some("pump_fun.claim_cashback_v2".to_string()),
"claim_token_incentives" => {
return Some("pump_fun.claim_token_incentives".to_string());
},
"close_user_volume_accumulator" => {
return Some("pump_fun.close_user_volume_accumulator".to_string());
},
"collect_creator_fee" => return Some("pump_fun.collect_creator_fee".to_string()),
"collect_creator_fee_v2" => return Some("pump_fun.collect_creator_fee_v2".to_string()),
"create" => return Some("pump_fun.create".to_string()),
"distribute_creator_fees" => {
return Some("pump_fun.distribute_creator_fees".to_string());
},
"distribute_creator_fees_v2" => {
return Some("pump_fun.distribute_creator_fees_v2".to_string());
},
"extend_account" => return Some("pump_fun.extend_account".to_string()),
"get_minimum_distributable_fee" => {
return Some("pump_fun.get_minimum_distributable_fee".to_string());
},
"init_user_volume_accumulator" => {
return Some("pump_fun.init_user_volume_accumulator".to_string());
},
"initialize" => return Some("pump_fun.initialize".to_string()),
"migrate" => return Some("pump_fun.migrate".to_string()),
"migrate_bonding_curve_creator" => {
return Some("pump_fun.migrate_bonding_curve_creator".to_string());
},
"migrate_v2" => return Some("pump_fun.migrate_v2".to_string()),
"remove_quote_mint" => return Some("pump_fun.remove_quote_mint".to_string()),
"sell_v2" => return Some("pump_fun.sell_v2".to_string()),
"set_creator" => return Some("pump_fun.set_creator".to_string()),
"set_mayhem_virtual_params" => {
return Some("pump_fun.set_mayhem_virtual_params".to_string());
},
"set_metaplex_creator" => return Some("pump_fun.set_metaplex_creator".to_string()),
"set_params" => return Some("pump_fun.set_params".to_string()),
"set_reserved_fee_recipients" => {
return Some("pump_fun.set_reserved_fee_recipients".to_string());
},
"set_virtual_quote_reserves" => {
return Some("pump_fun.set_virtual_quote_reserves".to_string());
},
"sync_user_volume_accumulator" => {
return Some("pump_fun.sync_user_volume_accumulator".to_string());
},
"toggle_cashback_enabled" => {
return Some("pump_fun.toggle_cashback_enabled".to_string());
},
"toggle_create_v2" => return Some("pump_fun.toggle_create_v2".to_string()),
"toggle_mayhem_mode" => return Some("pump_fun.toggle_mayhem_mode".to_string()),
"update_buyback_config" => return Some("pump_fun.update_buyback_config".to_string()),
"update_global_authority" => {
return Some("pump_fun.update_global_authority".to_string());
},
_ => return None,
}
}
fn pump_swap_local_event_kind(entry_name: &str) -> std::option::Option<std::string::String> {
if entry_name.ends_with("_event") {
return Some(format!("pump_swap.{}", entry_name));
@@ -716,6 +972,9 @@ fn infer_event_family_for_entry(
entry_name: &str,
entry_kind: &str,
) -> std::option::Option<std::string::String> {
if decoder_code == "pump_fun" {
return infer_pump_fun_event_family(entry_name, entry_kind);
}
if decoder_code == "pump_swap" {
return infer_pump_swap_event_family(entry_name, entry_kind);
}
@@ -1110,6 +1369,9 @@ pub(crate) fn known_local_event_kind(
decoder_code: &str,
entry_name: &str,
) -> std::option::Option<std::string::String> {
if decoder_code == "pump_fun" {
return pump_fun_local_event_kind(entry_name);
}
if decoder_code == "pump_swap" {
return pump_swap_local_event_kind(entry_name);
}
@@ -1488,6 +1750,85 @@ mod tests {
Some("raydium_clmm.pool_created_event".to_string())
);
}
#[test]
fn pump_fun_coverage_maps_local_idl_and_audit_entries() {
assert_eq!(
super::known_local_event_kind("pump_fun", "buy"),
Some("pump_fun.buy".to_string())
);
assert_eq!(
super::known_local_event_kind("pump_fun", "create_v2"),
Some("pump_fun.create_v2_token".to_string())
);
assert_eq!(
super::known_local_event_kind("pump_fun", "buy_v2"),
Some("pump_fun.buy_v2".to_string())
);
assert_eq!(
super::known_local_event_kind("pump_fun", "collect_creator_fee_v2"),
Some("pump_fun.collect_creator_fee_v2".to_string())
);
assert_eq!(
super::known_local_event_kind("pump_fun", "trade_event"),
Some("pump_fun.trade_event".to_string())
);
assert_eq!(
super::known_local_event_kind("pump_fun", "claim_cashback_event"),
Some("pump_fun.claim_cashback_event".to_string())
);
assert_eq!(
super::infer_event_family_for_entry("pump_fun", "create_event", crate::ENTRY_KIND_EVENT),
Some("launch".to_string())
);
assert_eq!(
super::infer_event_family_for_entry(
"pump_fun",
"set_metaplex_creator_event",
crate::ENTRY_KIND_EVENT,
),
Some("admin_config".to_string())
);
assert_eq!(
super::infer_event_family_for_entry(
"pump_fun",
"claim_token_incentives_event",
crate::ENTRY_KIND_EVENT,
),
Some("reward".to_string())
);
assert_eq!(
super::infer_event_family_for_entry("pump_fun", "buy_v2", crate::ENTRY_KIND_INSTRUCTION),
Some("swap".to_string())
);
assert_eq!(
super::infer_expected_db_target_for_entry(
"pump_fun",
"buy",
Some("swap"),
crate::ENTRY_KIND_INSTRUCTION,
),
Some(crate::DexEventCoverageEntryDto::DB_TARGET_TRADE_EVENTS.to_string())
);
assert_eq!(
super::infer_expected_db_target_for_entry(
"pump_fun",
"buy_v2",
Some("swap"),
crate::ENTRY_KIND_INSTRUCTION,
),
Some(crate::DexEventCoverageEntryDto::DB_TARGET_TRADE_EVENTS.to_string())
);
assert_eq!(
super::infer_expected_db_target_for_entry(
"pump_fun",
"create_v2",
Some("launch"),
crate::ENTRY_KIND_INSTRUCTION,
),
Some(crate::DexEventCoverageEntryDto::DB_TARGET_LAUNCH_EVENTS.to_string())
);
}
#[test]
fn launchpad_swap_instructions_materialize_as_launch_events_without_duplicate_trades() {
assert_eq!(