use sol_parser_sdk::{parse_rpc_transaction_with_cost, DexEvent};
use solana_transaction_status::EncodedConfirmedTransactionWithStatusMeta;
use std::collections::BTreeMap;
macro_rules! fields {
($e:expr, $($k:ident),+) => {{let mut m=BTreeMap::<String,String>::new();$(m.insert(stringify!($k).into(),$e.$k.to_string());)+m}};
}
#[test]
fn current_bank_launchlab_migration_and_rollback() {
let f: serde_json::Value =
serde_json::from_str(include_str!("fixtures/launchlab_migration_20261009.json")).unwrap();
let cases = f["cases"].as_array().unwrap();
assert_eq!(cases.len(), 5);
for c in cases {
let tx: EncodedConfirmedTransactionWithStatusMeta =
serde_json::from_value(c["wire_rpc"].clone()).unwrap();
let parsed = parse_rpc_transaction_with_cost(&tx, None).unwrap();
if !c["wire_rpc"]["meta"]["err"].is_null() {
assert!(parsed.events.is_empty(), "{} rollback", c["name"]);
continue;
}
let actual: Vec<_> = parsed
.events
.iter()
.filter_map(|e| match e {
DexEvent::RaydiumLaunchlabMigrateAmm(e) => Some((
"RaydiumLaunchlabMigrateAmm",
fields!(e, old_pool, new_pool, user, base_mint, quote_mint, platform_config, destination_program, liquidity_amount, liquidity_amount_known),
)),
DexEvent::RaydiumCpmmInitialize(e) => Some((
"RaydiumCpmmInitialize", fields!(e, pool, creator, init_amount0, init_amount1),
)),
_ => None,
})
.collect();
let wants = c["expected"].as_array().unwrap();
assert_eq!(actual.len(), wants.len(), "{}", c["name"]);
for ((kind, body), want) in actual.iter().zip(wants) {
assert_eq!(*kind, want["type"].as_str().unwrap());
for (k, v) in want.as_object().unwrap() {
if k != "type" {
assert_eq!(body.get(k).unwrap(), v.as_str().unwrap(), "{} {k}", c["name"]);
}
}
}
}
}