Files
solana-streamer/src/streaming/parser_sdk_bridge/pump_pumpswap.rs
T

692 lines
26 KiB
Rust

//! PumpFun / PumpSwap field mapping and aggregate trade conversion.
use crate::streaming::event_parser::common::types::{EventType, ProtocolType};
use crate::streaming::event_parser::common::EventMetadata;
use crate::streaming::event_parser::protocols::pumpfun::events::{
PumpFeesConfigStatus, PumpFeesCreateFeeSharingConfigEvent, PumpFeesFeeTier, PumpFeesFees,
PumpFeesInitializeFeeConfigEvent, PumpFeesResetFeeSharingConfigEvent,
PumpFeesRevokeFeeSharingAuthorityEvent, PumpFeesShareholder,
PumpFeesTransferFeeSharingAuthorityEvent, PumpFeesUpdateAdminEvent,
PumpFeesUpdateFeeConfigEvent, PumpFeesUpdateFeeSharesEvent, PumpFeesUpsertFeeTiersEvent,
PumpFunCreateTokenEvent, PumpFunCreateV2TokenEvent, PumpFunGlobalAccountEvent,
PumpFunMigrateBondingCurveCreatorEvent, PumpFunMigrateEvent, PumpFunTradeEvent,
};
use crate::streaming::event_parser::protocols::pumpfun::types::Global;
use crate::streaming::event_parser::protocols::pumpswap::events::{
PumpSwapBuyEvent, PumpSwapCreatePoolEvent, PumpSwapDepositEvent, PumpSwapSellEvent,
PumpSwapWithdrawEvent,
};
use crate::streaming::event_parser::DexEvent;
use prost_types::Timestamp;
use solana_sdk::pubkey::Pubkey;
use super::adapt::adapt_pm;
use super::program_ids::{pump_program, pumpswap_program};
pub(crate) fn pumpfun_create_token_from_parser(
c: sol_parser_sdk::core::events::PumpFunCreateTokenEvent,
meta: EventMetadata,
) -> PumpFunCreateTokenEvent {
PumpFunCreateTokenEvent {
metadata: meta,
name: c.name,
symbol: c.symbol,
uri: c.uri,
mint: c.mint,
bonding_curve: c.bonding_curve,
user: c.user,
creator: c.creator,
timestamp: c.timestamp,
virtual_token_reserves: c.virtual_token_reserves,
virtual_sol_reserves: c.virtual_sol_reserves,
real_token_reserves: c.real_token_reserves,
token_total_supply: c.token_total_supply,
token_program: c.token_program,
is_mayhem_mode: c.is_mayhem_mode,
is_cashback_enabled: c.is_cashback_enabled,
..Default::default()
}
}
pub(crate) fn pumpfun_create_v2_from_parser(
c: sol_parser_sdk::core::events::PumpFunCreateV2TokenEvent,
meta: EventMetadata,
) -> PumpFunCreateV2TokenEvent {
PumpFunCreateV2TokenEvent {
metadata: meta,
name: c.name,
symbol: c.symbol,
uri: c.uri,
mint: c.mint,
bonding_curve: c.bonding_curve,
user: c.user,
creator: c.creator,
timestamp: c.timestamp,
virtual_token_reserves: c.virtual_token_reserves,
virtual_sol_reserves: c.virtual_sol_reserves,
real_token_reserves: c.real_token_reserves,
token_total_supply: c.token_total_supply,
token_program: c.token_program,
is_mayhem_mode: c.is_mayhem_mode,
is_cashback_enabled: c.is_cashback_enabled,
mint_authority: c.mint_authority,
associated_bonding_curve: c.associated_bonding_curve,
global: c.global,
system_program: c.system_program,
associated_token_program: c.associated_token_program,
mayhem_program_id: c.mayhem_program_id,
global_params: c.global_params,
sol_vault: c.sol_vault,
mayhem_state: c.mayhem_state,
mayhem_token_vault: c.mayhem_token_vault,
event_authority: c.event_authority,
program: c.program,
}
}
pub(crate) fn pumpfun_migrate_from_parser(
m: sol_parser_sdk::core::events::PumpFunMigrateEvent,
meta: EventMetadata,
) -> PumpFunMigrateEvent {
PumpFunMigrateEvent {
metadata: meta,
user: m.user,
mint: m.mint,
mint_amount: m.mint_amount,
sol_amount: m.sol_amount,
pool_migration_fee: m.pool_migration_fee,
bonding_curve: m.bonding_curve,
timestamp: m.timestamp,
pool: m.pool,
..Default::default()
}
}
fn pump_fees_status_from_parser(
s: sol_parser_sdk::core::events::PumpFeesConfigStatus,
) -> PumpFeesConfigStatus {
match s {
sol_parser_sdk::core::events::PumpFeesConfigStatus::Paused => PumpFeesConfigStatus::Paused,
sol_parser_sdk::core::events::PumpFeesConfigStatus::Active => PumpFeesConfigStatus::Active,
}
}
fn pump_fees_shareholder_from_parser(
s: sol_parser_sdk::core::events::PumpFeesShareholder,
) -> PumpFeesShareholder {
PumpFeesShareholder { address: s.address, share_bps: s.share_bps }
}
fn pump_fees_fees_from_parser(f: sol_parser_sdk::core::events::PumpFeesFees) -> PumpFeesFees {
PumpFeesFees {
lp_fee_bps: f.lp_fee_bps,
protocol_fee_bps: f.protocol_fee_bps,
creator_fee_bps: f.creator_fee_bps,
}
}
fn pump_fees_tier_from_parser(t: sol_parser_sdk::core::events::PumpFeesFeeTier) -> PumpFeesFeeTier {
PumpFeesFeeTier {
market_cap_lamports_threshold: t.market_cap_lamports_threshold,
fees: pump_fees_fees_from_parser(t.fees),
}
}
pub(crate) fn pump_fees_create_sharing_config_from_parser(
e: sol_parser_sdk::core::events::PumpFeesCreateFeeSharingConfigEvent,
meta: EventMetadata,
) -> PumpFeesCreateFeeSharingConfigEvent {
PumpFeesCreateFeeSharingConfigEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
bonding_curve: e.bonding_curve,
pool: e.pool,
sharing_config: e.sharing_config,
admin: e.admin,
initial_shareholders: e
.initial_shareholders
.into_iter()
.map(pump_fees_shareholder_from_parser)
.collect(),
status: pump_fees_status_from_parser(e.status),
}
}
pub(crate) fn pump_fees_initialize_fee_config_from_parser(
e: sol_parser_sdk::core::events::PumpFeesInitializeFeeConfigEvent,
meta: EventMetadata,
) -> PumpFeesInitializeFeeConfigEvent {
PumpFeesInitializeFeeConfigEvent {
metadata: meta,
timestamp: e.timestamp,
admin: e.admin,
fee_config: e.fee_config,
}
}
pub(crate) fn pump_fees_reset_sharing_config_from_parser(
e: sol_parser_sdk::core::events::PumpFeesResetFeeSharingConfigEvent,
meta: EventMetadata,
) -> PumpFeesResetFeeSharingConfigEvent {
PumpFeesResetFeeSharingConfigEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
sharing_config: e.sharing_config,
old_admin: e.old_admin,
old_shareholders: e
.old_shareholders
.into_iter()
.map(pump_fees_shareholder_from_parser)
.collect(),
new_admin: e.new_admin,
new_shareholders: e
.new_shareholders
.into_iter()
.map(pump_fees_shareholder_from_parser)
.collect(),
}
}
pub(crate) fn pump_fees_revoke_authority_from_parser(
e: sol_parser_sdk::core::events::PumpFeesRevokeFeeSharingAuthorityEvent,
meta: EventMetadata,
) -> PumpFeesRevokeFeeSharingAuthorityEvent {
PumpFeesRevokeFeeSharingAuthorityEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
sharing_config: e.sharing_config,
admin: e.admin,
}
}
pub(crate) fn pump_fees_transfer_authority_from_parser(
e: sol_parser_sdk::core::events::PumpFeesTransferFeeSharingAuthorityEvent,
meta: EventMetadata,
) -> PumpFeesTransferFeeSharingAuthorityEvent {
PumpFeesTransferFeeSharingAuthorityEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
sharing_config: e.sharing_config,
old_admin: e.old_admin,
new_admin: e.new_admin,
}
}
pub(crate) fn pump_fees_update_admin_from_parser(
e: sol_parser_sdk::core::events::PumpFeesUpdateAdminEvent,
meta: EventMetadata,
) -> PumpFeesUpdateAdminEvent {
PumpFeesUpdateAdminEvent {
metadata: meta,
timestamp: e.timestamp,
old_admin: e.old_admin,
new_admin: e.new_admin,
}
}
pub(crate) fn pump_fees_update_fee_config_from_parser(
e: sol_parser_sdk::core::events::PumpFeesUpdateFeeConfigEvent,
meta: EventMetadata,
) -> PumpFeesUpdateFeeConfigEvent {
PumpFeesUpdateFeeConfigEvent {
metadata: meta,
timestamp: e.timestamp,
admin: e.admin,
fee_config: e.fee_config,
fee_tiers: e.fee_tiers.into_iter().map(pump_fees_tier_from_parser).collect(),
flat_fees: pump_fees_fees_from_parser(e.flat_fees),
}
}
pub(crate) fn pump_fees_update_fee_shares_from_parser(
e: sol_parser_sdk::core::events::PumpFeesUpdateFeeSharesEvent,
meta: EventMetadata,
) -> PumpFeesUpdateFeeSharesEvent {
PumpFeesUpdateFeeSharesEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
sharing_config: e.sharing_config,
admin: e.admin,
bonding_curve: e.bonding_curve,
pump_creator_vault: e.pump_creator_vault,
new_shareholders: e
.new_shareholders
.into_iter()
.map(pump_fees_shareholder_from_parser)
.collect(),
}
}
pub(crate) fn pump_fees_upsert_fee_tiers_from_parser(
e: sol_parser_sdk::core::events::PumpFeesUpsertFeeTiersEvent,
meta: EventMetadata,
) -> PumpFeesUpsertFeeTiersEvent {
PumpFeesUpsertFeeTiersEvent {
metadata: meta,
timestamp: e.timestamp,
admin: e.admin,
fee_config: e.fee_config,
fee_tiers: e.fee_tiers.into_iter().map(pump_fees_tier_from_parser).collect(),
offset: e.offset,
}
}
pub(crate) fn pumpfun_migrate_bonding_creator_from_parser(
e: sol_parser_sdk::core::events::PumpFunMigrateBondingCurveCreatorEvent,
meta: EventMetadata,
) -> PumpFunMigrateBondingCurveCreatorEvent {
PumpFunMigrateBondingCurveCreatorEvent {
metadata: meta,
timestamp: e.timestamp,
mint: e.mint,
bonding_curve: e.bonding_curve,
sharing_config: e.sharing_config,
old_creator: e.old_creator,
new_creator: e.new_creator,
}
}
pub(crate) fn pumpfun_global_account_from_parser(
e: sol_parser_sdk::core::events::PumpFunGlobalAccountEvent,
meta: EventMetadata,
) -> PumpFunGlobalAccountEvent {
let mut fee_recipients = [Pubkey::default(); 7];
for (dst, src) in fee_recipients.iter_mut().zip(e.global.fee_recipients.iter()) {
*dst = *src;
}
PumpFunGlobalAccountEvent {
metadata: meta,
pubkey: e.pubkey,
executable: false,
lamports: 0,
owner: pump_program(),
rent_epoch: 0,
global: Global {
initialized: e.global.initialized,
authority: e.global.authority,
fee_recipient: e.global.fee_recipient,
initial_virtual_token_reserves: e.global.initial_virtual_token_reserves,
initial_virtual_sol_reserves: e.global.initial_virtual_sol_reserves,
initial_real_token_reserves: e.global.initial_real_token_reserves,
token_total_supply: e.global.token_total_supply,
fee_basis_points: e.global.fee_basis_points,
withdraw_authority: e.global.withdraw_authority,
enable_migrate: e.global.enable_migrate,
pool_migration_fee: e.global.pool_migration_fee,
creator_fee_basis_points: e.global.creator_fee_basis_points,
fee_recipients,
set_creator_authority: e.global.set_creator_authority,
admin_set_creator_authority: e.global.admin_set_creator_authority,
create_v2_enabled: e.global.create_v2_enabled,
whitelist_pda: e.global.whitelist_pda,
reserved_fee_recipient: e.global.reserved_fee_recipient,
mayhem_mode_enabled: e.global.mayhem_mode_enabled,
reserved_fee_recipients: e.global.reserved_fee_recipients,
is_cashback_enabled: false,
},
}
}
pub(crate) fn pumpswap_buy_full_from_parser(
b: sol_parser_sdk::core::events::PumpSwapBuyEvent,
meta: EventMetadata,
) -> PumpSwapBuyEvent {
PumpSwapBuyEvent {
metadata: meta,
timestamp: b.timestamp,
base_amount_out: b.base_amount_out,
max_quote_amount_in: b.max_quote_amount_in,
user_base_token_reserves: b.user_base_token_reserves,
user_quote_token_reserves: b.user_quote_token_reserves,
pool_base_token_reserves: b.pool_base_token_reserves,
pool_quote_token_reserves: b.pool_quote_token_reserves,
quote_amount_in: b.quote_amount_in,
lp_fee_basis_points: b.lp_fee_basis_points,
lp_fee: b.lp_fee,
protocol_fee_basis_points: b.protocol_fee_basis_points,
protocol_fee: b.protocol_fee,
quote_amount_in_with_lp_fee: b.quote_amount_in_with_lp_fee,
user_quote_amount_in: b.user_quote_amount_in,
pool: b.pool,
user: b.user,
user_base_token_account: b.user_base_token_account,
user_quote_token_account: b.user_quote_token_account,
protocol_fee_recipient: b.protocol_fee_recipient,
protocol_fee_recipient_token_account: b.protocol_fee_recipient_token_account,
coin_creator: b.coin_creator,
coin_creator_fee_basis_points: b.coin_creator_fee_basis_points,
coin_creator_fee: b.coin_creator_fee,
track_volume: b.track_volume,
total_unclaimed_tokens: b.total_unclaimed_tokens,
total_claimed_tokens: b.total_claimed_tokens,
current_sol_volume: b.current_sol_volume,
last_update_timestamp: b.last_update_timestamp,
min_base_amount_out: b.min_base_amount_out,
ix_name: b.ix_name,
cashback_fee_basis_points: b.cashback_fee_basis_points,
cashback: b.cashback,
is_pump_pool: b.is_pump_pool,
base_mint: b.base_mint,
quote_mint: b.quote_mint,
pool_base_token_account: b.pool_base_token_account,
pool_quote_token_account: b.pool_quote_token_account,
coin_creator_vault_ata: b.coin_creator_vault_ata,
coin_creator_vault_authority: b.coin_creator_vault_authority,
base_token_program: b.base_token_program,
quote_token_program: b.quote_token_program,
pool_v2: b.pool_v2,
fee_recipient: b.fee_recipient,
fee_recipient_quote_token_account: b.fee_recipient_quote_token_account,
}
}
pub(crate) fn pumpswap_sell_full_from_parser(
s: sol_parser_sdk::core::events::PumpSwapSellEvent,
meta: EventMetadata,
) -> PumpSwapSellEvent {
PumpSwapSellEvent {
metadata: meta,
timestamp: s.timestamp,
base_amount_in: s.base_amount_in,
min_quote_amount_out: s.min_quote_amount_out,
user_base_token_reserves: s.user_base_token_reserves,
user_quote_token_reserves: s.user_quote_token_reserves,
pool_base_token_reserves: s.pool_base_token_reserves,
pool_quote_token_reserves: s.pool_quote_token_reserves,
quote_amount_out: s.quote_amount_out,
lp_fee_basis_points: s.lp_fee_basis_points,
lp_fee: s.lp_fee,
protocol_fee_basis_points: s.protocol_fee_basis_points,
protocol_fee: s.protocol_fee,
quote_amount_out_without_lp_fee: s.quote_amount_out_without_lp_fee,
user_quote_amount_out: s.user_quote_amount_out,
pool: s.pool,
user: s.user,
user_base_token_account: s.user_base_token_account,
user_quote_token_account: s.user_quote_token_account,
protocol_fee_recipient: s.protocol_fee_recipient,
protocol_fee_recipient_token_account: s.protocol_fee_recipient_token_account,
coin_creator: s.coin_creator,
coin_creator_fee_basis_points: s.coin_creator_fee_basis_points,
coin_creator_fee: s.coin_creator_fee,
cashback_fee_basis_points: s.cashback_fee_basis_points,
cashback: s.cashback,
is_pump_pool: s.is_pump_pool,
base_mint: s.base_mint,
quote_mint: s.quote_mint,
pool_base_token_account: s.pool_base_token_account,
pool_quote_token_account: s.pool_quote_token_account,
coin_creator_vault_ata: s.coin_creator_vault_ata,
coin_creator_vault_authority: s.coin_creator_vault_authority,
base_token_program: s.base_token_program,
quote_token_program: s.quote_token_program,
pool_v2: s.pool_v2,
fee_recipient: s.fee_recipient,
fee_recipient_quote_token_account: s.fee_recipient_quote_token_account,
}
}
pub(crate) fn pumpswap_create_pool_from_parser(
c: sol_parser_sdk::core::events::PumpSwapCreatePoolEvent,
meta: EventMetadata,
) -> PumpSwapCreatePoolEvent {
PumpSwapCreatePoolEvent {
metadata: meta,
timestamp: c.timestamp,
index: c.index,
creator: c.creator,
base_mint: c.base_mint,
quote_mint: c.quote_mint,
base_mint_decimals: c.base_mint_decimals,
quote_mint_decimals: c.quote_mint_decimals,
base_amount_in: c.base_amount_in,
quote_amount_in: c.quote_amount_in,
pool_base_amount: c.pool_base_amount,
pool_quote_amount: c.pool_quote_amount,
minimum_liquidity: c.minimum_liquidity,
initial_liquidity: c.initial_liquidity,
lp_token_amount_out: c.lp_token_amount_out,
pool_bump: c.pool_bump,
pool: c.pool,
lp_mint: c.lp_mint,
user_base_token_account: c.user_base_token_account,
user_quote_token_account: c.user_quote_token_account,
coin_creator: c.coin_creator,
..Default::default()
}
}
pub(crate) fn pumpswap_liquidity_added_to_deposit(
a: sol_parser_sdk::core::events::PumpSwapLiquidityAdded,
meta: EventMetadata,
) -> PumpSwapDepositEvent {
PumpSwapDepositEvent {
metadata: meta,
timestamp: a.timestamp,
lp_token_amount_out: a.lp_token_amount_out,
max_base_amount_in: a.max_base_amount_in,
max_quote_amount_in: a.max_quote_amount_in,
user_base_token_reserves: a.user_base_token_reserves,
user_quote_token_reserves: a.user_quote_token_reserves,
pool_base_token_reserves: a.pool_base_token_reserves,
pool_quote_token_reserves: a.pool_quote_token_reserves,
base_amount_in: a.base_amount_in,
quote_amount_in: a.quote_amount_in,
lp_mint_supply: a.lp_mint_supply,
pool: a.pool,
user: a.user,
user_base_token_account: a.user_base_token_account,
user_quote_token_account: a.user_quote_token_account,
user_pool_token_account: a.user_pool_token_account,
..Default::default()
}
}
pub(crate) fn pumpswap_liquidity_removed_to_withdraw(
r: sol_parser_sdk::core::events::PumpSwapLiquidityRemoved,
meta: EventMetadata,
) -> PumpSwapWithdrawEvent {
PumpSwapWithdrawEvent {
metadata: meta,
timestamp: r.timestamp,
lp_token_amount_in: r.lp_token_amount_in,
min_base_amount_out: r.min_base_amount_out,
min_quote_amount_out: r.min_quote_amount_out,
user_base_token_reserves: r.user_base_token_reserves,
user_quote_token_reserves: r.user_quote_token_reserves,
pool_base_token_reserves: r.pool_base_token_reserves,
pool_quote_token_reserves: r.pool_quote_token_reserves,
base_amount_out: r.base_amount_out,
quote_amount_out: r.quote_amount_out,
lp_mint_supply: r.lp_mint_supply,
pool: r.pool,
user: r.user,
user_base_token_account: r.user_base_token_account,
user_quote_token_account: r.user_quote_token_account,
user_pool_token_account: r.user_pool_token_account,
..Default::default()
}
}
pub(crate) fn pumpfun_trade_from_parser(
t: sol_parser_sdk::core::events::PumpFunTradeEvent,
bt: Option<&Timestamp>,
recv_wall_us: i64,
) -> DexEvent {
let event_type = if t.is_buy { EventType::PumpFunBuy } else { EventType::PumpFunSell };
pumpfun_trade_from_parser_with_event_type(t, bt, recv_wall_us, event_type)
}
pub(crate) fn pumpfun_trade_from_parser_with_event_type(
t: sol_parser_sdk::core::events::PumpFunTradeEvent,
bt: Option<&Timestamp>,
recv_wall_us: i64,
event_type: EventType,
) -> DexEvent {
let pm = t.metadata.clone();
let meta = adapt_pm(pm, bt, recv_wall_us, ProtocolType::PumpFun, event_type, pump_program());
let st = PumpFunTradeEvent {
metadata: meta,
mint: t.mint,
sol_amount: t.sol_amount,
token_amount: t.token_amount,
is_buy: t.is_buy,
user: t.user,
timestamp: t.timestamp,
virtual_sol_reserves: t.virtual_sol_reserves,
virtual_token_reserves: t.virtual_token_reserves,
real_sol_reserves: t.real_sol_reserves,
real_token_reserves: t.real_token_reserves,
fee_recipient: t.fee_recipient,
fee_basis_points: t.fee_basis_points,
fee: t.fee,
creator: t.creator,
creator_fee_basis_points: t.creator_fee_basis_points,
creator_fee: t.creator_fee,
track_volume: t.track_volume,
total_unclaimed_tokens: t.total_unclaimed_tokens,
total_claimed_tokens: t.total_claimed_tokens,
current_sol_volume: t.current_sol_volume,
last_update_timestamp: t.last_update_timestamp,
global: t.global,
bonding_curve: t.bonding_curve,
bonding_curve_v2: t.bonding_curve_v2,
associated_bonding_curve: t.associated_bonding_curve,
associated_user: t.associated_user,
system_program: t.system_program,
token_program: t.token_program,
quote_token_program: t.quote_token_program,
associated_token_program: t.associated_token_program,
creator_vault: t.creator_vault,
associated_quote_fee_recipient: t.associated_quote_fee_recipient,
buyback_fee_recipient: t.buyback_fee_recipient,
associated_quote_buyback_fee_recipient: t.associated_quote_buyback_fee_recipient,
associated_quote_bonding_curve: t.associated_quote_bonding_curve,
associated_quote_user: t.associated_quote_user,
associated_creator_vault: t.associated_creator_vault,
sharing_config: t.sharing_config,
event_authority: t.event_authority,
program: t.program,
global_volume_accumulator: t.global_volume_accumulator,
user_volume_accumulator: t.user_volume_accumulator,
associated_user_volume_accumulator: t.associated_user_volume_accumulator,
fee_config: t.fee_config,
fee_program: t.fee_program,
account: t.account,
ix_name: t.ix_name,
mayhem_mode: t.mayhem_mode,
cashback_fee_basis_points: t.cashback_fee_basis_points,
cashback: t.cashback,
buyback_fee_basis_points: t.buyback_fee_basis_points,
buyback_fee: t.buyback_fee,
shareholders: t.shareholders.into_iter().map(pump_fees_shareholder_from_parser).collect(),
quote_mint: t.quote_mint,
quote_amount: t.quote_amount,
virtual_quote_reserves: t.virtual_quote_reserves,
real_quote_reserves: t.real_quote_reserves,
is_cashback_coin: t.is_cashback_coin,
is_created_buy: t.is_created_buy,
is_dev_create_token_trade: t.is_created_buy,
amount: t.amount,
max_sol_cost: t.max_sol_cost,
min_sol_output: t.min_sol_output,
spendable_sol_in: t.spendable_sol_in,
spendable_quote_in: t.spendable_quote_in,
min_tokens_out: t.min_tokens_out,
..Default::default()
};
DexEvent::PumpFunTradeEvent(st)
}
pub(crate) fn pumpswap_trade_from_parser(
t: sol_parser_sdk::core::events::PumpSwapTradeEvent,
bt: Option<&Timestamp>,
recv_wall_us: i64,
) -> Option<DexEvent> {
let pm = t.metadata.clone();
let meta = adapt_pm(
pm,
bt,
recv_wall_us,
ProtocolType::PumpSwap,
if t.is_buy { EventType::PumpSwapBuy } else { EventType::PumpSwapSell },
pumpswap_program(),
);
if t.is_buy {
Some(DexEvent::PumpSwapBuyEvent(PumpSwapBuyEvent {
metadata: meta,
timestamp: t.timestamp,
base_amount_out: t.token_amount,
max_quote_amount_in: t.sol_amount,
user_base_token_reserves: t.virtual_token_reserves,
user_quote_token_reserves: t.virtual_sol_reserves,
pool_base_token_reserves: t.real_token_reserves,
pool_quote_token_reserves: t.real_sol_reserves,
quote_amount_in: t.sol_amount,
lp_fee_basis_points: t.fee_basis_points,
lp_fee: t.fee,
protocol_fee_basis_points: 0,
protocol_fee: 0,
quote_amount_in_with_lp_fee: t.sol_amount,
user_quote_amount_in: t.sol_amount,
pool: Pubkey::default(),
user: t.user,
user_base_token_account: Pubkey::default(),
user_quote_token_account: Pubkey::default(),
protocol_fee_recipient: t.fee_recipient,
protocol_fee_recipient_token_account: Pubkey::default(),
coin_creator: t.creator,
coin_creator_fee_basis_points: t.creator_fee_basis_points,
coin_creator_fee: t.creator_fee,
track_volume: t.track_volume,
total_unclaimed_tokens: t.total_unclaimed_tokens,
total_claimed_tokens: t.total_claimed_tokens,
current_sol_volume: t.current_sol_volume,
last_update_timestamp: t.last_update_timestamp,
min_base_amount_out: 0,
ix_name: t.ix_name.clone(),
cashback_fee_basis_points: 0,
cashback: 0,
is_pump_pool: false,
base_mint: t.mint,
..Default::default()
}))
} else {
Some(DexEvent::PumpSwapSellEvent(PumpSwapSellEvent {
metadata: meta,
timestamp: t.timestamp,
base_amount_in: t.token_amount,
min_quote_amount_out: t.sol_amount,
user_base_token_reserves: t.virtual_token_reserves,
user_quote_token_reserves: t.virtual_sol_reserves,
pool_base_token_reserves: t.real_token_reserves,
pool_quote_token_reserves: t.real_sol_reserves,
quote_amount_out: t.sol_amount,
lp_fee_basis_points: t.fee_basis_points,
lp_fee: t.fee,
protocol_fee_basis_points: 0,
protocol_fee: 0,
quote_amount_out_without_lp_fee: t.sol_amount,
user_quote_amount_out: t.sol_amount,
pool: Pubkey::default(),
user: t.user,
user_base_token_account: Pubkey::default(),
user_quote_token_account: Pubkey::default(),
protocol_fee_recipient: t.fee_recipient,
protocol_fee_recipient_token_account: Pubkey::default(),
coin_creator: t.creator,
coin_creator_fee_basis_points: t.creator_fee_basis_points,
coin_creator_fee: t.creator_fee,
cashback_fee_basis_points: 0,
cashback: 0,
is_pump_pool: false,
base_mint: t.mint,
..Default::default()
}))
}
}