use super::*;
const GET_TRADER_RETRIES: usize = 4;
const GET_TRADER_RETRY_DELAY: std::time::Duration = std::time::Duration::from_millis(750);
pub(in crate::tui::runtime) fn spawn_initial_connect_flow(
http: Arc<PhoenixHttpClient>,
kp: Arc<Keypair>,
symbol: String,
balance_tx: UnboundedSender<BalanceUpdate>,
tx_status: UnboundedSender<TxStatusMsg>,
) -> tokio::task::JoinHandle<()> {
tokio::spawn(async move {
let authority_v2 = match solana_pubkey::Pubkey::from_str(&kp.pubkey().to_string()) {
Ok(pk) => pk,
Err(e) => {
warn!(error = %e, "failed to convert wallet pubkey for initial connect flow");
return;
}
};
let mut final_err: Option<String> = None;
for attempt in 0..GET_TRADER_RETRIES {
match http.traders().get_trader(&authority_v2).await {
Ok(traders) if traders.is_empty() => {
let _ = tx_status.send(TxStatusMsg::PromptReferralChoice);
final_err = None;
break;
}
Ok(_) => {
final_err = None;
break;
}
Err(e) => {
final_err = Some(format!("{}", e));
if attempt + 1 < GET_TRADER_RETRIES {
tokio::time::sleep(GET_TRADER_RETRY_DELAY).await;
}
}
}
}
if let Some(err) = final_err {
warn!(error = %err, "get_trader failed after retries; skipping referral check");
}
let Ok((phoenix_bal, position, all_positions)) = tokio::time::timeout(
BALANCE_FETCH_TIMEOUT,
fetch_phoenix_balance_and_position(&http, &authority_v2, &symbol),
)
.await
else {
warn!(symbol = %symbol, "initial phoenix balance fetch timed out");
return;
};
let _ = balance_tx.send(BalanceUpdate {
phoenix_collateral: phoenix_bal,
position,
all_positions,
});
})
}