use crate::types::to_comma_string;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateTriggerOrder {
pub input_mint: String,
pub output_mint: String,
pub maker: String,
pub payer: String,
pub params: Params,
#[serde(skip_serializing_if = "Option::is_none")]
pub compute_unit_price: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fee_account: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wrap_and_unwrap_sol: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Params {
pub making_amount: String,
pub taking_amount: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expired_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slippage_bps: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fee_bps: Option<String>,
}
impl CreateTriggerOrder {
pub fn new(
input_mint: &str,
output_mint: &str,
maker: &str,
payer: &str,
making_amount: u64,
taking_amount: u64,
) -> Self {
Self {
input_mint: input_mint.to_string(),
output_mint: output_mint.to_string(),
maker: maker.to_string(),
payer: payer.to_string(),
params: Params::new(making_amount, taking_amount),
compute_unit_price: None,
fee_account: None,
wrap_and_unwrap_sol: None,
}
}
pub fn compute_unit_price(mut self, price: &str) -> Self {
self.compute_unit_price = Some(price.to_string());
self
}
pub fn fee_account(mut self, account: &str) -> Self {
self.fee_account = Some(account.to_string());
self
}
pub fn wrap_and_unwrap_sol(mut self, wrap: bool) -> Self {
self.wrap_and_unwrap_sol = Some(wrap);
self
}
pub fn expired_at(mut self, expired_at: &str) -> Self {
self.params.expired_at = Some(expired_at.to_string());
self
}
pub fn slippage_bps(mut self, slippage: &str) -> Self {
self.params.slippage_bps = Some(slippage.to_string());
self
}
pub fn fee_bps(mut self, fee: &str) -> Self {
self.params.fee_bps = Some(fee.to_string());
self
}
}
impl Params {
pub fn new(making_amount: u64, taking_amount: u64) -> Self {
Self {
making_amount: making_amount.to_string(),
taking_amount: taking_amount.to_string(),
expired_at: None,
slippage_bps: None,
fee_bps: None,
}
}
pub fn expired_at(mut self, expired_at: &str) -> Self {
self.expired_at = Some(expired_at.to_string());
self
}
pub fn slippage_bps(mut self, slippage: &str) -> Self {
self.slippage_bps = Some(slippage.to_string());
self
}
pub fn fee_bps(mut self, fee: &str) -> Self {
self.fee_bps = Some(fee.to_string());
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TriggerResponse {
pub request_id: String,
#[serde(default)]
pub transaction: String,
#[serde(default)]
pub transactions: Option<Vec<String>>,
#[serde(default)]
pub order: Option<String>,
pub code: u8,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecuteTriggerOrder {
pub request_id: String,
pub signed_transaction: String,
}
impl ExecuteTriggerOrder {
pub fn new(request_id: &str, signed_transaction: &str) -> Self {
Self {
request_id: request_id.to_string(),
signed_transaction: signed_transaction.to_string(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ExecuteTriggerOrderResponse {
pub code: u8,
pub signature: String,
pub status: String,
#[serde(default)]
pub order: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelTriggerOrder {
pub maker: String,
pub order: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub compute_unit_price: Option<String>,
}
impl CancelTriggerOrder {
pub fn new(maker: &str, order: &str) -> Self {
Self {
maker: maker.to_string(),
order: order.to_string(),
compute_unit_price: None,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelTriggerOrders {
pub maker: String,
#[serde(serialize_with = "to_comma_string")]
pub order: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compute_unit_price: Option<String>,
}
impl CancelTriggerOrders {
pub fn new(maker: &str, orders: Vec<String>) -> Self {
Self {
maker: maker.to_string(),
order: orders,
compute_unit_price: None,
}
}
pub fn compute_unit_price(mut self, price: &str) -> Self {
self.compute_unit_price = Some(price.to_string());
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetTriggerOrders {
pub user: String,
pub page: Option<String>,
pub include_failed_tx: Option<String>,
pub order_status: OrderStatus,
pub input_mint: Option<String>,
pub output_mint: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum OrderStatus {
Active,
History,
}
impl GetTriggerOrders {
pub fn new(user: &str, order_status: OrderStatus) -> Self {
Self {
user: user.to_string(),
page: None,
include_failed_tx: Some("false".to_string()),
order_status,
input_mint: None,
output_mint: None,
}
}
pub fn page(mut self, page: &str) -> Self {
self.page = Some(page.to_string());
self
}
pub fn include_failed_tx(mut self, include: bool) -> Self {
self.include_failed_tx = Some(include.to_string());
self
}
pub fn order_status(mut self, status: OrderStatus) -> Self {
self.order_status = status;
self
}
pub fn input_mint(mut self, mint: &str) -> Self {
self.input_mint = Some(mint.to_string());
self
}
pub fn output_mint(mut self, mint: &str) -> Self {
self.output_mint = Some(mint.to_string());
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OrderResponse {
pub user: String,
pub order_status: String,
pub orders: Vec<Order>,
pub total_pages: u32,
pub page: u32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Order {
pub user_pubkey: String,
pub order_key: String,
pub input_mint: String,
pub output_mint: String,
pub making_amount: String,
pub taking_amount: String,
pub remaining_making_amount: String,
pub remaining_taking_amount: String,
pub raw_making_amount: String,
pub raw_taking_amount: String,
pub raw_remaining_making_amount: String,
pub raw_remaining_taking_amount: String,
pub slippage_bps: String,
#[serde(default)]
pub expired_at: Option<String>,
pub created_at: String,
pub updated_at: String,
pub status: String,
pub open_tx: String,
pub close_tx: String,
pub program_version: String,
pub trades: Vec<Trade>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Trade {
pub order_key: String,
pub keeper: String,
pub input_mint: String,
pub output_mint: String,
pub input_amount: String,
pub output_amount: String,
pub raw_input_amount: String,
pub raw_output_amount: String,
pub fee_mint: String,
pub fee_amount: String,
pub raw_fee_amount: String,
pub tx_id: String,
pub confirmed_at: String,
pub action: String,
#[serde(default)]
pub product_meta: Option<serde_json::Value>, }