syntax = "proto3";

import "orders.proto";
import "txncb.proto";
import "common.proto";

package cabal;



service CabalRpc {
  rpc UserActivityUni(UserActionSub) returns (stream UserResponse) {}
  rpc TradesUni(TradeEventSub) returns (stream TradeEventResponse) {}
  rpc SubscribeToken(TokenTradeEventSub) returns (TradeResponse) {}
  rpc TradePing(Ping) returns (Pong) {}
  rpc UserPing(Ping) returns (Pong) {}
  rpc MarketSell(Sell) returns (TradeResponse) {}
  rpc MarketBuy(Buy) returns (TradeResponse) {}
  rpc GetTokenLimitOrders(common.TokenAddress) returns (orders.TokenLimitOrders) {}
  rpc PlaceLimitOrders(orders.TokenLimitOrders) returns (orders.PlaceLimitOrdersResponce) {}
  rpc DeleteLimitOrders(orders.DeleteOrders) returns (orders.PlaceLimitOrdersResponce) {}

  //rpc Echo (EchoRequest) returns (EchoResponse) {} // TEST ONLY
  //rpc UserActivityBidi(stream UserAction) returns (stream UserResponse) {}
  //rpc TradesBidi(stream TradeEventsRequest) returns (stream TradeEventsResponse) {}
  //rpc GetTokenTradeStats(TokenTradeStatsCall) returns (TokenTradeStats) {}
}




message UserAction {
  oneof user_action_kind {
    Buy buy = 1;
    Sell sell = 2;
    TokenTradeStats token_trade_stats =3;
    Ping ping = 4;
    Pong pong = 5;
  }
}

message TradeEventSub {}
message UserActionSub {}
message EchoRequest {
  string message =1;
}
message EchoResponse {
  string message =1;
}
message TradeEventRequest {
  oneof trade_event_request_kind {
    TokenTradeEventSub sub = 1;
    Ping ping = 2;
    Pong pong = 3;
  }
}
message TokenTradeEventSub {
  string mint = 1;
}

message TokenStatusRequest {
  string mint = 1;
}

message TradeEventResponse {
  oneof trade_event_response_kind {
    TradeEvent trade_event =1;
    TokenStatus token_status =2;
    Ping ping = 3;
    Pong pong = 4;
  }
}

message Ping {
  uint64 count = 1;
}

message Pong{
  uint64 count = 1;
}




message UserResponse {
  oneof user_response_kind {
    TradeResponse trade_status = 1;
    TokenTradeStats trade_stats = 2;
    txncb.LandedTxnState txn_cb =3;
    Ping ping = 4;
    Pong pong = 5;
  }
}

message TokenTradeStatsCall {
  string mint =1;
}
enum UserTradeStatus {
  accepted = 0;
  rejected = 1;
}

message TradeResponse {
  uint64 slot = 2;
}

message TokenStatus {
    string mint = 1;
    string pool_id = 2;
    PoolKind pool_kind = 3;
    MigrationStatus migration_status = 4;
    uint64 supply = 5;
    uint64 base_liq = 6;
    uint64 quote_liq = 7;
    common.QuoteKind qoute_kind =8;
    optional uint32 tax_bps = 9;
    string ticker = 10;
}
enum MigrationStatus {
  migrated = 0;
  migrating = 1;
  pre_migration = 2;
  non_migratable = 3;
}
enum PoolKind {
  pump = 0;
  ray_amm = 1;
  moonshot = 2;
  meteora = 3;
  ray_clmm = 4;
  ray_cpmm = 5;
  pump_amm = 6;
  ray_ll = 7;
}

message TokenTradeStats {
  string mint = 1;
  uint64 token_balance = 2;
  uint64 buy_qoute = 3;
  uint64 sell_qoute = 4;
  uint64 buy_base = 5;
  uint64 sell_base = 6;
  uint32 buys = 7;
  uint32 sells = 8;
  uint64 sol_balance =9;
  uint64 last_traded_slot =10;
  uint32 token_decimals = 11;
  common.QuoteKind qoute_kind =12;
}



message TradeEvent {
  oneof trade_event_kind {
    TradeEventData buy = 1;
    TradeEventData sell = 2;
    TradeEventData deposit = 3;
    TradeEventData withdraw = 4;
    TradeEventData migration_start =5;
    TradeEventData migration_end =6;
    BurnEventData burn_liq = 7;
    BurnEventData burn_mint = 8;
  }
}

message TradeEventData {
  uint64 amount_sol =1;
  uint64 base_liq = 2;
  uint64 quote_liq = 3;
  PoolKind pool_kind =4;
}

message BurnEventData {
  uint64 amount = 1;
  uint64 left = 2;
}



message Buy {
  uint64 amount = 1;
  string mint = 2;  
  uint32 slippage_bps = 3; // fract 0 - 1
  uint64 tip = 4;
  optional uint64 priority_fee = 5; // lamports
  optional uint64 nonce = 6;
  optional uint32 slot_latency = 7;
  optional common.UnixTimestamp expire_at =8; // Utc timestamp in seconds
  optional common.QuoteKind qoute_kind =9;
}

message Sell {
  uint32 amount_bps = 1; // fract 0 - 1
  string mint = 2;  
  uint32 slippage_bps  = 3; // fract 0 - 1
  uint64 tip = 4;
  optional uint64 priority_fee = 5; // lamports
  optional uint64 nonce = 6;
  optional uint32 slot_latency = 7;
  optional common.UnixTimestamp expire_at =8;  // Utc timestamp in seconds
}

