use crate::core::events::*;
use solana_sdk::pubkey::Pubkey;
pub type AccountGetter<'a> = dyn Fn(usize) -> Pubkey + 'a;
pub fn fill_trade_accounts(e: &mut PumpFunTradeEvent, get: &AccountGetter<'_>) {
if e.user == Pubkey::default() {
e.user = get(6);
}
if e.bonding_curve == Pubkey::default() {
e.bonding_curve = get(3);
}
if e.associated_bonding_curve == Pubkey::default() {
e.associated_bonding_curve = get(4);
}
if e.creator_vault == Pubkey::default() {
e.creator_vault = if e.is_buy { get(9) } else { get(8) };
}
if e.token_program == Pubkey::default() {
e.token_program = if e.is_buy { get(8) } else { get(9) };
}
let a17 = get(16);
if a17 != Pubkey::default() {
e.account = Some(a17);
}
}
pub fn fill_create_accounts(e: &mut PumpFunCreateTokenEvent, get: &AccountGetter<'_>) {
if e.mint == Pubkey::default() {
e.mint = get(0);
}
if e.bonding_curve == Pubkey::default() {
e.bonding_curve = get(2);
}
if e.user == Pubkey::default() {
e.user = get(7);
}
}
pub fn fill_create_v2_accounts(e: &mut PumpFunCreateV2TokenEvent, get: &AccountGetter<'_>) {
if e.mint == Pubkey::default() {
e.mint = get(0);
}
if e.bonding_curve == Pubkey::default() {
e.bonding_curve = get(2);
}
if e.user == Pubkey::default() {
e.user = get(5);
}
if e.mint_authority == Pubkey::default() {
e.mint_authority = get(1);
}
if e.associated_bonding_curve == Pubkey::default() {
e.associated_bonding_curve = get(3);
}
if e.global == Pubkey::default() {
e.global = get(4);
}
if e.system_program == Pubkey::default() {
e.system_program = get(6);
}
if e.token_program == Pubkey::default() {
e.token_program = get(7);
}
if e.associated_token_program == Pubkey::default() {
e.associated_token_program = get(8);
}
if e.mayhem_program_id == Pubkey::default() {
e.mayhem_program_id = get(9);
}
if e.global_params == Pubkey::default() {
e.global_params = get(10);
}
if e.sol_vault == Pubkey::default() {
e.sol_vault = get(11);
}
if e.mayhem_state == Pubkey::default() {
e.mayhem_state = get(12);
}
if e.mayhem_token_vault == Pubkey::default() {
e.mayhem_token_vault = get(13);
}
if e.event_authority == Pubkey::default() {
e.event_authority = get(14);
}
if e.program == Pubkey::default() {
e.program = get(15);
}
}
pub fn fill_migrate_accounts(_e: &mut PumpFunMigrateEvent, _get: &AccountGetter<'_>) {
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fill_trade_accounts_account_17() {
let account_17 = Pubkey::new_from_array([17u8; 32]);
let get = |i: usize| -> Pubkey {
if i == 16 {
account_17
} else {
Pubkey::default()
}
};
let getter: &AccountGetter = &get;
let mut e = PumpFunTradeEvent { account: None, ..Default::default() };
fill_trade_accounts(&mut e, getter);
assert_eq!(
e.account,
Some(account_17),
"第 17 个账户 (account) 应被填充,gRPC/RPC 路径均走 fill_trade_accounts"
);
}
}