use crate::types::{AssetAmount, Price, Quantity};
use buffa_types::google::protobuf::Timestamp;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Order {
pub order_id: String,
pub symbol_id: u32,
pub client_order_id: String,
pub side: String,
pub status: String,
pub order_type: String,
pub tif: String,
pub orig_qty: Option<Quantity>,
pub cum_qty: Option<Quantity>,
pub leaves_qty: Option<Quantity>,
pub price: Option<Price>,
pub avg_px: Option<Price>,
pub created_ts_ns: String,
pub version: u32,
pub post_only: bool,
pub fee_asset: String,
pub submitted_max_quote_debit_scaled: Option<i64>,
pub attached_risk: Option<AttachedRisk>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrdersList {
pub orders: Vec<Order>,
pub next_page_token: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrderMutationResult {
pub status: String,
pub order_id: String,
pub client_order_id: String,
pub resolved_base_qty: Option<Quantity>,
pub submitted_max_quote_debit_scaled: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GetOrderResult {
pub order: Option<Order>,
pub trades: Vec<UserTrade>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UserTrade {
pub symbol_id: u32,
pub match_id: String,
pub order_id: String,
pub side: String,
pub is_maker: bool,
pub price: Option<Price>,
pub qty: Option<Quantity>,
pub fee_scaled: String,
pub fee_asset: String,
pub referral_share_scaled: String,
pub ts_ns: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct UserTradesList {
pub trades: Vec<UserTrade>,
pub next_page_token: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ModifyOrderResult {
pub action_taken: String,
pub old_order_id: String,
pub final_order_id: String,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CancelAllOrdersResult {
pub status: String,
pub matched_orders: u32,
pub submitted_cancels: u32,
pub failed_cancels: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchCreateResultItem {
pub status: String,
pub order_id: String,
pub client_order_id: String,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchCreateOrdersResult {
pub results: Vec<BatchCreateResultItem>,
pub accepted_count: u32,
pub rejected_count: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OrderKey {
OrderId(String),
ClientOrderId(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchCancelItem {
pub key: OrderKey,
pub symbol_id: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchCancelResultItem {
pub status: String,
pub order_id: String,
pub client_order_id: String,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchCancelOrdersResult {
pub results: Vec<BatchCancelResultItem>,
pub accepted_count: u32,
pub rejected_count: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchReplaceItem {
pub key: OrderKey,
pub new_price: Option<Price>,
pub new_qty: Option<Quantity>,
pub new_attached_risk: Option<AttachedRisk>,
pub new_client_order_id: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ModifyOrderParams {
pub symbol: String,
pub key: OrderKey,
pub subaccount_id: Option<u64>,
pub request_id: Option<String>,
pub new_price: Option<Price>,
pub new_qty: Option<Quantity>,
pub new_attached_risk: Option<AttachedRisk>,
pub behavior: Option<String>,
pub new_client_order_id: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TriggerPriceSourceKind {
LastPrice,
IndexPrice,
MarkPrice,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RiskLeg {
pub trigger_price: Price,
#[deprecated(
note = "attached risk always uses last trade; supplying trigger_price_source is rejected"
)]
pub trigger_price_source: Option<TriggerPriceSourceKind>,
pub order_type: Option<CreateOrderType>,
pub limit_price: Option<Price>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TrailingDistance {
Ticks(i64),
Bps(i32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MaxSlippage {
Ticks(i32),
Bps(i32),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TrailingStop {
pub distance: TrailingDistance,
pub activation_price: Option<Price>,
#[deprecated(
note = "attached trailing always uses last trade; supplying trigger_price_source is rejected"
)]
pub trigger_price_source: Option<TriggerPriceSourceKind>,
#[deprecated(
note = "attached trailing child is always market; supplying order_type is rejected"
)]
pub order_type: Option<CreateOrderType>,
pub max_slippage: Option<MaxSlippage>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AttachedRisk {
pub take_profit: Option<RiskLeg>,
pub stop_loss: Option<RiskLeg>,
pub trailing_stop: Option<TrailingStop>,
pub oco: bool,
}
#[derive(Debug, Clone)]
pub struct CreateInternalTransferParams {
pub asset_id: u32,
pub quantity: AssetAmount,
pub idempotency_key: String,
pub subaccount_id: Option<u64>,
pub destination_account_id: Option<String>,
pub destination_subaccount_id: Option<String>,
pub destination_smart_account_address: Option<String>,
pub quantity_scale: Option<u32>,
}
#[derive(Debug, Clone)]
pub struct CreateTradingWithdrawParams {
pub asset_id: u32,
pub amount: AssetAmount,
pub payload_signature: Vec<u8>,
pub destination_address: String,
pub idempotency_key: String,
pub amount_scale: Option<u32>,
pub deadline_ts_sec: Option<u64>,
pub nonce: u128,
}
#[derive(Debug, Clone)]
pub struct CreateApiKeyTradingWithdrawParams {
pub asset_id: u32,
pub amount: AssetAmount,
pub destination_address: String,
pub idempotency_key: String,
pub amount_scale: Option<u32>,
pub deadline_ts_sec: Option<u64>,
pub nonce: Option<u128>,
}
#[derive(Debug, Clone)]
pub struct CreateWalletTradingWithdrawParams {
pub action: String,
pub asset_id: u32,
pub amount: AssetAmount,
pub idempotency_key: String,
pub payload_signature: Vec<u8>,
pub signer_wallet: String,
pub destination_chain_id: u64,
pub destination_address: String,
pub subaccount_id: Option<u64>,
pub amount_scale: Option<u32>,
pub deadline_ts_sec: Option<u64>,
pub nonce: u128,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchReplaceAdmissionItem {
pub item_index: u32,
pub status: String,
pub old_order_id: String,
pub client_order_id: String,
pub replacement_order_id: String,
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchReplaceOrdersResult {
pub batch_request_id: String,
pub status: String,
pub results: Vec<BatchReplaceAdmissionItem>,
pub accepted_count: u32,
pub rejected_count: u32,
pub accepted_ts_ns: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchReplaceStatusItem {
pub item_index: u32,
pub phase: String,
pub old_order_id: String,
pub replacement_order_id: String,
pub order_status: String,
pub code: String,
pub updated_ts_ns: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BatchReplaceStatusResult {
pub batch_request_id: String,
pub admission_status: String,
pub items: Vec<BatchReplaceStatusItem>,
pub accepted_count: u32,
pub rejected_count: u32,
pub accepted_ts_ns: u64,
pub updated_ts_ns: u64,
}
impl BatchReplaceStatusResult {
pub fn is_settled(&self) -> bool {
is_batch_replace_settled(self)
}
}
pub fn is_batch_replace_settled(status: &BatchReplaceStatusResult) -> bool {
!status.items.is_empty()
&& status
.items
.iter()
.all(|item| matches!(item.phase.as_str(), "working" | "rejected" | "terminal"))
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CancelAllAfterResult {
pub status: String,
pub effective_timeout_sec: u32,
pub expires_at_ts_ns: String,
}
#[derive(Debug, Clone, Default)]
pub struct ListOpenOrdersOpts {
pub subaccount_id: Option<u64>,
pub page_token: Option<String>,
pub limit: Option<u32>,
pub include_attached_risk: bool,
pub include_attached_risk_state: bool,
}
#[derive(Debug, Clone, Default)]
pub struct ListOrderHistoryOpts {
pub subaccount_id: Option<u64>,
pub symbol: Option<String>,
pub symbol_id: Option<u32>,
pub page_token: Option<String>,
pub limit: Option<u32>,
pub include_attached_risk: bool,
pub include_attached_risk_state: bool,
}
#[derive(Debug, Clone)]
pub struct GetOrderOpts {
pub key: OrderKey,
pub subaccount_id: Option<u64>,
pub include_attached_risk: bool,
pub include_attached_risk_state: bool,
}
#[derive(Debug, Clone)]
pub struct CancelOrderParams {
pub key: OrderKey,
pub symbol: Option<String>,
pub symbol_id: Option<u32>,
pub subaccount_id: Option<u64>,
}
#[derive(Debug, Clone, Default)]
pub struct CancelAllOpts {
pub symbol: Option<String>,
pub dry_run: bool,
pub subaccount_id: Option<u64>,
pub side: Option<String>,
pub request_id: Option<String>,
}
#[derive(Debug, Clone)]
pub struct CreateOrderParams {
pub symbol: String,
pub side: CreateSide,
pub order_type: CreateOrderType,
pub quantity: Option<Quantity>,
pub max_quote_debit_scaled: Option<Quantity>,
pub price: Option<Price>,
pub time_in_force: Option<CreateTimeInForce>,
pub client_order_id: Option<String>,
pub subaccount_id: Option<u64>,
pub post_only: Option<bool>,
pub market_client_ref_price: Option<Price>,
pub fee_asset: Option<FeeAsset>,
pub self_trade_prevention: Option<OrderSelfTradePrevention>,
pub market_max_slippage: Option<MaxSlippage>,
pub attached_risk: Option<AttachedRisk>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FeeAsset {
Quote,
Base,
}
#[deprecated(note = "renamed to FeeAsset; use FeeAsset::Base instead of the removed Received")]
pub type OrderFeeSource = FeeAsset;
#[derive(Debug, Clone)]
pub struct PreviewOrderParams {
pub symbol: String,
pub side: CreateSide,
pub order_type: CreateOrderType,
pub quantity: Option<Quantity>,
pub max_quote_debit_scaled: Option<Quantity>,
pub price: Option<Price>,
pub time_in_force: Option<CreateTimeInForce>,
pub client_order_id: Option<String>,
pub subaccount_id: Option<u64>,
pub post_only: Option<bool>,
pub market_client_ref_price: Option<Price>,
pub fee_asset: Option<FeeAsset>,
pub self_trade_prevention: Option<OrderSelfTradePrevention>,
pub market_max_slippage: Option<MaxSlippage>,
pub attached_risk: Option<AttachedRisk>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrderFieldViolation {
pub field_path: String,
pub rule_id: String,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OrderErrorDetail {
pub code: String,
pub violations: Vec<OrderFieldViolation>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PreviewOrderResult {
pub admissible: Option<bool>,
pub rejection: Option<OrderErrorDetail>,
pub resolved_base_qty: Option<Quantity>,
pub protected_price_bound: Option<Price>,
pub evaluated_at_ms: i64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OrderSelfTradePrevention {
ExpireTaker,
ExpireMaker,
ExpireBoth,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CreateSide {
Buy,
Sell,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CreateOrderType {
Limit,
Market,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CreateTimeInForce {
Gtc,
Ioc,
Fok,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InternalTransferResult {
pub request_id: String,
pub transfer_id: String,
pub asset_id: u32,
pub asset_code: String,
pub quantity: Option<AssetAmount>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DepositAddress {
pub chain_id: u32,
pub deposit_address: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DepositAddressesList {
pub addresses: Vec<DepositAddress>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WithdrawIntentResult {
pub intent_id: String,
pub status: String,
pub flow_id: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ApiKeySummary {
pub key_id: String,
pub label: String,
pub status: String,
pub public_key_ed25519: String,
pub created_at: Option<Timestamp>,
pub last_used_at: Option<Timestamp>,
pub updated_at: Option<Timestamp>,
pub revision: u64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ApiKeysList {
pub keys: Vec<ApiKeySummary>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResolvedAccount {
pub account_id: String,
pub username: String,
pub smart_account_address: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResolvedAccountsList {
pub accounts: Vec<ResolvedAccount>,
}