use super::OrderStatus;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CreateRecurringOrderRequest {
pub user: String,
pub input_mint: String,
pub output_mint: String,
pub params: OrderParams,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(untagged)]
pub enum OrderParams {
TimeWrapper { time: TimeParams },
PriceWrapper { price: PriceParams },
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct TimeParams {
pub in_amount: u64,
pub number_of_orders: u64,
pub interval: u64,
pub min_price: Option<f64>,
pub max_price: Option<f64>,
pub start_at: Option<u64>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct PriceParams {
pub deposit_amount: u64,
pub increment_usdc_value: u64,
pub interval: u64,
pub start_at: Option<u64>,
}
impl CreateRecurringOrderRequest {
pub fn new_time_order(
user: impl Into<String>,
input_mint: impl Into<String>,
output_mint: impl Into<String>,
in_amount: u64,
number_of_orders: u64,
interval: u64,
) -> Self {
let params = TimeParams {
in_amount,
number_of_orders,
interval,
min_price: None,
max_price: None,
start_at: None,
};
Self {
user: user.into(),
input_mint: input_mint.into(),
output_mint: output_mint.into(),
params: OrderParams::TimeWrapper { time: params },
}
}
pub fn new_price_order(
user: impl Into<String>,
input_mint: impl Into<String>,
output_mint: impl Into<String>,
deposit_amount: u64,
increment_usdc_value: u64,
interval: u64,
) -> Self {
let params = PriceParams {
deposit_amount,
increment_usdc_value,
interval,
start_at: None,
};
Self {
user: user.into(),
input_mint: input_mint.into(),
output_mint: output_mint.into(),
params: OrderParams::PriceWrapper { price: params },
}
}
pub fn with_start_at(mut self, start_at: u64) -> Self {
match &mut self.params {
OrderParams::TimeWrapper { time } => time.start_at = Some(start_at),
OrderParams::PriceWrapper { price } => price.start_at = Some(start_at),
}
self
}
pub fn with_min_price(mut self, price: f64) -> Self {
if let OrderParams::TimeWrapper { time } = &mut self.params {
time.min_price = Some(price);
}
self
}
pub fn with_max_price(mut self, price: f64) -> Self {
if let OrderParams::TimeWrapper { time } = &mut self.params {
time.max_price = Some(price);
}
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CancelRecurringOrderRequest {
pub order: String,
pub recurring_type: RecurringOrderType,
pub user: String,
}
impl CancelRecurringOrderRequest {
pub fn new(
order: impl Into<String>,
recurring_type: RecurringOrderType,
user: impl Into<String>,
) -> Self {
Self {
order: order.into(),
recurring_type,
user: user.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RecurringOrderType {
Time,
Price,
All,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PriceDeposit {
pub amount: u64,
pub order: String,
pub user: String,
}
impl PriceDeposit {
pub fn new(amount: u64, order: impl Into<String>, user: impl Into<String>) -> Self {
Self {
amount,
order: order.into(),
user: user.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PriceWithdraw {
pub amount: u64,
pub order: String,
pub user: String,
pub input_or_output: String,
}
impl PriceWithdraw {
pub fn new(
amount: u64,
order: impl Into<String>,
user: impl Into<String>,
input_or_output: impl Into<String>,
) -> Self {
Self {
amount,
order: order.into(),
user: user.into(),
input_or_output: input_or_output.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecurringResponse {
pub request_id: String,
pub transaction: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecuteRecurringRequest {
pub request_id: String,
pub signed_transaction: String,
}
impl ExecuteRecurringRequest {
pub fn new(request_id: impl Into<String>, signed_transaction: impl Into<String>) -> Self {
Self {
request_id: request_id.into(),
signed_transaction: signed_transaction.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExecuteRecurringResponse {
pub signature: String,
pub status: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetRecurringOrders {
pub recurring_type: RecurringOrderType,
pub order_status: OrderStatus,
pub user: String,
pub page: u64,
pub mint: Option<String>,
pub include_failed_tx: bool,
}
impl GetRecurringOrders {
pub fn new(
recurring_type: RecurringOrderType,
order_status: OrderStatus,
user: impl Into<String>,
) -> Self {
Self {
recurring_type,
order_status,
user: user.into(),
page: 1,
mint: None,
include_failed_tx: false,
}
}
pub fn with_page(mut self, page: u64) -> Self {
self.page = page;
self
}
pub fn with_mint(mut self, mint: impl Into<String>) -> Self {
self.mint = Some(mint.into());
self
}
pub fn include_failed(mut self) -> Self {
self.include_failed_tx = true;
self
}
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RecurringOrders {
pub order_status: OrderStatus,
pub page: u64,
pub total_pages: u64,
pub user: String,
#[serde(default)]
pub time: Option<Vec<TimeOrder>>,
#[serde(default)]
pub price: Option<Vec<PriceOrder>>,
#[serde(default)]
pub all: Option<Vec<Order>>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Order {
Time(TimeOrder),
Price(PriceOrder),
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PriceOrder {
pub close_tx: String,
pub closed_by: String,
pub created_at: String,
pub estimated_usdc_value_spent: String,
pub in_deposited: String,
pub in_left: String,
pub in_used: String,
pub in_withdrawn: String,
pub incremental_usd_value: String,
pub input_mint: String,
pub open_tx: String,
pub order_interval: String,
pub order_key: String,
pub out_received: String,
pub out_withdrawn: String,
pub output_mint: String,
pub raw_estimated_usdc_value_spent: String,
pub raw_in_deposited: String,
pub raw_in_left: String,
pub raw_in_used: String,
pub raw_in_withdrawn: String,
pub raw_incremental_usd_value: String,
pub raw_out_received: String,
pub raw_out_withdrawn: String,
pub raw_supposed_usd_value: String,
pub start_at: String,
pub status: String,
pub supposed_usd_value: String,
pub trades: Vec<Trade>,
pub updated_at: String,
pub user_pubkey: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeOrder {
pub close_tx: String,
pub created_at: String,
pub cycle_frequency: String,
pub in_amount_per_cycle: String,
pub in_deposited: String,
pub in_used: String,
pub in_withdrawn: String,
pub input_mint: String,
pub max_out_amount: String,
pub min_out_amount: String,
pub open_tx: String,
pub order_key: String,
pub out_received: String,
pub out_withdrawn: String,
pub output_mint: String,
pub raw_in_amount_per_cycle: String,
pub raw_in_deposited: String,
pub raw_in_used: String,
pub raw_in_withdrawn: String,
pub raw_max_out_amount: String,
pub raw_min_out_amount: String,
pub raw_out_received: String,
pub raw_out_withdrawn: String,
pub trades: Vec<Trade>,
pub updated_at: String,
pub user_closed: bool,
pub user_pubkey: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Trade {
pub action: String,
pub confirmed_at: String,
pub fee_amount: String,
pub fee_mint: String,
pub input_amount: String,
pub input_mint: String,
pub keeper: String,
pub order_key: String,
pub output_amount: String,
pub output_mint: String,
#[serde(default)]
pub product_meta: Option<ProductMeta>,
pub raw_fee_amount: String,
pub raw_input_amount: String,
pub raw_output_amount: String,
pub tx_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct ProductMeta {
pub new_actual_usdc_value: String,
pub value: String,
}