use super::{PlatformFee, QuoteGetSwapModeEnum, RoutePlanItem, vec_to_comma_string};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UltraOrderRequest {
pub input_mint: String,
pub output_mint: String,
pub amount: u64,
pub taker: Option<String>,
pub referral_account: Option<String>,
pub referral_fee: Option<u8>,
#[serde(serialize_with = "vec_to_comma_string")]
pub exclude_routers: Option<Vec<String>>,
}
impl UltraOrderRequest {
pub fn new(input_mint: &str, output_mint: &str, amount: u64) -> Self {
UltraOrderRequest {
input_mint: input_mint.to_string(),
output_mint: output_mint.to_string(),
amount,
taker: None,
referral_account: None,
referral_fee: None,
exclude_routers: None,
}
}
pub fn add_taker(mut self, taker: &str) -> Self {
self.taker = Some(taker.to_string());
self
}
pub fn add_referral_account(mut self, referral_account: &str) -> Self {
self.referral_account = Some(referral_account.to_string());
self
}
pub fn add_referral_fee(mut self, fee: u8) -> Self {
assert!(fee >= 50, "Referral fee must be between 50 and 255 bps");
self.referral_fee = Some(fee);
self
}
pub fn exclude_routers(mut self, exclude_routers: Vec<String>) -> Self {
self.exclude_routers = Some(exclude_routers);
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UltraOrderResponse {
pub input_mint: String,
pub output_mint: String,
pub in_amount: String,
pub out_amount: String,
pub other_amount_threshold: String,
pub swap_mode: QuoteGetSwapModeEnum,
pub slippage_bps: i32,
pub price_impact_pct: String,
pub route_plan: Vec<RoutePlanItem>,
#[serde(default)]
pub fee_mint: Option<String>,
pub fee_bps: u8,
pub prioritization_fee_lamports: u64,
pub swap_type: SwapType,
#[serde(default)]
pub transaction: Option<String>,
pub gasless: bool,
pub request_id: String,
pub total_time: u16,
#[serde(default)]
pub taker: Option<String>,
#[serde(default)]
pub quote_id: Option<String>,
#[serde(default)]
pub maker: Option<String>,
#[serde(default)]
pub platform_fee: Option<PlatformFee>,
#[serde(default)]
pub expire_at: Option<u64>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
#[serde(rename_all = "lowercase")]
pub enum SwapType {
Aggregator,
Rfq,
Hashflow,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UltraExecuteOrderRequest {
pub signed_transaction: String,
pub request_id: String,
}
impl UltraExecuteOrderRequest {
pub fn new(signed_transaction: &str, request_id: &str) -> Self {
UltraExecuteOrderRequest {
signed_transaction: signed_transaction.to_string(),
request_id: request_id.to_string(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UltraExecuteOrderResponse {
pub status: Status,
#[serde(default)]
pub signature: Option<String>,
#[serde(default)]
pub slot: Option<String>,
#[serde(default)]
pub error: Option<String>,
pub code: u32,
#[serde(default)]
pub total_input_amount: Option<String>,
#[serde(default)]
pub total_output_amount: Option<String>,
#[serde(default)]
pub input_amount_result: Option<String>,
#[serde(default)]
pub output_amount_result: Option<String>,
#[serde(default)]
pub swap_events: Option<Vec<SwapEvent>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Status {
Success,
Failed,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SwapEvent {
pub input_mint: Option<String>,
pub input_amount: Option<String>,
pub output_mint: Option<String>,
pub output_amount: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenBalance {
pub amount: String,
pub ui_amount: f64,
pub slot: u64,
pub is_frozen: bool,
}
pub type TokenBalancesResponse = HashMap<String, TokenBalance>;
#[derive(Debug, Serialize, Deserialize)]
pub struct Shield {
pub warnings: HashMap<String, Vec<Warning>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Warning {
#[serde(rename = "type")]
pub warning_type: String,
pub message: String,
pub severity: String,
}