#![allow(unused, non_snake_case, clippy::all)]
use crate::Value;
use crate::get_value;
use crate::runtime::*;
use crate::exchange_generated::ExchangeBase;
use crate::exchange::ExchangeRuntime;
use crate::pro::*;
pub struct GateCore {
pub parent: crate::exchanges::gate::GateCore,
}
impl GateCore {
pub fn new(config: Option<crate::Value>) -> Self {
let mut s = Self { parent: crate::exchanges::gate::GateCore::new(config) };
s.init();
s
}
pub fn init(&mut self) {
let described = GateCore::describe(self);
self.initialize_properties(described);
<Self as crate::exchange_generated::ExchangeBase>::after_construct(self);
}
#[inline]
pub fn bind(&mut self) {}
}
impl crate::exchange::DerivedExchange for GateCore {
fn nonce(&self, ) -> crate::Value {
crate::exchange::DerivedExchange::nonce(&self.parent)
}
fn parse_ticker(&self, ticker: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_ticker(&self.parent, ticker, market)
}
fn parse_trade(&self, trade: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_trade(&self.parent, trade, market)
}
fn parse_order(&self, order: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_order(&self.parent, order, market)
}
fn parse_market(&self, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_market(&self.parent, market)
}
fn parse_ohlcv(&self, ohlcv: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_ohlcv(&self.parent, ohlcv, market)
}
fn parse_order_book(&self, ob: crate::Value, symbol: crate::Value, ts: crate::Value, bk: crate::Value, ak: crate::Value, pk: crate::Value, ak2: crate::Value, ck: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_order_book(&self.parent, ob, symbol, ts, bk, ak, pk, ak2, ck)
}
fn parse_balance(&self, response: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_balance(&self.parent, response)
}
fn parse_position(&self, position: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_position(&self.parent, position, market)
}
fn parse_funding_rate(&self, rate: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_funding_rate(&self.parent, rate, market)
}
fn parse_deposit(&self, tx: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_deposit(&self.parent, tx, currency)
}
fn parse_deposit_address(&self, depositAddress: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_deposit_address(&self.parent, depositAddress, currency)
}
fn parse_last_price(&self, entry: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_last_price(&self.parent, entry, market)
}
fn parse_withdrawal(&self, tx: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_withdrawal(&self.parent, tx, currency)
}
fn parse_ledger_entry(&self, entry: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_ledger_entry(&self.parent, entry, currency)
}
fn parse_transfer(&self, transfer: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_transfer(&self.parent, transfer, currency)
}
fn parse_currency(&self, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_currency(&self.parent, currency)
}
fn parse_bid_ask(&self, bidask: crate::Value, price_key: crate::Value, amount_key: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_bid_ask(&self.parent, bidask, price_key, amount_key, market)
}
fn parse_open_interest(&self, interest: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_open_interest(&self.parent, interest, market)
}
fn parse_liquidation(&self, liquidation: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_liquidation(&self.parent, liquidation, market)
}
fn parse_funding_rate_history(&self, entry: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_funding_rate_history(&self.parent, entry, market)
}
fn parse_margin_modification(&self, data: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_margin_modification(&self.parent, data, market)
}
fn parse_account(&self, account: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_account(&self.parent, account)
}
fn parse_my_trade(&self, trade: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_my_trade(&self.parent, trade, market)
}
fn parse_transaction(&self, transaction: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_transaction(&self.parent, transaction, currency)
}
fn parse_borrow_interest(&self, info: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_borrow_interest(&self.parent, info, market)
}
fn parse_adl_rank(&self, info: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_adl_rank(&self.parent, info, market)
}
fn parse_income(&self, info: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_income(&self.parent, info, market)
}
fn parse_greeks(&self, greeks: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_greeks(&self.parent, greeks, market)
}
fn parse_margin_mode(&self, margin_mode: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_margin_mode(&self.parent, margin_mode, market)
}
fn parse_conversion(&self, conversion: crate::Value, from_currency: crate::Value, to_currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_conversion(&self.parent, conversion, from_currency, to_currency)
}
fn parse_borrow_rate(&self, info: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_borrow_rate(&self.parent, info, currency)
}
fn parse_leverage(&self, leverage: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_leverage(&self.parent, leverage, market)
}
fn parse_market_leverage_tiers(&self, info: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_market_leverage_tiers(&self.parent, info, market)
}
fn parse_deposit_withdraw_fee(&self, fee: crate::Value, currency: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_deposit_withdraw_fee(&self.parent, fee, currency)
}
fn parse_prediction_trade(&self, trade: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_prediction_trade(&self.parent, trade, market)
}
fn parse_prediction_order(&self, order: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_prediction_order(&self.parent, order, market)
}
fn parse_prediction_position(&self, position: crate::Value, market: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::parse_prediction_position(&self.parent, position, market)
}
fn create_expired_option_market(&self, symbol: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::create_expired_option_market(&self.parent, symbol)
}
fn sign(&self, path: crate::Value, api: crate::Value, method: crate::Value, params: crate::Value, headers: crate::Value, body: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::sign(&self.parent, path, api, method, params, headers, body)
}
fn handle_errors(&self, code: crate::Value, reason: crate::Value, url: crate::Value, method: crate::Value, headers: crate::Value, body: crate::Value, response: crate::Value, request_headers: crate::Value, request_body: crate::Value) -> crate::Value {
crate::exchange::DerivedExchange::handle_errors(&self.parent, code, reason, url, method, headers, body, response, request_headers, request_body)
}
}
impl crate::exchange_generated::ExchangeBase for GateCore {
fn call_dynamic<'a>(&'a mut self, method: &'a str, args: Vec<crate::Value>)
-> std::pin::Pin<Box<dyn std::future::Future<Output = crate::Value> + Send + 'a>>
{
Box::pin(async move {
match method {
"authenticate" => self.authenticate(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)).await,
"cancel_all_orders_ws" => self.cancel_all_orders_ws(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"cancel_order_ws" => self.cancel_order_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"create_order_ws" => self.create_order_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), &args.get(4..).unwrap_or(&[]).to_vec()[..]).await,
"create_orders_ws" => self.create_orders_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"describe_data" => self.describe_data(),
"edit_order_ws" => self.edit_order_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), &args.get(4..).unwrap_or(&[]).to_vec()[..]).await,
"fetch_closed_orders_ws" => self.fetch_closed_orders_ws(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"fetch_open_orders_ws" => self.fetch_open_orders_ws(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"fetch_order_ws" => self.fetch_order_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"fetch_orders_by_status_ws" => self.fetch_orders_by_status_ws(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"get_cache_index" => self.get_cache_index(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)),
"get_market_type_by_url" => self.get_market_type_by_url(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_type_by_market" => self.get_type_by_market(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_url_by_market" => self.get_url_by_market(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_url_by_market_type" => self.get_url_by_market_type(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]),
"handle_error_message" => self.handle_error_message(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)),
"handle_message" => { self.handle_message(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"load_positions_snapshot" => self.load_positions_snapshot(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null)).await,
"parse_ws_liquidation" => self.parse_ws_liquidation(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]),
"request_id" => self.request_id(),
"request_private" => self.request_private(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), &args.get(3..).unwrap_or(&[]).to_vec()[..]).await,
"subscribe_private" => self.subscribe_private(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), args.get(4).cloned().unwrap_or(crate::Value::Null), &args.get(5..).unwrap_or(&[]).to_vec()[..]).await,
"subscribe_public" => self.subscribe_public(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), &args.get(4..).unwrap_or(&[]).to_vec()[..]).await,
"subscribe_public_multiple" => self.subscribe_public_multiple(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), &args.get(4..).unwrap_or(&[]).to_vec()[..]).await,
"subscribe_watch_tickers_and_bids_asks" => self.subscribe_watch_tickers_and_bids_asks(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"un_subscribe_public_multiple" => self.un_subscribe_public_multiple(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null), args.get(3).cloned().unwrap_or(crate::Value::Null), args.get(4).cloned().unwrap_or(crate::Value::Null), args.get(5).cloned().unwrap_or(crate::Value::Null), args.get(6).cloned().unwrap_or(crate::Value::Null), &args.get(7..).unwrap_or(&[]).to_vec()[..]).await,
"un_watch_order_book" => self.un_watch_order_book(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"un_watch_trades" => self.un_watch_trades(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"un_watch_trades_for_symbols" => self.un_watch_trades_for_symbols(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_balance" => self.watch_balance(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_bids_asks" => self.watch_bids_asks(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_my_liquidations" => self.watch_my_liquidations(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_my_liquidations_for_symbols" => self.watch_my_liquidations_for_symbols(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_my_trades" => self.watch_my_trades(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_ohlcv" => self.watch_ohlcv(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_order_book" => self.watch_order_book(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_orders" => self.watch_orders(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_positions" => self.watch_positions(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_ticker" => self.watch_ticker(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_tickers" => self.watch_tickers(&args.get(0..).unwrap_or(&[]).to_vec()[..]).await,
"watch_trades" => self.watch_trades(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
"watch_trades_for_symbols" => self.watch_trades_for_symbols(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]).await,
_ => crate::exchange_generated::ExchangeBase::call_dynamic(&mut self.parent, method, args).await,
}
})
}
}
impl GateCore {
#[allow(dead_code, unreachable_patterns, clippy::all)]
pub fn dispatch_ws_handler(&mut self, __name: &crate::Value, args: &[crate::Value]) -> crate::Value {
let __n = match __name { crate::Value::Str(s) => s.as_str(), _ => return crate::Value::Null };
match __n {
"authenticate" => { crate::exchange_stubs::enqueue_spawn("authenticate", args.to_vec()); crate::Value::Null },
"cancel_all_orders_ws" => { crate::exchange_stubs::enqueue_spawn("cancel_all_orders_ws", args.to_vec()); crate::Value::Null },
"cancel_order_ws" => { crate::exchange_stubs::enqueue_spawn("cancel_order_ws", args.to_vec()); crate::Value::Null },
"create_order_ws" => { crate::exchange_stubs::enqueue_spawn("create_order_ws", args.to_vec()); crate::Value::Null },
"create_orders_ws" => { crate::exchange_stubs::enqueue_spawn("create_orders_ws", args.to_vec()); crate::Value::Null },
"describe_data" => self.describe_data(),
"edit_order_ws" => { crate::exchange_stubs::enqueue_spawn("edit_order_ws", args.to_vec()); crate::Value::Null },
"fetch_closed_orders_ws" => { crate::exchange_stubs::enqueue_spawn("fetch_closed_orders_ws", args.to_vec()); crate::Value::Null },
"fetch_open_orders_ws" => { crate::exchange_stubs::enqueue_spawn("fetch_open_orders_ws", args.to_vec()); crate::Value::Null },
"fetch_order_ws" => { crate::exchange_stubs::enqueue_spawn("fetch_order_ws", args.to_vec()); crate::Value::Null },
"fetch_orders_by_status_ws" => { crate::exchange_stubs::enqueue_spawn("fetch_orders_by_status_ws", args.to_vec()); crate::Value::Null },
"get_cache_index" => self.get_cache_index(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)),
"get_market_type_by_url" => self.get_market_type_by_url(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_type_by_market" => self.get_type_by_market(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_url_by_market" => self.get_url_by_market(args.get(0).cloned().unwrap_or(crate::Value::Null)),
"get_url_by_market_type" => self.get_url_by_market_type(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]),
"handle_authentication_message" => { self.handle_authentication_message(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_balance" => { self.handle_balance(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_balance_subscription" => { self.handle_balance_subscription(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), &args.get(2..).unwrap_or(&[]).to_vec()[..]); crate::Value::Null },
"handle_bid_ask" => { self.handle_bid_ask(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_bid_asks" => { self.handle_bid_asks(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_delta" => { self.handle_delta(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_error_message" => self.handle_error_message(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)),
"handle_liquidation" => { self.handle_liquidation(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_message" => { self.handle_message(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_my_trades" => { self.handle_my_trades(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_new_spot_order_book" => { self.handle_new_spot_order_book(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_ohlcv" => { self.handle_ohlcv(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_order" => { self.handle_order(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_order_book" => { self.handle_order_book(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_order_book_subscription" => { self.handle_order_book_subscription(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_positions" => { self.handle_positions(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_subscription_status" => { self.handle_subscription_status(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_ticker" => { self.handle_ticker(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_ticker_and_bid_ask" => { self.handle_ticker_and_bid_ask(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), args.get(2).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_trades" => { self.handle_trades(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"handle_un_subscribe" => { self.handle_un_subscribe(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null)); crate::Value::Null },
"load_positions_snapshot" => { crate::exchange_stubs::enqueue_spawn("load_positions_snapshot", args.to_vec()); crate::Value::Null },
"parse_ws_liquidation" => self.parse_ws_liquidation(args.get(0).cloned().unwrap_or(crate::Value::Null), &args.get(1..).unwrap_or(&[]).to_vec()[..]),
"request_id" => self.request_id(),
"request_private" => { crate::exchange_stubs::enqueue_spawn("request_private", args.to_vec()); crate::Value::Null },
"set_positions_cache" => { self.set_positions_cache(args.get(0).cloned().unwrap_or(crate::Value::Null), args.get(1).cloned().unwrap_or(crate::Value::Null), &args.get(2..).unwrap_or(&[]).to_vec()[..]); crate::Value::Null },
"subscribe_private" => { crate::exchange_stubs::enqueue_spawn("subscribe_private", args.to_vec()); crate::Value::Null },
"subscribe_public" => { crate::exchange_stubs::enqueue_spawn("subscribe_public", args.to_vec()); crate::Value::Null },
"subscribe_public_multiple" => { crate::exchange_stubs::enqueue_spawn("subscribe_public_multiple", args.to_vec()); crate::Value::Null },
"subscribe_watch_tickers_and_bids_asks" => { crate::exchange_stubs::enqueue_spawn("subscribe_watch_tickers_and_bids_asks", args.to_vec()); crate::Value::Null },
"un_subscribe_public_multiple" => { crate::exchange_stubs::enqueue_spawn("un_subscribe_public_multiple", args.to_vec()); crate::Value::Null },
"un_watch_order_book" => { crate::exchange_stubs::enqueue_spawn("un_watch_order_book", args.to_vec()); crate::Value::Null },
"un_watch_trades" => { crate::exchange_stubs::enqueue_spawn("un_watch_trades", args.to_vec()); crate::Value::Null },
"un_watch_trades_for_symbols" => { crate::exchange_stubs::enqueue_spawn("un_watch_trades_for_symbols", args.to_vec()); crate::Value::Null },
"watch_balance" => { crate::exchange_stubs::enqueue_spawn("watch_balance", args.to_vec()); crate::Value::Null },
"watch_bids_asks" => { crate::exchange_stubs::enqueue_spawn("watch_bids_asks", args.to_vec()); crate::Value::Null },
"watch_my_liquidations" => { crate::exchange_stubs::enqueue_spawn("watch_my_liquidations", args.to_vec()); crate::Value::Null },
"watch_my_liquidations_for_symbols" => { crate::exchange_stubs::enqueue_spawn("watch_my_liquidations_for_symbols", args.to_vec()); crate::Value::Null },
"watch_my_trades" => { crate::exchange_stubs::enqueue_spawn("watch_my_trades", args.to_vec()); crate::Value::Null },
"watch_ohlcv" => { crate::exchange_stubs::enqueue_spawn("watch_ohlcv", args.to_vec()); crate::Value::Null },
"watch_order_book" => { crate::exchange_stubs::enqueue_spawn("watch_order_book", args.to_vec()); crate::Value::Null },
"watch_orders" => { crate::exchange_stubs::enqueue_spawn("watch_orders", args.to_vec()); crate::Value::Null },
"watch_positions" => { crate::exchange_stubs::enqueue_spawn("watch_positions", args.to_vec()); crate::Value::Null },
"watch_ticker" => { crate::exchange_stubs::enqueue_spawn("watch_ticker", args.to_vec()); crate::Value::Null },
"watch_tickers" => { crate::exchange_stubs::enqueue_spawn("watch_tickers", args.to_vec()); crate::Value::Null },
"watch_trades" => { crate::exchange_stubs::enqueue_spawn("watch_trades", args.to_vec()); crate::Value::Null },
"watch_trades_for_symbols" => { crate::exchange_stubs::enqueue_spawn("watch_trades_for_symbols", args.to_vec()); crate::Value::Null },
_ => crate::Value::Null,
}
}
}
impl std::ops::Deref for GateCore {
type Target = crate::exchange::Exchange;
fn deref(&self) -> &crate::exchange::Exchange { std::ops::Deref::deref(&self.parent) }
}
impl std::ops::DerefMut for GateCore {
fn deref_mut(&mut self) -> &mut crate::exchange::Exchange { std::ops::DerefMut::deref_mut(&mut self.parent) }
}
impl GateCore {
pub fn describe(&self) -> Value {
let mut superDescribe: Value = self.parent.describe();
return self.deep_extend(superDescribe.clone(), &[self.describe_data()]);
Value::Null
}
pub fn describe_data(&self) -> Value {
return Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("has".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("ws".to_string(), Value::Bool(true));
m.insert("cancelAllOrdersWs".to_string(), Value::Bool(true));
m.insert("cancelOrderWs".to_string(), Value::Bool(true));
m.insert("createMarketBuyOrderWithCostWs".to_string(), Value::Bool(true));
m.insert("createMarketOrderWs".to_string(), Value::Bool(true));
m.insert("createMarketOrderWithCostWs".to_string(), Value::Bool(false));
m.insert("createMarketSellOrderWithCostWs".to_string(), Value::Bool(false));
m.insert("createOrderWs".to_string(), Value::Bool(true));
m.insert("createOrdersWs".to_string(), Value::Bool(true));
m.insert("createPostOnlyOrderWs".to_string(), Value::Bool(true));
m.insert("createReduceOnlyOrderWs".to_string(), Value::Bool(true));
m.insert("createStopLimitOrderWs".to_string(), Value::Bool(true));
m.insert("createStopLossOrderWs".to_string(), Value::Bool(true));
m.insert("createStopMarketOrderWs".to_string(), Value::Bool(false));
m.insert("createStopOrderWs".to_string(), Value::Bool(true));
m.insert("createTakeProfitOrderWs".to_string(), Value::Bool(true));
m.insert("createTriggerOrderWs".to_string(), Value::Bool(true));
m.insert("editOrderWs".to_string(), Value::Bool(true));
m.insert("fetchOrderWs".to_string(), Value::Bool(true));
m.insert("fetchOrdersWs".to_string(), Value::Bool(false));
m.insert("fetchOpenOrdersWs".to_string(), Value::Bool(true));
m.insert("fetchClosedOrdersWs".to_string(), Value::Bool(true));
m.insert("watchOrderBook".to_string(), Value::Bool(true));
m.insert("watchBidsAsks".to_string(), Value::Bool(true));
m.insert("watchTicker".to_string(), Value::Bool(true));
m.insert("watchTickers".to_string(), Value::Bool(true));
m.insert("watchTrades".to_string(), Value::Bool(true));
m.insert("watchTradesForSymbols".to_string(), Value::Bool(true));
m.insert("watchMyTrades".to_string(), Value::Bool(true));
m.insert("watchOHLCV".to_string(), Value::Bool(true));
m.insert("watchBalance".to_string(), Value::Bool(true));
m.insert("watchOrders".to_string(), Value::Bool(true));
m.insert("watchLiquidations".to_string(), Value::Bool(false));
m.insert("watchLiquidationsForSymbols".to_string(), Value::Bool(false));
m.insert("watchMyLiquidations".to_string(), Value::Bool(true));
m.insert("watchMyLiquidationsForSymbols".to_string(), Value::Bool(true));
m.insert("watchPositions".to_string(), Value::Bool(true));
m.insert("unWatchTicker".to_string(), Value::Bool(false));
m.insert("unWatchTickers".to_string(), Value::Bool(false));
m.insert("unWatchOHLCV".to_string(), Value::Bool(false));
m.insert("unWatchOHLCVForSymbols".to_string(), Value::Bool(false));
m.insert("unWatchOrderBook".to_string(), Value::Bool(true));
m.insert("unWatchOrderBookForSymbols".to_string(), Value::Bool(false));
m.insert("unWatchTrades".to_string(), Value::Bool(true));
m.insert("unWatchTradesForSymbols".to_string(), Value::Bool(true));
m.insert("unWatchMyTrades".to_string(), Value::Bool(false));
m.insert("unWatchOrders".to_string(), Value::Bool(false));
m.insert("unWatchPositions".to_string(), Value::Bool(false));
m.insert("unWatchMarkPrices".to_string(), Value::Bool(false));
m.insert("unWatchMarkPrice".to_string(), Value::Bool(false));
m
}));
m.insert("urls".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("api".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("ws".to_string(), Value::Str("wss://ws.gate.io/v4".to_string()));
m.insert("spot".to_string(), Value::Str("wss://api.gateio.ws/ws/v4/".to_string()));
m.insert("swap".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://fx-ws.gateio.ws/v4/ws/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://fx-ws.gateio.ws/v4/ws/btc".to_string()));
m
}));
m.insert("future".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://fx-ws.gateio.ws/v4/ws/delivery/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://fx-ws.gateio.ws/v4/ws/delivery/btc".to_string()));
m
}));
m.insert("option".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://op-ws.gateio.live/v4/ws/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://op-ws.gateio.live/v4/ws/btc".to_string()));
m
}));
m
}));
m.insert("test".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("swap".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://ws-testnet.gate.com/v4/ws/futures/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://fx-ws-testnet.gateio.ws/v4/ws/btc".to_string()));
m
}));
m.insert("future".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://fx-ws-testnet.gateio.ws/v4/ws/delivery/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://fx-ws-testnet.gateio.ws/v4/ws/delivery/btc".to_string()));
m
}));
m.insert("option".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usdt".to_string(), Value::Str("wss://ws-testnet.gate.com/v4/ws/options/usdt".to_string()));
m.insert("btc".to_string(), Value::Str("wss://ws-testnet.gate.com/v4/ws/options/btc".to_string()));
m
}));
m
}));
m
}));
m.insert("options".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("tradesLimit".to_string(), Value::Int(1000));
m.insert("OHLCVLimit".to_string(), Value::Int(1000));
m.insert("watchTradesSubscriptions".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
m.insert("watchTickerSubscriptions".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
m.insert("watchOrderBookSubscriptions".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
m.insert("watchTicker".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("name".to_string(), Value::Str("tickers".to_string()));
m
}));
m.insert("watchOrderBook".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("snapshotDelay".to_string(), Value::Int(10));
m.insert("snapshotMaxRetries".to_string(), Value::Int(3));
m.insert("checksum".to_string(), Value::Bool(true));
m
}));
m.insert("watchBalance".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("settle".to_string(), Value::Str("usdt".to_string()));
m.insert("spot".to_string(), Value::Str("spot.balances".to_string()));
m
}));
m.insert("watchPositions".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("fetchPositionsSnapshot".to_string(), Value::Bool(true));
m.insert("awaitPositionsSnapshot".to_string(), Value::Bool(true));
m
}));
m
}));
m.insert("exceptions".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("ws".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("exact".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("1".to_string(), Value::Str("BadRequest".to_string()).clone());
m.insert("2".to_string(), Value::Str("BadRequest".to_string()).clone());
m.insert("4".to_string(), Value::Str("AuthenticationError".to_string()).clone());
m.insert("6".to_string(), Value::Str("AuthenticationError".to_string()).clone());
m.insert("11".to_string(), Value::Str("AuthenticationError".to_string()).clone());
m
}));
m.insert("broad".to_string(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
m
}));
m
}));
m
});
Value::Null
}
pub async fn create_order_ws(&mut self, mut symbol: Value, mut type_var: Value, mut side: Value, mut amount: Value, optional_args: &[Value]) -> Value {
let mut price = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_place".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
add_element_to_object(&mut params, &Value::Str("textIsRequired".to_string()), Value::Bool(true));
let mut request: Value = self.parent.create_order_request(symbol.clone(), type_var.clone(), side.clone(), amount.clone(), &[price.clone(), params.clone()]);
self.authenticate(url.clone(), messageType.clone()).await;
let mut rawOrder: Value = self.request_private(url.clone(), request.clone(), channel.clone(), &[]).await;
let mut order: Value = self.parse_order(rawOrder.clone(), &[market.clone()]);
return order;
Value::Null
}
pub async fn create_orders_ws(&mut self, mut orders: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut request: Value = self.parent.create_orders_request(orders.clone(), &[params.clone()]);
let mut firstOrder: Value = get_value(&orders, &Value::Int(0));
let mut market: Value = self.market(get_value(&firstOrder, &Value::Str("symbol".to_string())));
if !is_equal(&get_value(&market, &Value::Str("swap".to_string())), &Value::Bool(true)) {
panic!("{}", crate::exchange_errors::not_supported(add(&self.id, &Value::Str(" createOrdersWs is not supported for swap markets".to_string()))));
}
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_batch_place".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
self.authenticate(url.clone(), messageType.clone()).await;
let mut rawOrders: Value = self.request_private(url.clone(), request.clone(), channel.clone(), &[]).await;
return self.parse_orders(rawOrders.clone(), &[market.clone()]);
Value::Null
}
pub async fn cancel_all_orders_ws(&mut self, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&symbol, &Value::Null) {
panic!("{}", crate::exchange_errors::arguments_required(add(&self.id, &Value::Str(" cancelAllOrdersWs() requires a symbol argument".to_string()))));
}
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = ternary(is_true(&(is_equal(&symbol, &Value::Null))), Value::Null, self.market(symbol.clone()));
let mut trigger: Value = self.safe_bool2(params.clone(), Value::Str("stop".to_string()), Value::Str("trigger".to_string()), &[]);
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_cancel_cp".to_string()));
{ let __destr_tmp = self.handle_option_and_params(params.clone(), Value::Str("cancelAllOrdersWs".to_string()), Value::Str("channel".to_string()), &[channel.clone()]); channel = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
let mut url: Value = self.get_url_by_market(market.clone());
params = self.omit(params.clone(), Value::List(vec![Value::Str("stop".to_string()), Value::Str("trigger".to_string())]), &[]);
let mut type_varqueryVariable = self.handle_market_type_and_params(Value::Str("cancelAllOrders".to_string()), &[market.clone(), params.clone()]);
let mut type_var: Value = get_value(&type_varqueryVariable, &Value::Int(0));
let mut query: Value = get_value(&type_varqueryVariable, &Value::Int(1));
let mut requestrequestParamsVariable = ternary(is_true(&(is_equal(&type_var, &Value::Str("spot".to_string())))), self.parent.multi_order_spot_prepare_request(&[market.clone(), trigger.clone(), query.clone()]), self.parent.prepare_request(&[market.clone(), type_var.clone(), query.clone()]));
let mut request: Value = get_value(&requestrequestParamsVariable, &Value::Int(0));
let mut requestParams: Value = get_value(&requestrequestParamsVariable, &Value::Int(1));
self.authenticate(url.clone(), messageType.clone()).await;
let __ws_arg_0 = self.extend(request.clone(), &[requestParams.clone()]);
let mut rawOrders: Value = self.request_private(url.clone(), __ws_arg_0, channel.clone(), &[]).await;
return self.parse_orders(rawOrders.clone(), &[market.clone()]);
Value::Null
}
pub async fn cancel_order_ws(&mut self, mut id: Value, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = ternary(is_true(&(is_equal(&symbol, &Value::Null))), Value::Null, self.market(symbol.clone()));
let mut trigger: Value = self.safe_value_n(params.clone(), Value::List(vec![Value::Str("is_stop_order".to_string()), Value::Str("stop".to_string()), Value::Str("trigger".to_string())]), &[Value::Bool(false)]);
params = self.omit(params.clone(), Value::List(vec![Value::Str("is_stop_order".to_string()), Value::Str("stop".to_string()), Value::Str("trigger".to_string())]), &[]);
let mut type_varqueryVariable = self.handle_market_type_and_params(Value::Str("cancelOrder".to_string()), &[market.clone(), params.clone()]);
let mut type_var: Value = get_value(&type_varqueryVariable, &Value::Int(0));
let mut query: Value = get_value(&type_varqueryVariable, &Value::Int(1));
let mut requestrequestParamsVariable = ternary(is_true(&(is_equal(&type_var, &Value::Str("spot".to_string())) || is_equal(&type_var, &Value::Str("margin".to_string())))), self.parent.spot_order_prepare_request(&[market.clone(), trigger.clone(), query.clone()]), self.parent.prepare_request(&[market.clone(), type_var.clone(), query.clone()]));
let mut request: Value = get_value(&requestrequestParamsVariable, &Value::Int(0));
let mut requestParams: Value = get_value(&requestrequestParamsVariable, &Value::Int(1));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_cancel".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
self.authenticate(url.clone(), messageType.clone()).await;
add_element_to_object(&mut request, &Value::Str("order_id".to_string()), to_string_val(&id));
let __ws_arg_1 = self.extend(request.clone(), &[requestParams.clone()]);
let mut res: Value = self.request_private(url.clone(), __ws_arg_1, channel.clone(), &[]).await;
return self.parse_order(res.clone(), &[market.clone()]);
Value::Null
}
pub async fn edit_order_ws(&mut self, mut id: Value, mut symbol: Value, mut type_var: Value, mut side: Value, optional_args: &[Value]) -> Value {
let mut amount = get_arg(optional_args, 0, Value::Null);
let mut price = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
let mut extendedRequest: Value = self.parent.edit_order_request(id.clone(), symbol.clone(), type_var.clone(), side.clone(), &[amount.clone(), price.clone(), params.clone()]);
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_amend".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
self.authenticate(url.clone(), messageType.clone()).await;
let mut rawOrder: Value = self.request_private(url.clone(), extendedRequest.clone(), channel.clone(), &[]).await;
return self.parse_order(rawOrder.clone(), &[market.clone()]);
Value::Null
}
pub async fn fetch_order_ws(&mut self, mut id: Value, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = ternary(is_true(&(is_equal(&symbol, &Value::Null))), Value::Null, self.market(symbol.clone()));
let mut requestrequestParamsVariable = self.parent.fetch_order_request(id.clone(), &[symbol.clone(), params.clone()]);
let mut request: Value = get_value(&requestrequestParamsVariable, &Value::Int(0));
let mut requestParams: Value = get_value(&requestrequestParamsVariable, &Value::Int(1));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_status".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
self.authenticate(url.clone(), messageType.clone()).await;
let __ws_arg_2 = self.extend(request.clone(), &[requestParams.clone()]);
let mut rawOrder: Value = self.request_private(url.clone(), __ws_arg_2, channel.clone(), &[]).await;
return self.parse_order(rawOrder.clone(), &[market.clone()]);
Value::Null
}
pub async fn fetch_open_orders_ws(&mut self, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
return self.fetch_orders_by_status_ws(Value::Str("open".to_string()), &[symbol.clone(), since.clone(), limit.clone(), params.clone()]).await;
Value::Null
}
pub async fn fetch_closed_orders_ws(&mut self, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
return self.fetch_orders_by_status_ws(Value::Str("finished".to_string()), &[symbol.clone(), since.clone(), limit.clone(), params.clone()]).await;
Value::Null
}
pub async fn fetch_orders_by_status_ws(&mut self, mut status: Value, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = Value::Null;
if !is_equal(&symbol, &Value::Null) {
market = self.market(symbol.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
if !is_equal(&get_value(&market, &Value::Str("swap".to_string())), &Value::Bool(true)) {
panic!("{}", crate::exchange_errors::not_supported(add(&self.id, &Value::Str(" fetchOrdersByStatusWs is only supported by swap markets. Use rest API for other markets".to_string()))));
}
}
let mut requestrequestParamsVariable = self.parent.prepare_orders_by_status_request(status.clone(), &[symbol.clone(), since.clone(), limit.clone(), params.clone()]);
let mut request: Value = get_value(&requestrequestParamsVariable, &Value::Int(0));
let mut requestParams: Value = get_value(&requestrequestParamsVariable, &Value::Int(1));
let mut newRequest: Value = self.omit(request.clone(), Value::List(vec![Value::Str("settle".to_string())]), &[]);
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".order_list".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
self.authenticate(url.clone(), messageType.clone()).await;
let __ws_arg_3 = self.extend(newRequest.clone(), &[requestParams.clone()]);
let mut rawOrders: Value = self.request_private(url.clone(), __ws_arg_3, channel.clone(), &[]).await;
let mut orders: Value = self.parse_orders(rawOrders.clone(), &[market.clone()]);
return self.filter_by_symbol_since_limit(orders.clone(), &[symbol.clone(), since.clone(), limit.clone()]);
Value::Null
}
pub async fn watch_order_book(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut limit = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
let mut marketId: Value = get_value(&market, &Value::Str("id".to_string()));
let mut url: Value = self.get_url_by_market(market.clone());
let mut isEuUrl: bool = is_greater_than_or_equal(&get_index_of(&url, &Value::Str("gateeu".to_string())), &Value::Int(0));
let mut isNonEuSpot: bool = is_true(&(is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)))) && !is_true(&isEuUrl);
let mut intervalDefault: Value = ternary(is_true(&isNonEuSpot), Value::Str("50".to_string()), Value::Str("100ms".to_string()));
let mut intervalqueryVariable = self.handle_option_and_params(params.clone(), Value::Str("watchOrderBook".to_string()), Value::Str("interval".to_string()), &[intervalDefault.clone()]);
let mut interval: Value = get_value(&intervalqueryVariable, &Value::Int(0));
let mut query: Value = get_value(&intervalqueryVariable, &Value::Int(1));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut messageHash: Value = add(&add(&Value::Str("orderbook".to_string()), &Value::Str(":".to_string())), &symbol);
if is_equal(&limit, &Value::Null) {
limit = ternary(is_true(&(is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)))), Value::Int(50), Value::Int(100)); if is_equal(&messageType, &Value::Str("options".to_string())) {
limit = Value::Int(50); }
}
let mut payload: Value = Value::List(vec![]);
let mut channel: Value = Value::Str("".to_string());
if is_true(&isEuUrl) {
channel = Value::Str("spot.order_book_update".to_string());
payload = Value::List(vec![marketId.clone(), interval.clone()]);
} else if is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)) {
channel = Value::Str("spot.obu".to_string());
let mut finalInterval: Value = interval.clone();
if is_equal(&limit, &Value::Int(400)) {
finalInterval = Value::Str("400".to_string());
}
payload = Value::List(vec![add(&add(&add(&Value::Str("ob.".to_string()), &get_value(&market, &Value::Str("id".to_string()))), &Value::Str(".".to_string())), &finalInterval)]);
} else {
channel = add(&messageType, &Value::Str(".order_book_update".to_string()));
payload = Value::List(vec![marketId.clone(), interval.clone()]);
let mut stringLimit: Value = to_string_val(&limit);
append_to_array(&mut payload, stringLimit.clone());
}
let mut subscription: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("symbol".to_string(), symbol.clone());
m.insert("limit".to_string(), limit.clone());
m
});
let mut orderbook: Value = self.subscribe_public(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), &[query.clone(), subscription.clone()]).await;
return orderbook.limit();
Value::Null
}
pub async fn un_watch_order_book(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
let mut url: Value = self.get_url_by_market(market.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
let mut marketId: Value = get_value(&market, &Value::Str("id".to_string()));
let mut isEuUrl: bool = is_greater_than_or_equal(&get_index_of(&url, &Value::Str("gateeu".to_string())), &Value::Int(0));
let mut isNonEuSpot: bool = is_true(&(is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)))) && !is_true(&isEuUrl);
let mut intervalDefault: Value = ternary(is_true(&isNonEuSpot), Value::Str("50".to_string()), Value::Str("100ms".to_string()));
let mut interval: Value = intervalDefault.clone();
{ let __destr_tmp = self.handle_option_and_params(params.clone(), Value::Str("watchOrderBook".to_string()), Value::Str("interval".to_string()), &[interval.clone()]); interval = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut limit: Value = self.safe_integer_k(params.clone(), "limit", &[]);
if is_equal(&limit, &Value::Null) {
limit = ternary(is_true(&(is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)))), Value::Int(50), Value::Int(100)); if is_equal(&messageType, &Value::Str("options".to_string())) {
limit = Value::Int(50); }
}
let mut payload: Value = Value::List(vec![]);
let mut channel: Value = Value::Str("".to_string());
if is_true(&isEuUrl) {
channel = Value::Str("spot.order_book_update".to_string());
payload = Value::List(vec![marketId.clone(), interval.clone()]);
} else if is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)) {
channel = Value::Str("spot.obu".to_string());
let mut finalInterval: Value = interval.clone();
if is_equal(&limit, &Value::Int(400)) {
finalInterval = Value::Str("400".to_string());
}
payload = Value::List(vec![add(&add(&add(&Value::Str("ob.".to_string()), &get_value(&market, &Value::Str("id".to_string()))), &Value::Str(".".to_string())), &finalInterval)]);
} else {
channel = add(&messageType, &Value::Str(".order_book_update".to_string()));
payload = Value::List(vec![marketId.clone(), interval.clone()]);
let mut stringLimit: Value = to_string_val(&limit);
append_to_array(&mut payload, stringLimit.clone());
}
let mut subMessageHash: Value = add(&add(&Value::Str("orderbook".to_string()), &Value::Str(":".to_string())), &symbol);
let mut messageHash: Value = add(&add(&Value::Str("unsubscribe:orderbook".to_string()), &Value::Str(":".to_string())), &symbol);
return self.un_subscribe_public_multiple(url.clone(), Value::Str("orderbook".to_string()), Value::List(vec![symbol.clone()]), Value::List(vec![messageHash.clone()]), Value::List(vec![subMessageHash.clone()]), payload.clone(), channel.clone(), &[params.clone()]).await;
Value::Null
}
pub fn handle_order_book_subscription(&mut self, mut client: Value, mut message: Value, mut subscription: Value) {
let mut symbol: Value = self.safe_string_k(subscription.clone(), "symbol", &[]);
let mut limit: Value = self.safe_integer_k(subscription.clone(), "limit", &[]);
if !is_equal(&symbol, &Value::Null) {
{ let __be_tmp = self.order_book(&[Value::Map({
let mut m = indexmap::IndexMap::new();
m
}), limit.clone()]); add_element_to_object(&mut self.orderbooks, &symbol, __be_tmp); };
}
}
pub fn handle_new_spot_order_book(&mut self, mut client: Value, mut message: Value) {
let mut result: Value = self.safe_dict_k(message.clone(), "result", &[Value::Map({
let mut m = indexmap::IndexMap::new();
m
})]);
let mut full: Value = self.safe_bool_k(result.clone(), "full", &[Value::Bool(false)]);
let mut marketIdWithPrefix: Value = self.safe_string_k(result.clone(), "s", &[]);
if is_equal(&marketIdWithPrefix, &Value::Null) {
return;
}
let mut marketIdParts: Value = split(&marketIdWithPrefix, &Value::Str(".".to_string()));
let mut marketId: Value = self.safe_string(marketIdParts.clone(), Value::Int(1), &[]);
let mut symbol: Value = self.safe_symbol(marketId.clone(), &[Value::Null, Value::Str("_".to_string()), Value::Str("spot".to_string())]);
let mut messageHash: Value = add(&Value::Str("orderbook:".to_string()), &symbol);
if is_equal(&self.safe_value(self.orderbooks.clone(), symbol.clone(), &[]), &Value::Null) {
{ let __be_tmp = self.order_book(&[Value::Map({
let mut m = indexmap::IndexMap::new();
m
}), Value::Int(1000)]); add_element_to_object(&mut self.orderbooks, &symbol, __be_tmp); };
}
let mut orderbook: Value = get_value(&self.orderbooks, &symbol);
if is_equal(&full, &Value::Bool(true)) {
let mut snapshopt: Value = self.parse_order_book(result.clone(), symbol.clone(), &[Value::Null, Value::Str("b".to_string()), Value::Str("a".to_string())]);
add_element_to_object(&mut snapshopt, &Value::Str("nonce".to_string()), self.safe_integer_k(result.clone(), "u", &[]));
add_element_to_object(&mut snapshopt, &Value::Str("timestamp".to_string()), self.safe_integer_k(result.clone(), "t", &[]));
orderbook.reset(snapshopt.clone());
} else {
let mut nonce: Value = self.safe_integer_k(orderbook.clone(), "nonce", &[]);
let mut deltaStart: Value = self.safe_integer_k(result.clone(), "u", &[]);
if is_true(&(is_equal(&nonce, &Value::Null))) || is_true(&(is_true(&(!is_equal(&deltaStart, &Value::Null))) && is_true(&(is_greater_than_or_equal(&nonce, &deltaStart))))) {
return;
}
self.handle_delta(orderbook.clone(), result.clone());
}
client.resolve(&[orderbook.clone(), messageHash.clone()]);
}
pub fn handle_order_book(&mut self, mut client: Value, mut message: Value) {
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
if is_equal(&channel, &Value::Str("spot.obu".to_string())) {
self.handle_new_spot_order_book(client.clone(), message.clone());
return;
}
let mut channelParts: Value = split(&channel, &Value::Str(".".to_string()));
let mut rawMarketType: Value = self.safe_string(channelParts.clone(), Value::Int(0), &[]);
let mut isSpot: bool = is_equal(&rawMarketType, &Value::Str("spot".to_string()));
let mut marketType: Value = ternary(is_true(&isSpot), Value::Str("spot".to_string()), Value::Str("contract".to_string()));
let mut delta: Value = self.safe_value_k(message.clone(), "result", &[]);
let mut deltaStart: Value = self.safe_integer_k(delta.clone(), "U", &[]);
let mut deltaEnd: Value = self.safe_integer_k(delta.clone(), "u", &[]);
let mut marketId: Value = self.safe_string_k(delta.clone(), "s", &[]);
let mut symbol: Value = self.safe_symbol(marketId.clone(), &[Value::Null, Value::Str("_".to_string()), marketType.clone()]);
let mut messageHash: Value = add(&Value::Str("orderbook:".to_string()), &symbol);
let mut storedOrderBook: Value = self.safe_value(self.orderbooks.clone(), symbol.clone(), &[self.order_book(&[Value::Map({
let mut m = indexmap::IndexMap::new();
m
})])]);
let mut nonce: Value = self.safe_integer_k(storedOrderBook.clone(), "nonce", &[]);
if is_equal(&nonce, &Value::Null) {
let mut cacheLength: Value = Value::Int(0);
if !is_equal(&storedOrderBook, &Value::Null) {
cacheLength = get_array_length(&get_value(&storedOrderBook, &Value::Str("cache".to_string())));
}
let mut snapshotDelay: Value = self.handle_option(Value::Str("watchOrderBook".to_string()), Value::Str("snapshotDelay".to_string()), &[Value::Int(10)]);
let mut waitAmount: Value = ternary(is_true(&isSpot), snapshotDelay.clone(), Value::Int(0));
if is_equal(&cacheLength, &waitAmount) {
let mut subscription: Value = get_value(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash);
let mut limit: Value = self.safe_integer_k(subscription.clone(), "limit", &[]);
self.spawn(&[Value::Str("load_order_book".to_string()).clone(), client.clone(), messageHash.clone(), symbol.clone(), limit.clone(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
})]); }
crate::runtime::append_to_object_array(&mut storedOrderBook, &Value::Str("cache".to_string()), delta.clone());
return;
} else if is_true(&(!is_equal(&deltaEnd, &Value::Null))) && is_true(&(is_greater_than_or_equal(&nonce, &deltaEnd))) {
return;
} else if is_true(&(!is_equal(&deltaStart, &Value::Null))) && is_true(&(is_greater_than_or_equal(&nonce, &subtract(&deltaStart, &Value::Int(1))))) {
self.handle_delta(storedOrderBook.clone(), delta.clone());
} else {
remove(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash);
remove(&mut self.orderbooks, &symbol);
let mut checksum: Value = self.handle_option(Value::Str("watchOrderBook".to_string()), Value::Str("checksum".to_string()), &[Value::Bool(true)]);
if is_equal(&checksum, &Value::Bool(true)) {
let mut error = Value::from(crate::exchange_errors::checksum_error(add(&add(&self.id, &Value::Str(" ".to_string())), &self.orderbook_checksum_message(symbol.clone()))));
client.reject(&[Value::from(error.clone()), messageHash.clone()]);
}
}
client.resolve(&[storedOrderBook.clone(), messageHash.clone()]);
}
pub fn get_cache_index(&self, mut orderBook: Value, mut cache: Value) -> Value {
let mut nonce: Value = self.safe_integer_k(orderBook.clone(), "nonce", &[]);
let mut firstDelta: Value = get_value(&cache, &Value::Int(0));
let mut firstDeltaStart: Value = self.safe_integer_k(firstDelta.clone(), "U", &[]);
if is_true(&(!is_equal(&nonce, &Value::Null))) && is_true(&(!is_equal(&firstDeltaStart, &Value::Null))) && is_true(&(is_less_than(&nonce, &firstDeltaStart))) {
return negate(&Value::Int(1));
}
{
let mut i: Value = Value::Int(0);
let mut __for_first_332: bool = true;
while { if !__for_first_332 { i = add(&i, &Value::Int(1)); } __for_first_332 = false; is_less_than(&i, &get_array_length(&cache)) } {
let mut delta: Value = get_value(&cache, &i);
let mut delta: Value = get_value(&cache, &i);
let mut deltaStart: Value = self.safe_integer_k(delta.clone(), "U", &[]);
let mut deltaEnd: Value = self.safe_integer_k(delta.clone(), "u", &[]);
if is_true(&(!is_equal(&nonce, &Value::Null))) && is_true(&(!is_equal(&deltaStart, &Value::Null))) && is_true(&(!is_equal(&deltaEnd, &Value::Null))) && is_true(&(is_greater_than_or_equal(&nonce, &subtract(&deltaStart, &Value::Int(1))))) && is_true(&(is_less_than(&nonce, &deltaEnd))) {
return i;
}
}
}
return get_array_length(&cache);
Value::Null
}
pub fn handle_bid_asks(&self, mut bookSide: Value, mut bidAsks: Value) {
{
let mut i: Value = Value::Int(0);
let mut __for_first_333: bool = true;
while { if !__for_first_333 { i = add(&i, &Value::Int(1)); } __for_first_333 = false; is_less_than(&i, &get_array_length(&bidAsks)) } {
let mut bidAsk: Value = get_value(&bidAsks, &i);
let mut bidAsk: Value = get_value(&bidAsks, &i);
if is_true(&Value::Bool(is_array(&bidAsk))) {
bookSide.store_array(self.parse_order_book_bid_ask(bidAsk.clone(), &[]));
} else {
let mut price: Value = self.safe_float_k(bidAsk.clone(), "p", &[]);
let mut amount: Value = self.safe_float_k(bidAsk.clone(), "s", &[]);
bookSide.store(price.clone(), amount.clone());
}
}
}
}
pub fn handle_delta(&self, mut orderbook: Value, mut delta: Value) {
let mut timestamp: Value = self.safe_integer_k(delta.clone(), "t", &[]);
add_element_to_object(&mut orderbook, &Value::Str("timestamp".to_string()), timestamp.clone());
add_element_to_object(&mut orderbook, &Value::Str("datetime".to_string()), self.iso8601(timestamp.clone()));
add_element_to_object(&mut orderbook, &Value::Str("nonce".to_string()), self.safe_integer_k(delta.clone(), "u", &[]));
let mut bids: Value = self.safe_value_k(delta.clone(), "b", &[Value::List(vec![])]);
let mut asks: Value = self.safe_value_k(delta.clone(), "a", &[Value::List(vec![])]);
let mut storedBids: Value = get_value(&orderbook, &Value::Str("bids".to_string()));
let mut storedAsks: Value = get_value(&orderbook, &Value::Str("asks".to_string()));
self.handle_bid_asks(storedBids.clone(), bids.clone());
self.handle_bid_asks(storedAsks.clone(), asks.clone());
}
pub async fn watch_ticker(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
add_element_to_object(&mut params, &Value::Str("callerMethodName".to_string()), Value::Str("watchTicker".to_string()));
let mut result: Value = self.watch_tickers(&[Value::List(vec![symbol.clone()]), params.clone()]).await;
return self.safe_value(result.clone(), symbol.clone(), &[]);
Value::Null
}
pub async fn watch_tickers(&mut self, optional_args: &[Value]) -> Value {
let mut symbols = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
let __ws_arg_4 = self.extend(Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("method".to_string(), Value::Str("tickers".to_string()));
m
}), &[params.clone()]);
return self.subscribe_watch_tickers_and_bids_asks(&[symbols.clone(), Value::Str("watchTickers".to_string()), __ws_arg_4]).await;
Value::Null
}
pub fn handle_ticker(&mut self, mut client: Value, mut message: Value) {
self.handle_ticker_and_bid_ask(Value::Str("ticker".to_string()), client.clone(), message.clone());
}
pub async fn watch_bids_asks(&mut self, optional_args: &[Value]) -> Value {
let mut symbols = get_arg(optional_args, 0, Value::Null);
let mut params = get_arg(optional_args, 1, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
let __ws_arg_5 = self.extend(Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("method".to_string(), Value::Str("book_ticker".to_string()));
m
}), &[params.clone()]);
return self.subscribe_watch_tickers_and_bids_asks(&[symbols.clone(), Value::Str("watchBidsAsks".to_string()), __ws_arg_5]).await;
Value::Null
}
pub fn handle_bid_ask(&mut self, mut client: Value, mut message: Value) {
self.handle_ticker_and_bid_ask(Value::Str("bidask".to_string()), client.clone(), message.clone());
}
pub async fn subscribe_watch_tickers_and_bids_asks(&mut self, optional_args: &[Value]) -> Value {
let mut symbols = get_arg(optional_args, 0, Value::Null);
let mut callerMethodName = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
{ let __destr_tmp = self.handle_param_string(params.clone(), Value::Str("callerMethodName".to_string()), &[callerMethodName.clone()]); callerMethodName = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
symbols = self.market_symbols(&[symbols.clone(), Value::Null, Value::Bool(false)]);
let mut market: Value = self.market(get_value(&symbols, &Value::Int(0)));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut marketIds: Value = self.market_ids(&[symbols.clone()]);
let mut channelName: Value = Value::Null;
{ let __destr_tmp = self.handle_option_and_params(params.clone(), callerMethodName.clone(), Value::Str("method".to_string()), &[]); channelName = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
let mut url: Value = self.get_url_by_market(market.clone());
let mut channel: Value = add(&add(&messageType, &Value::Str(".".to_string())), &channelName);
if is_equal(&callerMethodName, &Value::Null) {
panic!("{}", crate::exchange_errors::arguments_required(add(&self.id, &Value::Str(" requires a callerMethodName argument".to_string()))));
}
let mut isWatchTickers: bool = is_greater_than_or_equal(&get_index_of(&callerMethodName, &Value::Str("watchTicker".to_string())), &Value::Int(0));
let mut prefix: Value = ternary(is_true(&isWatchTickers), Value::Str("ticker".to_string()), Value::Str("bidask".to_string()));
let mut messageHashes: Value = Value::List(vec![]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_334: bool = true;
while { if !__for_first_334 { i = add(&i, &Value::Int(1)); } __for_first_334 = false; is_less_than(&i, &get_array_length(&symbols)) } {
let mut symbol: Value = get_value(&symbols, &i);
let mut symbol: Value = get_value(&symbols, &i);
append_to_array(&mut messageHashes, add(&add(&prefix, &Value::Str(":".to_string())), &symbol));
}
}
let mut tickerOrBidAsk: Value = self.subscribe_public_multiple(url.clone(), messageHashes.clone(), marketIds.clone(), channel.clone(), &[params.clone()]).await;
if is_true(&self.newUpdates) {
let mut items: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
add_element_to_object(&mut items, &get_value(&tickerOrBidAsk, &Value::Str("symbol".to_string())), tickerOrBidAsk.clone());
return items;
}
let mut result: Value = ternary(is_true(&isWatchTickers), self.tickers.clone(), self.bidsasks.clone());
return self.filter_by_array(result.clone(), Value::Str("symbol".to_string()), &[symbols.clone(), Value::Bool(true)]);
Value::Null
}
pub fn handle_ticker_and_bid_ask(&mut self, mut objectName: Value, mut client: Value, mut message: Value) {
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
let mut parts: Value = split(&channel, &Value::Str(".".to_string()));
let mut rawMarketType: Value = self.safe_string(parts.clone(), Value::Int(0), &[]);
let mut marketType: Value = ternary(is_true(&(is_equal(&rawMarketType, &Value::Str("futures".to_string())))), Value::Str("contract".to_string()), Value::Str("spot".to_string()));
let mut result: Value = self.safe_value_k(message.clone(), "result", &[]);
let mut results: Value = Value::List(vec![]);
if is_true(&Value::Bool(is_array(&result))) {
results = self.safe_list_k(message.clone(), "result", &[Value::List(vec![])]);
} else {
let mut rawTicker: Value = self.safe_dict_k(message.clone(), "result", &[Value::Map({
let mut m = indexmap::IndexMap::new();
m
})]);
results = Value::List(vec![rawTicker.clone()]);
}
let mut isTicker: bool = is_equal(&objectName, &Value::Str("ticker".to_string())); {
let mut i: Value = Value::Int(0);
let mut __for_first_335: bool = true;
while { if !__for_first_335 { i = add(&i, &Value::Int(1)); } __for_first_335 = false; is_less_than(&i, &get_array_length(&results)) } {
let mut rawTicker: Value = get_value(&results, &i);
let mut rawTicker: Value = get_value(&results, &i);
let mut marketId: Value = self.safe_string_k(rawTicker.clone(), "s", &[]);
let mut market: Value = self.safe_market(&[marketId.clone(), Value::Null, Value::Str("_".to_string()), marketType.clone()]);
let mut parsedItem: Value = self.parse_ticker(rawTicker.clone(), &[market.clone()]);
let mut symbol: Value = get_value(&parsedItem, &Value::Str("symbol".to_string()));
if is_true(&isTicker) {
if !is_equal(&symbol, &Value::Null) {
add_element_to_object(&mut self.tickers, &symbol, parsedItem.clone());
}
} else {
if !is_equal(&symbol, &Value::Null) {
add_element_to_object(&mut self.bidsasks, &symbol, parsedItem.clone());
}
}
let mut messageHash: Value = add(&add(&objectName, &Value::Str(":".to_string())), &symbol);
client.resolve(&[parsedItem.clone(), messageHash.clone()]);
}
}
}
pub async fn watch_trades(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut since = get_arg(optional_args, 0, Value::Null);
let mut limit = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
return self.watch_trades_for_symbols(Value::List(vec![symbol.clone()]), &[since.clone(), limit.clone(), params.clone()]).await;
Value::Null
}
pub async fn watch_trades_for_symbols(&mut self, mut symbols: Value, optional_args: &[Value]) -> Value {
let mut since = get_arg(optional_args, 0, Value::Null);
let mut limit = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
symbols = self.market_symbols(&[symbols.clone()]);
let mut marketIds: Value = self.market_ids(&[symbols.clone()]);
let mut market: Value = self.market(get_value(&symbols, &Value::Int(0)));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".trades".to_string()));
let mut messageHashes: Value = Value::List(vec![]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_336: bool = true;
while { if !__for_first_336 { i = add(&i, &Value::Int(1)); } __for_first_336 = false; is_less_than(&i, &get_array_length(&symbols)) } {
let mut symbol: Value = get_value(&symbols, &i);
let mut symbol: Value = get_value(&symbols, &i);
append_to_array(&mut messageHashes, add(&Value::Str("trades:".to_string()), &symbol));
}
}
let mut url: Value = self.get_url_by_market(market.clone());
let mut trades: Value = self.subscribe_public_multiple(url.clone(), messageHashes.clone(), marketIds.clone(), channel.clone(), &[params.clone()]).await;
if is_true(&self.newUpdates) {
let mut first: Value = self.safe_value(trades.clone(), Value::Int(0), &[]);
let mut tradeSymbol: Value = self.safe_string_k(first.clone(), "symbol", &[]);
limit = trades.get_limit(tradeSymbol.clone(), limit.clone());
}
return self.filter_by_since_limit(trades.clone(), &[since.clone(), limit.clone(), Value::Str("timestamp".to_string()), Value::Bool(true)]);
Value::Null
}
pub async fn un_watch_trades_for_symbols(&mut self, mut symbols: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
symbols = self.market_symbols(&[symbols.clone()]);
let mut marketIds: Value = self.market_ids(&[symbols.clone()]);
let mut market: Value = self.market(get_value(&symbols, &Value::Int(0)));
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".trades".to_string()));
let mut subMessageHashes: Value = Value::List(vec![]);
let mut messageHashes: Value = Value::List(vec![]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_337: bool = true;
while { if !__for_first_337 { i = add(&i, &Value::Int(1)); } __for_first_337 = false; is_less_than(&i, &get_array_length(&symbols)) } {
let mut symbol: Value = get_value(&symbols, &i);
let mut symbol: Value = get_value(&symbols, &i);
append_to_array(&mut subMessageHashes, add(&Value::Str("trades:".to_string()), &symbol));
append_to_array(&mut messageHashes, add(&Value::Str("unsubscribe:trades:".to_string()), &symbol));
}
}
let mut url: Value = self.get_url_by_market(market.clone());
return self.un_subscribe_public_multiple(url.clone(), Value::Str("trades".to_string()), symbols.clone(), messageHashes.clone(), subMessageHashes.clone(), marketIds.clone(), channel.clone(), &[params.clone()]).await;
Value::Null
}
pub async fn un_watch_trades(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
return self.un_watch_trades_for_symbols(Value::List(vec![symbol.clone()]), &[params.clone()]).await;
Value::Null
}
pub fn handle_trades(&mut self, mut client: Value, mut message: Value) {
let mut result: Value = self.safe_value_k(message.clone(), "result", &[]);
if !is_true(&Value::Bool(is_array(&result))) {
result = Value::List(vec![result.clone()]);
}
let mut parsedTrades: Value = self.parse_trades(result.clone(), &[]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_338: bool = true;
while { if !__for_first_338 { i = add(&i, &Value::Int(1)); } __for_first_338 = false; is_less_than(&i, &get_array_length(&parsedTrades)) } {
let mut trade: Value = get_value(&parsedTrades, &i);
let mut trade: Value = get_value(&parsedTrades, &i);
let mut symbol: Value = get_value(&trade, &Value::Str("symbol".to_string()));
let mut cachedTrades: Value = self.safe_value(self.trades.clone(), symbol.clone(), &[]);
if is_equal(&cachedTrades, &Value::Null) {
let mut limit: Value = self.safe_integer_k(self.options.clone(), "tradesLimit", &[Value::Int(1000)]);
cachedTrades = ArrayCache::new(limit.clone());
if !is_equal(&symbol, &Value::Null) {
add_element_to_object(&mut self.trades, &symbol, cachedTrades.clone());
}
}
cachedTrades.append(trade.clone());
let mut hash: Value = add(&Value::Str("trades:".to_string()), &symbol);
client.resolve(&[cachedTrades.clone(), hash.clone()]);
}
}
}
pub async fn watch_ohlcv(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut timeframe = get_arg(optional_args, 0, Value::Str("1m".to_string()));
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = self.market(symbol.clone());
symbol = get_value(&market, &Value::Str("symbol".to_string()));
let mut marketId: Value = get_value(&market, &Value::Str("id".to_string()));
let mut interval: Value = self.safe_string(self.timeframes.clone(), timeframe.clone(), &[timeframe.clone()]);
let mut messageType: Value = self.get_type_by_market(market.clone());
let mut channel: Value = add(&messageType, &Value::Str(".candlesticks".to_string()));
let mut messageHash: Value = add(&add(&add(&Value::Str("candles:".to_string()), &interval), &Value::Str(":".to_string())), &get_value(&market, &Value::Str("symbol".to_string())));
let mut url: Value = self.get_url_by_market(market.clone());
let mut payload: Value = Value::List(vec![interval.clone(), marketId.clone()]);
let mut ohlcv: Value = self.subscribe_public(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), &[params.clone()]).await;
if is_true(&self.newUpdates) {
limit = ohlcv.get_limit(symbol.clone(), limit.clone());
}
return self.filter_by_since_limit(ohlcv.clone(), &[since.clone(), limit.clone(), Value::Int(0), Value::Bool(true)]);
Value::Null
}
pub fn handle_ohlcv(&mut self, mut client: Value, mut message: Value) {
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
let mut channelParts: Value = split(&channel, &Value::Str(".".to_string()));
let mut rawMarketType: Value = self.safe_string(channelParts.clone(), Value::Int(0), &[]);
let mut marketType: Value = ternary(is_true(&(is_equal(&rawMarketType, &Value::Str("spot".to_string())))), Value::Str("spot".to_string()), Value::Str("contract".to_string()));
let mut result: Value = self.safe_value_k(message.clone(), "result", &[]);
if !is_true(&Value::Bool(is_array(&result))) {
result = Value::List(vec![result.clone()]);
}
let mut marketIds: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
{
let mut i: Value = Value::Int(0);
let mut __for_first_339: bool = true;
while { if !__for_first_339 { i = add(&i, &Value::Int(1)); } __for_first_339 = false; is_less_than(&i, &get_array_length(&result)) } {
let mut ohlcv: Value = get_value(&result, &i);
let mut ohlcv: Value = get_value(&result, &i);
let mut subscription: Value = self.safe_string_k(ohlcv.clone(), "n", &[Value::Str("".to_string())]);
let mut parts: Value = split(&subscription, &Value::Str("_".to_string()));
let mut timeframeId: Value = self.safe_string(parts.clone(), Value::Int(0), &[]);
let mut timeframe: Value = self.find_timeframe(timeframeId.clone(), &[]);
let mut prefix: Value = add(&timeframe, &Value::Str("_".to_string()));
let mut marketId: Value = replace_str(&subscription, &prefix, &Value::Str("".to_string()));
let mut symbol: Value = self.safe_symbol(marketId.clone(), &[Value::Null, Value::Str("_".to_string()), marketType.clone()]);
let mut parsed: Value = self.parse_ohlcv(ohlcv.clone(), &[]);
{ let __be_tmp = self.safe_value(self.ohlcvs.clone(), symbol.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m
})]); add_element_to_object(&mut self.ohlcvs, &symbol, __be_tmp); };
let mut stored: Value = self.safe_value(self.safe_value(self.ohlcvs.clone(), symbol.clone(), &[]), timeframe.clone(), &[]);
if is_equal(&stored, &Value::Null) {
let mut limit: Value = self.safe_integer_k(self.options.clone(), "OHLCVLimit", &[Value::Int(1000)]);
stored = ArrayCacheByTimestamp::new(limit.clone());
if !is_equal(&symbol, &Value::Null) && !is_equal(&timeframe, &Value::Null) {
add_element_to_object(get_value_mut(unsafe { crate::runtime::coerce_value_to_mut(&self.ohlcvs) }, &symbol), &timeframe, stored.clone());
}
}
stored.append(parsed.clone());
add_element_to_object(&mut marketIds, &symbol, timeframe.clone());
}
}
let mut keys: Value = object_keys(&marketIds);
{
let mut i: Value = Value::Int(0);
let mut __for_first_340: bool = true;
while { if !__for_first_340 { i = add(&i, &Value::Int(1)); } __for_first_340 = false; is_less_than(&i, &get_array_length(&keys)) } {
let mut symbol: Value = get_value(&keys, &i);
let mut symbol: Value = get_value(&keys, &i);
let mut timeframe: Value = get_value(&marketIds, &symbol);
let mut timeframe: Value = get_value(&marketIds, &symbol);
let mut interval: Value = self.find_timeframe(timeframe.clone(), &[]);
let mut hash: Value = add(&add(&add(&add(&Value::Str("candles".to_string()), &Value::Str(":".to_string())), &interval), &Value::Str(":".to_string())), &symbol);
let mut stored: Value = self.safe_value(get_value(&self.ohlcvs, &symbol), interval.clone(), &[]);
client.resolve(&[stored.clone(), hash.clone()]);
}
}
}
pub async fn watch_my_trades(&mut self, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut subType: Value = Value::Null;
let mut type_var: Value = Value::Null;
let mut marketId: Value = add(&Value::Str("!".to_string()), &Value::Str("all".to_string()));
let mut market: Value = Value::Null;
if !is_equal(&symbol, &Value::Null) {
market = self.market(symbol.clone());
marketId = get_value(&market, &Value::Str("id".to_string()));
}
{ let __destr_tmp = self.handle_market_type_and_params(Value::Str("watchMyTrades".to_string()), &[market.clone(), params.clone()]); type_var = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
{ let __destr_tmp = self.handle_sub_type_and_params(Value::Str("watchMyTrades".to_string()), &[market.clone(), params.clone()]); subType = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
let mut messageType: Value = self.get_supported_mapping(type_var.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("spot".to_string(), Value::Str("spot".to_string()));
m.insert("margin".to_string(), Value::Str("spot".to_string()));
m.insert("future".to_string(), Value::Str("futures".to_string()));
m.insert("swap".to_string(), Value::Str("futures".to_string()));
m.insert("option".to_string(), Value::Str("options".to_string()));
m
})]);
let mut channel: Value = add(&messageType, &Value::Str(".usertrades".to_string()));
let mut messageHash: Value = Value::Str("myTrades".to_string());
if !is_equal(&symbol, &Value::Null) {
messageHash = add(&messageHash, &add(&Value::Str(":".to_string()), &symbol));
}
let mut isInverse: Value = Value::Bool(is_equal(&subType, &Value::Str("inverse".to_string())));
let mut url: Value = self.get_url_by_market_type(type_var.clone(), &[isInverse.clone()]);
let mut payload: Value = Value::List(vec![marketId.clone()]);
let mut requiresUid: Value = Value::Bool(!is_equal(&type_var, &Value::Str("spot".to_string())));
let mut trades: Value = self.subscribe_private(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), params.clone(), &[requiresUid.clone()]).await;
if is_true(&self.newUpdates) {
limit = trades.get_limit(symbol.clone(), limit.clone());
}
return self.filter_by_symbol_since_limit(trades.clone(), &[symbol.clone(), since.clone(), limit.clone(), Value::Bool(true)]);
Value::Null
}
pub fn handle_my_trades(&mut self, mut client: Value, mut message: Value) {
let mut result: Value = self.safe_value_k(message.clone(), "result", &[Value::List(vec![])]);
let mut tradesLength: Value = get_array_length(&result);
if is_equal(&tradesLength, &Value::Int(0)) {
return;
}
let mut cachedTrades: Value = self.myTrades.clone();
if is_equal(&cachedTrades, &Value::Null) {
let mut limit: Value = self.safe_integer_k(self.options.clone(), "tradesLimit", &[Value::Int(1000)]);
cachedTrades = ArrayCacheBySymbolById::new(limit.clone());
self.myTrades = cachedTrades.clone();
}
let mut parsed: Value = self.parse_trades(result.clone(), &[]);
let mut marketIds: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
{
let mut i: Value = Value::Int(0);
let mut __for_first_341: bool = true;
while { if !__for_first_341 { i = add(&i, &Value::Int(1)); } __for_first_341 = false; is_less_than(&i, &get_array_length(&parsed)) } {
let mut trade: Value = get_value(&parsed, &i);
let mut trade: Value = get_value(&parsed, &i);
cachedTrades.append(trade.clone());
let mut symbol: Value = get_value(&trade, &Value::Str("symbol".to_string()));
if !is_equal(&symbol, &Value::Null) {
add_element_to_object(&mut marketIds, &symbol, Value::Bool(true));
}
}
}
let mut keys: Value = object_keys(&marketIds);
{
let mut i: Value = Value::Int(0);
let mut __for_first_342: bool = true;
while { if !__for_first_342 { i = add(&i, &Value::Int(1)); } __for_first_342 = false; is_less_than(&i, &get_array_length(&keys)) } {
let mut market: Value = get_value(&keys, &i);
let mut market: Value = get_value(&keys, &i);
let mut hash: Value = add(&Value::Str("myTrades:".to_string()), &market);
client.resolve(&[cachedTrades.clone(), hash.clone()]);
}
}
client.resolve(&[cachedTrades.clone(), Value::Str("myTrades".to_string())]);
}
pub async fn watch_balance(&mut self, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut type_var: Value = Value::Null;
let mut subType: Value = Value::Null;
{ let __destr_tmp = self.handle_market_type_and_params(Value::Str("watchBalance".to_string()), &[Value::Null, params.clone()]); type_var = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
{ let __destr_tmp = self.handle_sub_type_and_params(Value::Str("watchBalance".to_string()), &[Value::Null, params.clone()]); subType = get_value(&__destr_tmp, &Value::Int(0)); params = get_value(&__destr_tmp, &Value::Int(1)); }
let mut isInverse: Value = Value::Bool(is_equal(&subType, &Value::Str("inverse".to_string())));
let mut url: Value = self.get_url_by_market_type(type_var.clone(), &[isInverse.clone()]);
let mut requiresUid: Value = Value::Bool(!is_equal(&type_var, &Value::Str("spot".to_string())));
let mut channelType: Value = self.get_supported_mapping(type_var.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("spot".to_string(), Value::Str("spot".to_string()));
m.insert("margin".to_string(), Value::Str("spot".to_string()));
m.insert("future".to_string(), Value::Str("futures".to_string()));
m.insert("swap".to_string(), Value::Str("futures".to_string()));
m.insert("option".to_string(), Value::Str("options".to_string()));
m
})]);
let mut channel: Value = add(&channelType, &Value::Str(".balances".to_string()));
let mut messageHash: Value = add(&type_var, &Value::Str(".balance".to_string()));
return self.subscribe_private(url.clone(), messageHash.clone(), Value::Null, channel.clone(), params.clone(), &[requiresUid.clone()]).await;
Value::Null
}
pub fn handle_balance(&mut self, mut client: Value, mut message: Value) {
let mut result: Value = self.safe_value_k(message.clone(), "result", &[Value::List(vec![])]);
add_element_to_object(&mut self.balance, &Value::Str("info".to_string()), result.clone());
{
let mut i: Value = Value::Int(0);
let mut __for_first_343: bool = true;
while { if !__for_first_343 { i = add(&i, &Value::Int(1)); } __for_first_343 = false; is_less_than(&i, &get_array_length(&result)) } {
let mut rawBalance: Value = get_value(&result, &i);
let mut rawBalance: Value = get_value(&result, &i);
let mut account: Value = self.account();
let mut currencyId: Value = self.safe_string_k(rawBalance.clone(), "currency", &[Value::Str("USDT".to_string())]); let mut code: Value = self.safe_currency_code(currencyId.clone(), &[]);
let mut timestamp: Value = self.safe_integer2(rawBalance.clone(), Value::Str("time_ms".to_string()), Value::Str("timestamp_ms".to_string()), &[]);
add_element_to_object(&mut self.balance, &Value::Str("timestamp".to_string()), timestamp.clone());
{ let __be_tmp = self.iso8601(timestamp.clone()); add_element_to_object(&mut self.balance, &Value::Str("datetime".to_string()), __be_tmp); };
add_element_to_object(&mut account, &Value::Str("used".to_string()), self.safe_string_k(rawBalance.clone(), "freeze", &[]));
add_element_to_object(&mut account, &Value::Str("free".to_string()), self.safe_string_k(rawBalance.clone(), "available", &[]));
add_element_to_object(&mut account, &Value::Str("total".to_string()), self.safe_string2(rawBalance.clone(), Value::Str("total".to_string()), Value::Str("balance".to_string()), &[]));
if !is_equal(&code, &Value::Null) {
add_element_to_object(&mut self.balance, &code, account.clone());
}
}
}
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
let mut parts: Value = split(&channel, &Value::Str(".".to_string()));
let mut rawType: Value = self.safe_string(parts.clone(), Value::Int(0), &[]);
let mut channelType: Value = self.get_supported_mapping(rawType.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("spot".to_string(), Value::Str("spot".to_string()));
m.insert("futures".to_string(), Value::Str("swap".to_string()));
m.insert("options".to_string(), Value::Str("option".to_string()));
m
})]);
let mut messageHash: Value = add(&channelType, &Value::Str(".balance".to_string()));
{ let __t = self.safe_balance(self.balance.clone()); self.balance = __t; }
client.resolve(&[self.balance.clone(), messageHash.clone()]);
}
pub async fn watch_positions(&mut self, optional_args: &[Value]) -> Value {
let mut symbols = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = Value::Null;
symbols = self.market_symbols(&[symbols.clone()]);
let mut payload: Value = Value::List(vec![add(&Value::Str("!".to_string()), &Value::Str("all".to_string()))]);
if !is_true(&self.is_empty(symbols.clone())) {
market = self.get_market_from_symbols(&[symbols.clone()]);
}
let mut type_var: Value = Value::Null;
let mut query: Value = Value::Null;
{ let __destr_tmp = self.handle_market_type_and_params(Value::Str("watchPositions".to_string()), &[market.clone(), params.clone()]); type_var = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
if is_equal(&type_var, &Value::Str("spot".to_string())) {
type_var = Value::Str("swap".to_string());
}
let mut typeId: Value = self.get_supported_mapping(type_var.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("future".to_string(), Value::Str("futures".to_string()));
m.insert("swap".to_string(), Value::Str("futures".to_string()));
m.insert("option".to_string(), Value::Str("options".to_string()));
m
})]);
let mut messageHash: Value = add(&type_var, &Value::Str(":positions".to_string()));
if !is_true(&self.is_empty(symbols.clone())) {
if is_equal(&symbols, &Value::Null) {
panic!("{}", crate::exchange_errors::arguments_required(add(&self.id, &Value::Str(" watchPositions() symbols is required".to_string()))));
}
messageHash = add(&messageHash, &add(&Value::Str("::".to_string()), &join(&symbols, &Value::Str(",".to_string()))));
}
let mut channel: Value = add(&typeId, &Value::Str(".positions".to_string()));
let mut subType: Value = Value::Null;
{ let __destr_tmp = self.handle_sub_type_and_params(Value::Str("watchPositions".to_string()), &[market.clone(), query.clone()]); subType = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
let mut isInverse: Value = Value::Bool(is_equal(&subType, &Value::Str("inverse".to_string())));
let mut url: Value = self.get_url_by_market_type(type_var.clone(), &[isInverse.clone()]);
let mut client: Value = self.client(&[url.clone()]);
self.set_positions_cache(client.clone(), type_var.clone(), &[symbols.clone()]);
let mut fetchPositionsSnapshot: Value = self.handle_option(Value::Str("watchPositions".to_string()), Value::Str("fetchPositionsSnapshot".to_string()), &[Value::Bool(true)]);
let mut awaitPositionsSnapshot: Value = self.handle_option(Value::Str("watchPositions".to_string()), Value::Str("awaitPositionsSnapshot".to_string()), &[Value::Bool(true)]);
let mut cache: Value = self.safe_value(self.positions.clone(), type_var.clone(), &[]);
if is_true(&(is_equal(&fetchPositionsSnapshot, &Value::Bool(true)))) && is_true(&(is_equal(&awaitPositionsSnapshot, &Value::Bool(true)))) && is_true(&(is_equal(&cache, &Value::Null))) {
return crate::exchange_stubs::ws_await_flight(&client.future(&[add(&type_var, &Value::Str(":fetchPositionsSnapshot".to_string()))])).await;
}
let mut positions: Value = self.subscribe_private(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), query.clone(), &[Value::Bool(true)]).await;
if is_true(&self.newUpdates) {
return positions;
}
return self.filter_by_symbols_since_limit(self.safe_value(self.positions.clone(), type_var.clone(), &[]), &[symbols.clone(), since.clone(), limit.clone(), Value::Bool(true)]);
Value::Null
}
pub fn set_positions_cache(&mut self, mut client: Value, mut type_var: Value, optional_args: &[Value]) {
let mut symbols = get_arg(optional_args, 0, Value::Null);
if is_equal(&self.positions, &Value::Null) {
self.positions = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
}
if is_true(&Value::Bool(in_op(&self.positions, &type_var))) {
return;
}
let mut fetchPositionsSnapshot: Value = self.handle_option(Value::Str("watchPositions".to_string()), Value::Str("fetchPositionsSnapshot".to_string()), &[Value::Bool(false)]);
if is_equal(&fetchPositionsSnapshot, &Value::Bool(true)) {
let mut messageHash: Value = add(&type_var, &Value::Str(":fetchPositionsSnapshot".to_string()));
if !is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("futures".to_string())), &messageHash)))) {
client.future(&[messageHash.clone()]);
self.spawn(&[Value::Str("load_positions_snapshot".to_string()).clone(), client.clone(), messageHash.clone(), type_var.clone()]);
}
} else {
add_element_to_object(&mut self.positions, &type_var, ArrayCacheBySymbolBySide::new(Value::Null));
}
}
pub async fn load_positions_snapshot(&mut self, mut client: Value, mut messageHash: Value, mut type_var: Value) -> Value {
let mut positions: Value = self.fetch_positions(&[Value::Null, Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("type".to_string(), type_var.clone());
m
})]).await;
add_element_to_object(&mut self.positions, &type_var, ArrayCacheBySymbolBySide::new(Value::Null));
let mut cache: Value = get_value(&self.positions, &type_var);
{
let mut i: Value = Value::Int(0);
let mut __for_first_344: bool = true;
while { if !__for_first_344 { i = add(&i, &Value::Int(1)); } __for_first_344 = false; is_less_than(&i, &get_array_length(&positions)) } {
let mut position: Value = get_value(&positions, &i);
let mut position: Value = get_value(&positions, &i);
let mut contracts: Value = self.safe_number_k(position.clone(), "contracts", &[Value::Int(0)]);
if is_true(&(!is_equal(&contracts, &Value::Null))) && is_true(&(is_greater_than(&contracts, &Value::Int(0)))) {
cache.append(position.clone());
}
}
}
if is_true(&Value::Bool(in_op(&get_value(&client, &Value::Str("futures".to_string())), &messageHash))) {
let mut future: Value = get_value(&get_value(&client, &Value::Str("futures".to_string())), &messageHash);
future.resolve(&[cache.clone()]);
client.resolve(&[cache.clone(), add(&type_var, &Value::Str(":position".to_string()))]);
}
Value::Null
}
pub fn handle_positions(&self, mut client: Value, mut message: Value) {
let mut type_var: Value = self.get_market_type_by_url(get_value(&client, &Value::Str("url".to_string())));
let mut data: Value = self.safe_value_k(message.clone(), "result", &[Value::List(vec![])]);
let mut cache: Value = get_value(&self.positions, &type_var);
let mut newPositions: Value = Value::List(vec![]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_345: bool = true;
while { if !__for_first_345 { i = add(&i, &Value::Int(1)); } __for_first_345 = false; is_less_than(&i, &get_array_length(&data)) } {
let mut rawPosition: Value = get_value(&data, &i);
let mut rawPosition: Value = get_value(&data, &i);
let mut position: Value = self.parse_position(rawPosition.clone(), &[]);
let mut symbol: Value = self.safe_string_k(position.clone(), "symbol", &[]);
let mut side: Value = self.safe_string_k(position.clone(), "side", &[]);
if is_equal(&side, &Value::Null) {
let mut prevLongPosition: Value = self.safe_dict(cache.clone(), add(&symbol, &Value::Str("long".to_string())), &[]);
if !is_equal(&prevLongPosition, &Value::Null) {
add_element_to_object(&mut position, &Value::Str("side".to_string()), get_value(&prevLongPosition, &Value::Str("side".to_string())));
append_to_array(&mut newPositions, position.clone());
cache.append(position.clone());
}
let mut prevShortPosition: Value = self.safe_dict(cache.clone(), add(&symbol, &Value::Str("short".to_string())), &[]);
if !is_equal(&prevShortPosition, &Value::Null) {
add_element_to_object(&mut position, &Value::Str("side".to_string()), get_value(&prevShortPosition, &Value::Str("side".to_string())));
append_to_array(&mut newPositions, position.clone());
cache.append(position.clone());
}
if is_equal(&prevLongPosition, &Value::Null) && is_equal(&prevShortPosition, &Value::Null) {
add_element_to_object(&mut position, &Value::Str("side".to_string()), Value::Str("long".to_string()));
append_to_array(&mut newPositions, position.clone());
cache.append(position.clone());
}
} else {
append_to_array(&mut newPositions, position.clone());
cache.append(position.clone());
}
}
}
let mut messageHashes: Value = self.find_message_hashes(client.clone(), add(&type_var, &Value::Str(":positions::".to_string())));
{
let mut i: Value = Value::Int(0);
let mut __for_first_346: bool = true;
while { if !__for_first_346 { i = add(&i, &Value::Int(1)); } __for_first_346 = false; is_less_than(&i, &get_array_length(&messageHashes)) } {
let mut messageHash: Value = get_value(&messageHashes, &i);
let mut messageHash: Value = get_value(&messageHashes, &i);
let mut parts: Value = split(&messageHash, &Value::Str("::".to_string()));
let mut symbolsString: Value = get_value(&parts, &Value::Int(1));
let mut symbols: Value = split(&symbolsString, &Value::Str(",".to_string()));
let mut positions: Value = self.filter_by_array(newPositions.clone(), Value::Str("symbol".to_string()), &[symbols.clone(), Value::Bool(false)]);
if !is_true(&self.is_empty(positions.clone())) {
client.resolve(&[positions.clone(), messageHash.clone()]);
}
}
}
client.resolve(&[newPositions.clone(), add(&type_var, &Value::Str(":positions".to_string()))]);
}
pub async fn watch_orders(&mut self, optional_args: &[Value]) -> Value {
let mut symbol = get_arg(optional_args, 0, Value::Null);
let mut since = get_arg(optional_args, 1, Value::Null);
let mut limit = get_arg(optional_args, 2, Value::Null);
let mut params = get_arg(optional_args, 3, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
let mut market: Value = Value::Null;
if !is_equal(&symbol, &Value::Null) {
let mut marketResolved: Value = self.market(symbol.clone());
market = marketResolved.clone();
symbol = get_value(&market, &Value::Str("symbol".to_string()));
}
let mut type_var: Value = Value::Null;
let mut query: Value = Value::Null;
{ let __destr_tmp = self.handle_market_type_and_params(Value::Str("watchOrders".to_string()), &[market.clone(), params.clone()]); type_var = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
let mut typeId: Value = self.get_supported_mapping(type_var.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("spot".to_string(), Value::Str("spot".to_string()));
m.insert("margin".to_string(), Value::Str("spot".to_string()));
m.insert("future".to_string(), Value::Str("futures".to_string()));
m.insert("swap".to_string(), Value::Str("futures".to_string()));
m.insert("option".to_string(), Value::Str("options".to_string()));
m
})]);
let mut isTrigger: Value = Value::Bool(false);
{ let __destr_tmp = self.handle_param_bool2(query.clone(), Value::Str("trigger".to_string()), Value::Str("stop".to_string()), &[Value::Bool(false)]); isTrigger = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
if is_true(&(is_equal(&isTrigger, &Value::Bool(true)))) && is_true(&(is_equal(&typeId, &Value::Str("options".to_string())))) {
panic!("{}", crate::exchange_errors::not_supported(add(&self.id, &Value::Str(" watchOrders() does not support trigger orders for options, see https://github.com/ccxt/ccxt/issues/27202".to_string()))));
}
let mut suffix: Value = Value::Str(".orders".to_string());
if is_equal(&isTrigger, &Value::Bool(true)) {
suffix = ternary(is_true(&(is_equal(&typeId, &Value::Str("spot".to_string())))), Value::Str(".priceorders".to_string()), Value::Str(".autoorders".to_string()));
}
let mut channel: Value = add(&typeId, &suffix);
let mut messageHash: Value = ternary(is_true(&(is_equal(&isTrigger, &Value::Bool(true)))), Value::Str("triggerOrders".to_string()), Value::Str("orders".to_string()));
let mut payload: Value = Value::List(vec![add(&Value::Str("!".to_string()), &Value::Str("all".to_string()))]);
if !is_equal(&market, &Value::Null) {
messageHash = add(&messageHash, &add(&Value::Str(":".to_string()), &get_value(&market, &Value::Str("id".to_string()))));
let mut mid: Value = get_value(&market, &Value::Str("id".to_string()));
if !is_equal(&mid, &Value::Null) {
payload = Value::List(vec![mid.clone()]);
}
}
let mut subType: Value = Value::Null;
{ let __destr_tmp = self.handle_sub_type_and_params(Value::Str("watchOrders".to_string()), &[market.clone(), query.clone()]); subType = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
let mut isInverse: Value = Value::Bool(is_equal(&subType, &Value::Str("inverse".to_string())));
let mut url: Value = self.get_url_by_market_type(type_var.clone(), &[isInverse.clone()]);
let mut requiresUid: Value = Value::Bool(!is_equal(&type_var, &Value::Str("spot".to_string())));
let mut orders: Value = self.subscribe_private(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), query.clone(), &[requiresUid.clone()]).await;
if is_true(&self.newUpdates) {
limit = orders.get_limit(symbol.clone(), limit.clone());
}
return self.filter_by_since_limit(orders.clone(), &[since.clone(), limit.clone(), Value::Str("timestamp".to_string()), Value::Bool(true)]);
Value::Null
}
pub fn handle_order(&mut self, mut client: Value, mut message: Value) {
let mut orders: Value = self.safe_value_k(message.clone(), "result", &[Value::List(vec![])]);
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[Value::Str("".to_string())]);
let mut isTrigger: bool = is_true(&(is_greater_than_or_equal(&get_index_of(&channel, &Value::Str("autoorders".to_string())), &Value::Int(0)))) || is_true(&(is_greater_than_or_equal(&get_index_of(&channel, &Value::Str("priceorders".to_string())), &Value::Int(0))));
let mut hashPrefix: Value = ternary(is_true(&isTrigger), Value::Str("triggerOrders".to_string()), Value::Str("orders".to_string()));
let mut limit: Value = self.safe_integer_k(self.options.clone(), "ordersLimit", &[Value::Int(1000)]);
if is_equal(&self.orders, &Value::Null) {
self.orders = ArrayCacheBySymbolById::new(limit.clone());
self.triggerOrders = ArrayCacheBySymbolById::new(limit.clone());
}
let mut stored: Value = ternary(is_true(&isTrigger), self.triggerOrders.clone(), self.orders.clone());
let mut marketIds: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
let mut parsedOrders: Value = self.parse_orders(orders.clone(), &[]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_347: bool = true;
while { if !__for_first_347 { i = add(&i, &Value::Int(1)); } __for_first_347 = false; is_less_than(&i, &get_array_length(&parsedOrders)) } {
let mut parsed: Value = get_value(&parsedOrders, &i);
let mut parsed: Value = get_value(&parsedOrders, &i);
let mut info: Value = self.safe_value_k(parsed.clone(), "info", &[]);
let mut event: Value = self.safe_string_k(info.clone(), "event", &[]);
if is_equal(&event, &Value::Str("put".to_string())) || is_equal(&event, &Value::Str("update".to_string())) {
add_element_to_object(&mut parsed, &Value::Str("status".to_string()), Value::Str("open".to_string()));
} else if is_equal(&event, &Value::Str("finish".to_string())) {
let mut status: Value = self.safe_string_k(parsed.clone(), "status", &[]);
if is_equal(&status, &Value::Null) {
let mut left: Value = self.safe_integer_k(info.clone(), "left", &[]);
add_element_to_object(&mut parsed, &Value::Str("status".to_string()), ternary(is_true(&(is_equal(&left, &Value::Int(0)))), Value::Str("closed".to_string()), Value::Str("canceled".to_string())));
}
}
stored.append(parsed.clone());
let mut symbol: Value = get_value(&parsed, &Value::Str("symbol".to_string()));
let mut market: Value = self.market(symbol.clone());
if !is_equal(&get_value(&market, &Value::Str("id".to_string())), &Value::Null) {
add_element_to_object(&mut marketIds, &get_value(&market, &Value::Str("id".to_string())), Value::Bool(true));
}
}
}
let mut keys: Value = object_keys(&marketIds);
{
let mut i: Value = Value::Int(0);
let mut __for_first_348: bool = true;
while { if !__for_first_348 { i = add(&i, &Value::Int(1)); } __for_first_348 = false; is_less_than(&i, &get_array_length(&keys)) } {
let mut messageHash: Value = add(&add(&hashPrefix, &Value::Str(":".to_string())), &get_value(&keys, &i));
client.resolve(&[stored.clone(), messageHash.clone()]);
}
}
client.resolve(&[stored.clone(), hashPrefix.clone()]);
}
pub async fn watch_my_liquidations(&mut self, mut symbol: Value, optional_args: &[Value]) -> Value {
let mut since = get_arg(optional_args, 0, Value::Null);
let mut limit = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
return self.watch_my_liquidations_for_symbols(Value::List(vec![symbol.clone()]), &[since.clone(), limit.clone(), params.clone()]).await;
Value::Null
}
pub async fn watch_my_liquidations_for_symbols(&mut self, mut symbols: Value, optional_args: &[Value]) -> Value {
let mut since = get_arg(optional_args, 0, Value::Null);
let mut limit = get_arg(optional_args, 1, Value::Null);
let mut params = get_arg(optional_args, 2, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
if is_equal(&self.markets, &Value::Null) {
self.load_markets(&[]).await;
}
symbols = self.market_symbols(&[symbols.clone(), Value::Null, Value::Bool(true), Value::Bool(true)]);
let mut market: Value = self.get_market_from_symbols(&[symbols.clone()]);
let mut type_var: Value = Value::Null;
let mut query: Value = Value::Null;
{ let __destr_tmp = self.handle_market_type_and_params(Value::Str("watchMyLiquidationsForSymbols".to_string()), &[market.clone(), params.clone()]); type_var = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
let mut typeId: Value = self.get_supported_mapping(type_var.clone(), &[Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("future".to_string(), Value::Str("futures".to_string()));
m.insert("swap".to_string(), Value::Str("futures".to_string()));
m.insert("option".to_string(), Value::Str("options".to_string()));
m
})]);
let mut subType: Value = Value::Null;
{ let __destr_tmp = self.handle_sub_type_and_params(Value::Str("watchMyLiquidationsForSymbols".to_string()), &[market.clone(), query.clone()]); subType = get_value(&__destr_tmp, &Value::Int(0)); query = get_value(&__destr_tmp, &Value::Int(1)); }
let mut isInverse: Value = Value::Bool(is_equal(&subType, &Value::Str("inverse".to_string())));
let mut url: Value = self.get_url_by_market_type(type_var.clone(), &[isInverse.clone()]);
let mut payload: Value = Value::List(vec![]);
let mut messageHash: Value = Value::Str("".to_string());
if is_true(&self.is_empty(symbols.clone())) {
if !is_equal(&typeId, &Value::Str("futures".to_string())) && !is_true(&isInverse) {
panic!("{}", crate::exchange_errors::bad_request(add(&self.id, &Value::Str(" watchMyLiquidationsForSymbols() does not support listening to all symbols, you must call watchMyLiquidations() instead for each symbol you wish to watch.".to_string()))));
}
messageHash = Value::Str("myLiquidations".to_string());
append_to_array(&mut payload, Value::Str("!all".to_string()));
} else {
let mut symbolsLength: Value = get_array_length(&symbols);
if !is_equal(&symbolsLength, &Value::Int(1)) {
panic!("{}", crate::exchange_errors::bad_request(add(&self.id, &Value::Str(" watchMyLiquidationsForSymbols() only allows one symbol at a time. To listen to several symbols call watchMyLiquidationsForSymbols() several times.".to_string()))));
}
messageHash = add(&Value::Str("myLiquidations::".to_string()), &get_value(&symbols, &Value::Int(0)));
append_to_array(&mut payload, get_value(&market, &Value::Str("id".to_string())));
}
let mut channel: Value = add(&typeId, &Value::Str(".liquidates".to_string()));
let mut newLiquidations: Value = self.subscribe_private(url.clone(), messageHash.clone(), payload.clone(), channel.clone(), query.clone(), &[Value::Bool(true)]).await;
if is_true(&self.newUpdates) {
return newLiquidations;
}
return self.filter_by_symbols_since_limit(self.liquidations.clone(), &[symbols.clone(), since.clone(), limit.clone(), Value::Bool(true)]);
Value::Null
}
pub fn handle_liquidation(&mut self, mut client: Value, mut message: Value) {
let mut rawLiquidations: Value = self.safe_list_k(message.clone(), "result", &[Value::List(vec![])]);
let mut newLiquidations: Value = Value::List(vec![]);
if is_equal(&self.liquidations, &Value::Null) {
let mut limit: Value = self.safe_integer_k(self.options.clone(), "liquidationsLimit", &[Value::Int(1000)]);
self.liquidations = ArrayCache::new(limit.clone());
}
let mut cache: Value = self.liquidations.clone();
{
let mut i: Value = Value::Int(0);
let mut __for_first_349: bool = true;
while { if !__for_first_349 { i = add(&i, &Value::Int(1)); } __for_first_349 = false; is_less_than(&i, &get_array_length(&rawLiquidations)) } {
let mut rawLiquidation: Value = get_value(&rawLiquidations, &i);
let mut rawLiquidation: Value = get_value(&rawLiquidations, &i);
let mut liquidation: Value = self.parse_ws_liquidation(rawLiquidation.clone(), &[]);
cache.append(liquidation.clone());
let mut symbol: Value = self.safe_string_k(liquidation.clone(), "symbol", &[]);
let mut symbolLiquidations: Value = self.safe_value(cache.clone(), symbol.clone(), &[Value::List(vec![])]);
client.resolve(&[symbolLiquidations.clone(), add(&Value::Str("myLiquidations::".to_string()), &symbol)]);
}
}
client.resolve(&[newLiquidations.clone(), Value::Str("myLiquidations".to_string())]);
}
pub fn parse_ws_liquidation(&self, mut liquidation: Value, optional_args: &[Value]) -> Value {
let mut market = get_arg(optional_args, 0, Value::Null);
let mut marketId: Value = self.safe_string_k(liquidation.clone(), "contract", &[]);
market = self.safe_market(&[marketId.clone(), market.clone()]);
let mut timestamp: Value = self.safe_integer_k(liquidation.clone(), "time_ms", &[]);
let mut originalSize: Value = self.safe_string_k(liquidation.clone(), "size", &[]);
let mut left: Value = self.safe_string_k(liquidation.clone(), "left", &[]);
let mut amount: Value = crate::precise::Precise::stringAbs(&crate::precise::Precise::stringSub(&originalSize, &left));
return self.safe_liquidation(Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("info".to_string(), liquidation.clone());
m.insert("symbol".to_string(), self.safe_symbol(marketId.clone(), &[market.clone()]));
m.insert("contracts".to_string(), self.parse_number(amount.clone(), &[]));
m.insert("contractSize".to_string(), self.safe_number_k(market.clone(), "contractSize", &[]));
m.insert("price".to_string(), self.safe_number_k(liquidation.clone(), "fill_price", &[]));
m.insert("baseValue".to_string(), Value::Null);
m.insert("quoteValue".to_string(), Value::Null);
m.insert("timestamp".to_string(), timestamp.clone());
m.insert("datetime".to_string(), self.iso8601(timestamp.clone()));
m
}), &[]);
Value::Null
}
pub fn handle_error_message(&self, mut client: Value, mut message: Value) -> Value {
let mut data: Value = self.safe_dict_k(message.clone(), "data", &[]);
let mut errs: Value = self.safe_dict_k(data.clone(), "errs", &[]);
let mut error: Value = self.safe_dict_k(message.clone(), "error", &[errs.clone()]);
let mut code: Value = self.safe_string2(error.clone(), Value::Str("code".to_string()), Value::Str("label".to_string()), &[]);
let mut id: Value = self.safe_string_n(message.clone(), Value::List(vec![Value::Str("id".to_string()), Value::Str("requestId".to_string()), Value::Str("request_id".to_string())]), &[]);
if !is_equal(&error, &Value::Null) {
let mut messageHash: Value = self.safe_string(get_value(&client, &Value::Str("subscriptions".to_string())), id.clone(), &[]);
let _try_result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
self.throw_exactly_matched_exception(get_value(&get_value(&self.exceptions, &Value::Str("ws".to_string())), &Value::Str("exact".to_string())), code.clone(), self.json(message.clone()));
self.throw_exactly_matched_exception(get_value(&self.exceptions, &Value::Str("exact".to_string())), code.clone(), self.json(errs.clone()));
let mut errorMessage: Value = self.safe_string_k(error.clone(), "message", &[self.safe_string(errs.clone(), Value::Str("message".to_string()), &[])]);
self.throw_broadly_matched_exception(get_value(&get_value(&self.exceptions, &Value::Str("ws".to_string())), &Value::Str("broad".to_string())), errorMessage.clone(), self.json(message.clone()));
panic!("{}", crate::exchange_errors::exchange_error(self.json(message.clone())));
#[allow(unreachable_code)] { Value::Null }}));
if let Err(_try_err) = _try_result { let e: Value = panic_to_value(_try_err);
client.reject(&[e.clone(), messageHash.clone()]);
if is_true(&(!is_equal(&messageHash, &Value::Null))) && is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash)))) {
remove(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash);
}
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
if is_true(&(!is_equal(&channel, &Value::Null))) && is_true(&(is_greater_than(&get_index_of(&channel, &Value::Str(".".to_string())), &Value::Int(0)))) {
let mut parsedChannel: Value = split(&channel, &Value::Str(".".to_string()));
let mut payload: Value = self.safe_list_k(message.clone(), "payload", &[Value::List(vec![])]);
{
let mut i: Value = Value::Int(0);
let mut __for_first_350: bool = true;
while { if !__for_first_350 { i = add(&i, &Value::Int(1)); } __for_first_350 = false; is_less_than(&i, &get_array_length(&payload)) } {
let mut marketType: Value = ternary(is_equal(&get_value(&parsedChannel, &Value::Int(0)), &Value::Str("futures".to_string())), Value::Str("swap".to_string()), get_value(&parsedChannel, &Value::Int(0)));
let mut symbol: Value = self.safe_symbol(get_value(&payload, &i), &[Value::Null, Value::Str("_".to_string()), marketType.clone()]);
let mut messageHashSymbol: Value = add(&add(&get_value(&parsedChannel, &Value::Int(1)), &Value::Str(":".to_string())), &symbol);
if is_true(&(!is_equal(&messageHashSymbol, &Value::Null))) && is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHashSymbol)))) {
remove(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &messageHashSymbol);
}
}
}
}
}
if is_true(&(!is_equal(&id, &Value::Null))) && is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &id)))) {
remove(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &id);
}
return Value::Bool(true);
}
return Value::Bool(false);
Value::Null
}
pub fn handle_balance_subscription(&mut self, mut client: Value, mut message: Value, optional_args: &[Value]) {
let mut subscription = get_arg(optional_args, 0, Value::Null);
self.balance = Value::Map({
let mut m = indexmap::IndexMap::new();
m
});
}
pub fn handle_subscription_status(&mut self, mut client: Value, mut message: Value) {
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[]);
let mut methods: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("balance".to_string(), Value::Str("handle_balance_subscription".to_string()).clone());
m.insert("spot.order_book_update".to_string(), Value::Str("handle_order_book_subscription".to_string()).clone());
m.insert("futures.order_book_update".to_string(), Value::Str("handle_order_book_subscription".to_string()).clone());
m.insert("options.order_book_update".to_string(), Value::Str("handle_order_book_subscription".to_string()).clone());
m
});
let mut id: Value = self.safe_string_k(message.clone(), "id", &[]);
if is_equal(&id, &Value::Null) {
return;
}
if is_true(&Value::Bool(in_op(&methods, &channel))) {
let mut subscriptionHash: Value = self.safe_string(get_value(&client, &Value::Str("subscriptions".to_string())), id.clone(), &[]);
let mut subscription: Value = self.safe_value(get_value(&client, &Value::Str("subscriptions".to_string())), subscriptionHash.clone(), &[]);
let mut method: Value = get_value(&methods, &channel);
let mut method: Value = get_value(&methods, &channel);
self.dispatch_ws_handler(&method, &[client.clone(), message.clone(), subscription.clone()]);
}
if is_true(&Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &id))) {
if !is_equal(&id, &Value::Null) {
remove(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &id);
}
}
}
pub fn handle_un_subscribe(&mut self, mut client: Value, mut message: Value) {
let mut id: Value = self.safe_string_k(message.clone(), "id", &[]);
let mut keys: Value = object_keys(&get_value(&client, &Value::Str("subscriptions".to_string())));
{
let mut i: Value = Value::Int(0);
let mut __for_first_352: bool = true;
while { if !__for_first_352 { i = add(&i, &Value::Int(1)); } __for_first_352 = false; is_less_than(&i, &get_array_length(&keys)) } {
let mut messageHash: Value = get_value(&keys, &i);
let mut messageHash: Value = get_value(&keys, &i);
if !is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash)))) {
continue;
}
if is_true(&Value::Bool(starts_with(&messageHash, &Value::Str("unsubscribe".to_string())))) {
let mut subscription: Value = get_value(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash);
let mut subId: Value = self.safe_string_k(subscription.clone(), "id", &[]);
if !is_equal(&id, &subId) {
continue;
}
let mut messageHashes: Value = self.safe_list_k(subscription.clone(), "messageHashes", &[Value::List(vec![])]);
let mut subMessageHashes: Value = self.safe_list_k(subscription.clone(), "subMessageHashes", &[Value::List(vec![])]);
{
let mut j: Value = Value::Int(0);
let mut __for_first_351: bool = true;
while { if !__for_first_351 { j = add(&j, &Value::Int(1)); } __for_first_351 = false; is_less_than(&j, &get_array_length(&messageHashes)) } {
let mut unsubHash: Value = get_value(&messageHashes, &j);
let mut unsubHash: Value = get_value(&messageHashes, &j);
let mut subHash: Value = get_value(&subMessageHashes, &j);
let mut subHash: Value = get_value(&subMessageHashes, &j);
self.clean_unsubscription(client.clone(), subHash.clone(), unsubHash.clone(), &[]);
}
}
self.clean_cache(subscription.clone());
}
}
}
}
pub fn handle_message(&mut self, mut client: Value, mut message: Value) {
if is_equal(&self.handle_error_message(client.clone(), message.clone()), &Value::Bool(true)) {
return;
}
let mut event: Value = self.safe_string_k(message.clone(), "event", &[]);
if is_equal(&event, &Value::Str("subscribe".to_string())) {
self.handle_subscription_status(client.clone(), message.clone());
return;
}
if is_equal(&event, &Value::Str("unsubscribe".to_string())) {
self.handle_un_subscribe(client.clone(), message.clone());
return;
}
let mut channel: Value = self.safe_string_k(message.clone(), "channel", &[Value::Str("".to_string())]);
if is_equal(&channel, &Value::Str("spot.obu".to_string())) {
self.handle_order_book(client.clone(), message.clone());
return;
}
let mut channelParts: Value = split(&channel, &Value::Str(".".to_string()));
let mut channelType: Value = self.safe_value(channelParts.clone(), Value::Int(1), &[]);
let mut v4Methods: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("usertrades".to_string(), Value::Str("handle_my_trades".to_string()).clone());
m.insert("candlesticks".to_string(), Value::Str("handle_ohlcv".to_string()).clone());
m.insert("orders".to_string(), Value::Str("handle_order".to_string()).clone());
m.insert("autoorders".to_string(), Value::Str("handle_order".to_string()).clone());
m.insert("priceorders".to_string(), Value::Str("handle_order".to_string()).clone());
m.insert("positions".to_string(), Value::Str("handle_positions".to_string()).clone());
m.insert("tickers".to_string(), Value::Str("handle_ticker".to_string()).clone());
m.insert("book_ticker".to_string(), Value::Str("handle_bid_ask".to_string()).clone());
m.insert("trades".to_string(), Value::Str("handle_trades".to_string()).clone());
m.insert("order_book_update".to_string(), Value::Str("handle_order_book".to_string()).clone());
m.insert("balances".to_string(), Value::Str("handle_balance".to_string()).clone());
m.insert("liquidates".to_string(), Value::Str("handle_liquidation".to_string()).clone());
m
});
let mut method: Value = self.safe_value(v4Methods.clone(), channelType.clone(), &[]);
if !is_equal(&method, &Value::Null) {
self.dispatch_ws_handler(&method, &[client.clone(), message.clone()]);
}
let mut requestId: Value = self.safe_string_k(message.clone(), "request_id", &[]);
if is_equal(&requestId, &Value::Str("authenticated".to_string())) {
self.handle_authentication_message(client.clone(), message.clone());
return;
}
if !is_equal(&requestId, &Value::Null) {
let mut data: Value = self.safe_dict_k(message.clone(), "data", &[]);
let mut result: Value = self.safe_value_k(data.clone(), "result", &[]);
let mut ack: Value = self.safe_bool_k(message.clone(), "ack", &[]);
if !is_equal(&ack, &Value::Bool(true)) {
client.resolve(&[result.clone(), requestId.clone()]);
}
}
}
pub fn get_url_by_market(&self, mut market: Value) -> Value {
let mut baseUrl: Value = get_value(&get_value(&self.urls, &Value::Str("api".to_string())), &get_value(&market, &Value::Str("type".to_string())));
if is_equal(&get_value(&market, &Value::Str("contract".to_string())), &Value::Bool(true)) {
return ternary(is_true(&(is_equal(&get_value(&market, &Value::Str("linear".to_string())), &Value::Bool(true)))), get_value(&baseUrl, &Value::Str("usdt".to_string())), get_value(&baseUrl, &Value::Str("btc".to_string())));
} else {
return baseUrl;
}
Value::Null
}
pub fn get_type_by_market(&self, mut market: Value) -> Value {
if is_equal(&market, &Value::Null) {
return Value::Null;
}
if is_equal(&get_value(&market, &Value::Str("spot".to_string())), &Value::Bool(true)) {
return Value::Str("spot".to_string());
} else if is_equal(&get_value(&market, &Value::Str("option".to_string())), &Value::Bool(true)) {
return Value::Str("options".to_string());
} else {
return Value::Str("futures".to_string());
}
Value::Null
}
pub fn get_url_by_market_type(&self, mut type_var: Value, optional_args: &[Value]) -> Value {
let mut isInverse = get_arg(optional_args, 0, Value::Bool(false));
let mut api: Value = get_value(&self.urls, &Value::Str("api".to_string()));
let mut url: Value = self.safe_value(api.clone(), type_var.clone(), &[]);
if is_true(&(is_equal(&type_var, &Value::Str("swap".to_string())))) || is_true(&(is_equal(&type_var, &Value::Str("future".to_string())))) {
return ternary(is_true(&isInverse), get_value(&url, &Value::Str("btc".to_string())), get_value(&url, &Value::Str("usdt".to_string())));
} else {
return url;
}
Value::Null
}
pub fn get_market_type_by_url(&self, mut url: Value) -> Value {
let mut findBy: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("op-".to_string(), Value::Str("option".to_string()));
m.insert("delivery".to_string(), Value::Str("future".to_string()));
m.insert("fx".to_string(), Value::Str("swap".to_string()));
m
});
let mut keys: Value = object_keys(&findBy);
{
let mut i: Value = Value::Int(0);
let mut __for_first_353: bool = true;
while { if !__for_first_353 { i = add(&i, &Value::Int(1)); } __for_first_353 = false; is_less_than(&i, &get_array_length(&keys)) } {
let mut key: Value = get_value(&keys, &i);
let mut key: Value = get_value(&keys, &i);
let mut value: Value = get_value(&findBy, &key);
let mut value: Value = get_value(&findBy, &key);
if is_greater_than_or_equal(&get_index_of(&url, &key), &Value::Int(0)) {
return value;
}
}
}
return Value::Str("spot".to_string());
Value::Null
}
pub fn request_id(&mut self) -> Value {
self.lock_id(&[]);
let mut reqid: Value = self.sum(&[self.safe_integer_k(self.options.clone(), "reqid", &[Value::Int(0)]), Value::Int(1)]);
add_element_to_object(&mut self.options, &Value::Str("reqid".to_string()), reqid.clone());
self.unlock_id(&[]);
return reqid;
Value::Null
}
pub async fn subscribe_public(&mut self, mut url: Value, mut messageHash: Value, mut payload: Value, mut channel: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
let mut subscription = get_arg(optional_args, 1, Value::Null);
let mut requestId: Value = self.request_id();
let mut time: Value = self.seconds();
let mut request: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), requestId.clone());
m.insert("time".to_string(), time.clone());
m.insert("channel".to_string(), channel.clone());
m.insert("event".to_string(), Value::Str("subscribe".to_string()));
m.insert("payload".to_string(), payload.clone());
m
});
if !is_equal(&subscription, &Value::Null) {
let mut client: Value = self.client(&[url.clone()]);
if !is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash)))) {
let mut tempSubscriptionHash: Value = to_string_val(&requestId);
add_element_to_object(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &tempSubscriptionHash, messageHash.clone());
}
}
let mut message: Value = self.extend(request.clone(), &[params.clone()]);
return self.watch(url.clone(), messageHash.clone(), &[message.clone(), messageHash.clone(), subscription.clone()]).await;
Value::Null
}
pub async fn subscribe_public_multiple(&mut self, mut url: Value, mut messageHashes: Value, mut payload: Value, mut channel: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
let mut requestId: Value = self.request_id();
let mut time: Value = self.seconds();
let mut request: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), requestId.clone());
m.insert("time".to_string(), time.clone());
m.insert("channel".to_string(), channel.clone());
m.insert("event".to_string(), Value::Str("subscribe".to_string()));
m.insert("payload".to_string(), payload.clone());
m
});
let mut message: Value = self.extend(request.clone(), &[params.clone()]);
return self.watch_multiple(url.clone(), messageHashes.clone(), &[message.clone(), messageHashes.clone()]).await;
Value::Null
}
pub async fn un_subscribe_public_multiple(&mut self, mut url: Value, mut topic: Value, mut symbols: Value, mut messageHashes: Value, mut subMessageHashes: Value, mut payload: Value, mut channel: Value, optional_args: &[Value]) -> Value {
let mut params = get_arg(optional_args, 0, Value::Map({
let mut m = indexmap::IndexMap::new();
m
}));
let mut requestId: Value = self.request_id();
let mut time: Value = self.seconds();
let mut request: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), requestId.clone());
m.insert("time".to_string(), time.clone());
m.insert("channel".to_string(), channel.clone());
m.insert("event".to_string(), Value::Str("unsubscribe".to_string()));
m.insert("payload".to_string(), payload.clone());
m
});
let mut sub: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), to_string_val(&requestId));
m.insert("topic".to_string(), topic.clone());
m.insert("unsubscribe".to_string(), Value::Bool(true));
m.insert("messageHashes".to_string(), messageHashes.clone());
m.insert("subMessageHashes".to_string(), subMessageHashes.clone());
m.insert("symbols".to_string(), symbols.clone());
m
});
let mut message: Value = self.extend(request.clone(), &[params.clone()]);
return self.watch_multiple(url.clone(), messageHashes.clone(), &[message.clone(), messageHashes.clone(), sub.clone()]).await;
Value::Null
}
pub async fn authenticate(&mut self, mut url: Value, mut messageType: Value) -> Value {
let mut channel: Value = add(&messageType, &Value::Str(".login".to_string()));
let mut client: Value = self.client(&[url.clone()]);
let mut messageHash: Value = Value::Str("authenticated".to_string());
let mut future: Value = client.reusable_future(messageHash.clone());
let mut authenticated: Value = self.safe_value(get_value(&client, &Value::Str("subscriptions".to_string())), messageHash.clone(), &[]);
if is_equal(&authenticated, &Value::Null) {
return self.request_private(url.clone(), Value::Map({
let mut m = indexmap::IndexMap::new();
m
}), channel.clone(), &[messageHash.clone()]).await;
}
return future;
Value::Null
}
pub fn handle_authentication_message(&self, mut client: Value, mut message: Value) {
let mut messageHash: Value = Value::Str("authenticated".to_string());
let mut future: Value = self.safe_value(get_value(&client, &Value::Str("futures".to_string())), messageHash.clone(), &[]);
future.resolve(&[Value::Bool(true)]);
}
pub async fn request_private(&mut self, mut url: Value, mut reqParams: Value, mut channel: Value, optional_args: &[Value]) -> Value {
let mut requestId = get_arg(optional_args, 0, Value::Null);
self.check_required_credentials(&[]);
let mut event: Value = Value::Str("api".to_string());
if is_equal(&requestId, &Value::Null) {
let mut reqId: Value = self.request_id();
requestId = to_string_val(&reqId);
}
let mut messageHash: Value = requestId.clone();
let mut time: Value = self.seconds();
let mut signatureString: Value = join(&Value::List(vec![event.clone(), channel.clone(), self.json(reqParams.clone()), to_string_val(&time)]), &Value::Str("\n".to_string())); let mut signature: Value = self.hmac(self.encode(signatureString.clone()), self.encode(self.secret.clone()), Value::Str("sha512".to_string()), &[Value::Str("hex".to_string())]);
let mut payload: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("req_id".to_string(), requestId.clone());
m.insert("timestamp".to_string(), to_string_val(&time));
m.insert("api_key".to_string(), self.apiKey.clone());
m.insert("signature".to_string(), signature.clone());
m.insert("req_param".to_string(), reqParams.clone());
m
});
if is_true(&(is_equal(&channel, &Value::Str("spot.order_place".to_string())))) || is_true(&(is_equal(&channel, &Value::Str("futures.order_place".to_string())))) {
add_element_to_object(&mut payload, &Value::Str("req_header".to_string()), Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("X-Gate-Channel-Id".to_string(), Value::Str("ccxt".to_string()));
m
}));
}
let mut request: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), requestId.clone());
m.insert("time".to_string(), time.clone());
m.insert("channel".to_string(), channel.clone());
m.insert("event".to_string(), event.clone());
m.insert("payload".to_string(), payload.clone());
m
});
return self.watch(url.clone(), messageHash.clone(), &[request.clone(), messageHash.clone(), requestId.clone()]).await;
Value::Null
}
pub async fn subscribe_private(&mut self, mut url: Value, mut messageHash: Value, mut payload: Value, mut channel: Value, mut params: Value, optional_args: &[Value]) -> Value {
let mut requiresUid = get_arg(optional_args, 0, Value::Bool(false));
self.check_required_credentials(&[]);
if is_true(&requiresUid) {
if is_equal(&self.uid, &Value::Null) || is_equal(&get_array_length(&self.uid), &Value::Int(0)) {
panic!("{}", crate::exchange_errors::arguments_required(add(&self.id, &Value::Str(" requires uid to subscribe".to_string()))));
}
let mut idArray: Value = Value::List(vec![self.uid.clone()]);
if is_equal(&payload, &Value::Null) {
payload = idArray.clone();
} else {
payload = self.array_concat(idArray.clone(), payload.clone());
}
}
let mut time: Value = self.seconds();
let mut event: Value = Value::Str("subscribe".to_string());
let mut signaturePayload: Value = add(&add(&add(&add(&add(&add(&add(&Value::Str("channel=".to_string()), &channel), &Value::Str("&".to_string())), &Value::Str("event=".to_string())), &event), &Value::Str("&".to_string())), &Value::Str("time=".to_string())), &to_string_val(&time));
let mut signature: Value = self.hmac(self.encode(signaturePayload.clone()), self.encode(self.secret.clone()), Value::Str("sha512".to_string()), &[Value::Str("hex".to_string())]);
let mut auth: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("method".to_string(), Value::Str("api_key".to_string()));
m.insert("KEY".to_string(), self.apiKey.clone());
m.insert("SIGN".to_string(), signature.clone());
m
});
let mut requestId: Value = self.request_id();
let mut request: Value = Value::Map({
let mut m = indexmap::IndexMap::new();
m.insert("id".to_string(), requestId.clone());
m.insert("time".to_string(), time.clone());
m.insert("channel".to_string(), channel.clone());
m.insert("event".to_string(), event.clone());
m.insert("auth".to_string(), auth.clone());
m
});
if !is_equal(&payload, &Value::Null) {
add_element_to_object(&mut request, &Value::Str("payload".to_string()), payload.clone());
}
let mut client: Value = self.client(&[url.clone()]);
if !is_true(&(Value::Bool(in_op(&get_value(&client, &Value::Str("subscriptions".to_string())), &messageHash)))) {
let mut tempSubscriptionHash: Value = to_string_val(&requestId);
add_element_to_object(&mut get_value(&client, &Value::Str("subscriptions".to_string())), &tempSubscriptionHash, messageHash.clone());
}
let mut message: Value = self.extend(request.clone(), &[params.clone()]);
return self.watch(url.clone(), messageHash.clone(), &[message.clone(), messageHash.clone(), messageHash.clone()]).await;
Value::Null
}
}