# Aster Exchange Specification # # Auto-generated by: mix ccxt.extract aster # CCXT version: 4.5.34 # Spec format version: 1 # # Review before use: # - signing: Detected from sign() method, verify with testnet # - endpoints: Raw paths extracted, map to unified API as needed # - exceptions: Extracted (exact, broad, HTTP status codes) # - features/options: Extracted from describe() # - classification: Set to :supported initially, promote after validation # %{ api_param_requirements: nil, certified: false, classification: :pro, comment: nil, countries: [ "US" ], currencies: %{}, currency_aliases: %{ "BCHSV" => "BSV", "XBT" => "BTC" }, dex: true, enable_rate_limit: true, endpoint_extraction_stats: %{ "capturedMethods" => 37, "coveragePercent" => 100, "enabledMethods" => 50, "excluded" => [ %{ "method" => "fetchCanceledAndClosedOrders", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchCanceledOrders", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchClosedOrders", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchDepositWithdrawFee", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchFundingInterval", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchIsolatedBorrowRate", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchLeverage", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchMarginMode", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchMarketLeverageTiers", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchTradingLimits", "reason" => "emulated (returns cached data, no HTTP call)" }, %{ "method" => "fetchTransactionFee", "reason" => "emulated (returns cached data, no HTTP call)" } ], "excludedMethods" => 11, "extractableMethods" => 39, "failures" => [ %{ "error" => "aster fetchPositionsRisk() requires an array argument for symbols", "method" => "fetchPositionsRisk" }, %{ "error" => "aster withdraw require chainId or network parameter", "method" => "withdraw" } ] }, endpoints: [ %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :delete, name: :cancel_all_orders, param_mappings: %{}, params: [ :symbol ], path: "/v1/allOpenOrders", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :delete, name: :cancel_order, param_mappings: %{ "id" => "orderId" }, params: [ :id, :symbol ], path: "/v1/order", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "orderIdList" => [ "test-order-id" ], "symbol" => "BTCUSDT" }, market_type: :spot, method: :delete, name: :cancel_orders, param_mappings: %{}, params: [ :ids, :symbol ], path: "/v1/batchOrders", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, default_params: %{ "timeInForce" => "GTC", "type" => "LIMIT" }, market_type: :spot, method: :post, name: :create_limit_order, param_mappings: %{ "amount" => "quantity" }, params: [ :symbol, :side, :amount, :price ], path: "/v1/order", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, default_params: %{ "type" => "MARKET" }, market_type: :spot, method: :post, name: :create_market_order, param_mappings: %{ "amount" => "quantity" }, params: [ :symbol, :side, :amount, :price ], path: "/v1/order", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, default_params: %{ "timeInForce" => "GTC" }, market_type: :spot, method: :post, name: :create_order, param_mappings: %{ "amount" => "quantity" }, params: [ :symbol, :type, :side, :amount, :price ], path: "/v1/order", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_balance, param_mappings: %{}, params: [], path: "/v1/account", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_currencies, param_mappings: %{}, params: [], path: "/v1/exchangeInfo", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "incomeType" => "FUNDING_FEE", "symbol" => "BTCUSDT" }, market_type: :swap, method: :get, name: :fetch_funding_history, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/income", source: :intercepted }, %{ api_section: "fapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_funding_intervals, param_mappings: %{}, params: [ :symbols ], path: "/v1/fundingInfo", source: :intercepted }, %{ api_section: "fapiPublic", auth: false, cost: 1, default_params: %{ "symbol" => "BTCUSDT" }, market_type: :swap, method: :get, name: :fetch_funding_rate, param_mappings: %{}, params: [ :symbol ], path: "/v1/premiumIndex", source: :intercepted }, %{ api_section: "fapiPublic", auth: false, cost: 1, default_params: %{ "symbol" => "BTCUSDT" }, market_type: :swap, method: :get, name: :fetch_funding_rate_history, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/fundingRate", source: :intercepted }, %{ api_section: "fapiPublic", auth: false, cost: 1, market_type: :swap, method: :get, name: :fetch_funding_rates, param_mappings: %{}, params: [ :symbols ], path: "/v1/premiumIndex", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_l2_order_book, param_mappings: %{}, params: [ :symbol, :limit ], path: "/v1/depth", response_transformer: {:extract_path, ["T"]}, source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_ledger, param_mappings: %{}, params: [ :code, :since, :limit ], path: "/v1/income", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :swap, method: :get, name: :fetch_leverages, param_mappings: %{}, params: [ :symbols ], path: "/v2/positionRisk", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "symbol" => "BTCUSDT" }, market_type: :swap, method: :get, name: :fetch_margin_adjustment_history, param_mappings: %{}, params: [ :symbol, :type, :since, :limit ], path: "/v1/positionMargin/history", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :swap, method: :get, name: :fetch_margin_modes, param_mappings: %{}, params: [ :symbols ], path: "/v2/positionRisk", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_markets, param_mappings: %{}, params: [], path: "/v1/exchangeInfo", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_my_trades, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/userTrades", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_ohlcv, param_mappings: %{ "since" => "startTime", "timeframe" => "interval" }, params: [ :symbol, :timeframe, :since, :limit ], path: "/v1/klines", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_open_order, param_mappings: %{ "arg0" => "orderId", "arg1" => "symbol" }, params: [], path: "/v1/openOrder", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_open_orders, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/openOrders", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_order, param_mappings: %{ "id" => "orderId" }, params: [ :id, :symbol ], path: "/v1/order", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_order_book, param_mappings: %{}, params: [ :symbol, :limit ], path: "/v1/depth", response_transformer: {:extract_path_unwrap, ["T"]}, source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_orders, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/allOrders", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :swap, method: :get, name: :fetch_position_mode, param_mappings: %{}, params: [ :symbol ], path: "/v1/positionSide/dual", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :swap, method: :get, name: :fetch_positions, param_mappings: %{}, params: [ :symbols ], path: "/v1/leverageBracket", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_ticker, param_mappings: %{}, params: [ :symbol ], path: "/v1/ticker/24hr", source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_tickers, param_mappings: %{}, params: [ :symbols ], path: "/v1/ticker/24hr", source: :intercepted }, %{ api_section: "fapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_time, param_mappings: %{}, params: [], path: "/v1/time", response_transformer: {:extract_path, ["serverTime"]}, source: :intercepted }, %{ api_section: "sapiPublic", auth: false, cost: 1, market_type: :spot, method: :get, name: :fetch_trades, param_mappings: %{}, params: [ :symbol, :since, :limit ], path: "/v1/trades", source: :intercepted }, %{ api_section: "sapiPrivate", auth: true, cost: 1, market_type: :spot, method: :get, name: :fetch_trading_fee, param_mappings: %{}, params: [ :symbol ], path: "/v1/commissionRate", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "symbol" => "BTCUSDT" }, market_type: :swap, method: :post, name: :set_leverage, param_mappings: %{}, params: [ :leverage, :symbol ], path: "/v1/leverage", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "symbol" => "BTCUSDT" }, market_type: :swap, method: :post, name: :set_margin_mode, param_mappings: %{ "marginMode" => "marginType" }, params: [ :marginMode, :symbol ], path: "/v1/marginType", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, market_type: :swap, method: :post, name: :set_position_mode, param_mappings: %{ "hedged" => "dualSidePosition" }, params: [ :hedged, :symbol ], path: "/v1/positionSide/dual", source: :intercepted }, %{ api_section: "fapiPrivate", auth: true, cost: 1, default_params: %{ "clientTranId" => "1771639418297", "kindType" => "SPOT_FUTURE" }, market_type: :spot, method: :post, name: :transfer, param_mappings: %{ "code" => "asset" }, params: [ :code, :amount, :fromAccount, :toAccount ], path: "/v1/asset/wallet/transfer", response_transformer: {:extract_path, ["tranId"]}, source: :intercepted } ], error_code_details: %{ -1000 => %{ description: "UNKNOWN", type: :exchange_error }, -1001 => %{ description: "DISCONNECTED", type: :network_error }, -1002 => %{ description: "UNAUTHORIZED", type: :invalid_credentials }, -1003 => %{ description: "TOO_MANY_REQUESTS", type: :rate_limited }, -1004 => %{ description: "DUPLICATE_IP", type: :invalid_order }, -1005 => %{ description: "NO_SUCH_IP", type: :invalid_parameters }, -1006 => %{ description: "UNEXPECTED_RESP", type: :exchange_error }, -1007 => %{ description: "TIMEOUT", type: :network_error }, -1010 => %{ description: "ERROR_MSG_RECEIVED", type: :exchange_error }, -1011 => %{ description: "NON_WHITE_LIST", type: :access_restricted }, -1013 => %{ description: "INVALID_MESSAGE", type: :invalid_parameters }, -1014 => %{ description: "UNKNOWN_ORDER_COMPOSITION", type: :invalid_order }, -1015 => %{ description: "TOO_MANY_ORDERS", type: :rate_limited }, -1016 => %{ description: "SERVICE_SHUTTING_DOWN", type: :exchange_error }, -1020 => %{ description: "UNSUPPORTED_OPERATION", type: :exchange_error }, -1021 => %{ description: "INVALID_TIMESTAMP", type: :invalid_credentials }, -1022 => %{ description: "INVALID_SIGNATURE", type: :invalid_credentials }, -1023 => %{ description: "START_TIME_GREATER_THAN_END_TIME", type: :invalid_parameters }, -1100 => %{ description: "ILLEGAL_CHARS", type: :invalid_parameters }, -1101 => %{ description: "TOO_MANY_PARAMETERS", type: :invalid_parameters }, -1102 => %{ description: "MANDATORY_PARAM_EMPTY_OR_MALFORMED", type: :invalid_parameters }, -1103 => %{ description: "UNKNOWN_PARAM", type: :invalid_parameters }, -1104 => %{ description: "UNREAD_PARAMETERS", type: :invalid_parameters }, -1105 => %{ description: "PARAM_EMPTY", type: :invalid_parameters }, -1106 => %{ description: "PARAM_NOT_REQUIRED", type: :invalid_parameters }, -1108 => %{ description: "BAD_ASSET", type: :invalid_parameters }, -1109 => %{ description: "BAD_ACCOUNT", type: :invalid_parameters }, -1110 => %{ description: "BAD_INSTRUMENT_TYPE", type: :invalid_order }, -1111 => %{ description: "BAD_PRECISION", type: :invalid_parameters }, -1112 => %{ description: "NO_DEPTH", type: :invalid_parameters }, -1113 => %{ description: "WITHDRAW_NOT_NEGATIVE", type: :invalid_parameters }, -1114 => %{ description: "TIF_NOT_REQUIRED", type: :invalid_parameters }, -1115 => %{ description: "INVALID_TIF", type: :invalid_order }, -1116 => %{ description: "INVALID_ORDER_TYPE", type: :invalid_order }, -1117 => %{ description: "INVALID_SIDE", type: :invalid_order }, -1118 => %{ description: "EMPTY_NEW_CL_ORD_ID", type: :invalid_order }, -1119 => %{ description: "EMPTY_ORG_CL_ORD_ID", type: :invalid_order }, -1120 => %{ description: "BAD_INTERVAL", type: :invalid_parameters }, -1121 => %{ description: "BAD_SYMBOL", type: :invalid_order }, -1125 => %{ description: "INVALID_LISTEN_KEY", type: :invalid_credentials }, -1127 => %{ description: "MORE_THAN_XX_HOURS", type: :invalid_parameters }, -1128 => %{ description: "OPTIONAL_PARAMS_BAD_COMBO", type: :invalid_parameters }, -1130 => %{ description: "INVALID_PARAMETER", type: :invalid_parameters }, -1136 => %{ description: "INVALID_NEW_ORDER_RESP_TYPE", type: :invalid_order }, -2010 => %{ description: "NEW_ORDER_REJECTED", type: :invalid_order }, -2011 => %{ description: "CANCEL_REJECTED", type: :order_not_found }, -2013 => %{ description: "NO_SUCH_ORDER", type: :order_not_found }, -2014 => %{ description: "BAD_API_KEY_FMT", type: :invalid_credentials }, -2015 => %{ description: "REJECTED_MBX_KEY", type: :invalid_credentials }, -2016 => %{ description: "NO_TRADING_WINDOW", type: :market_closed }, -2018 => %{ description: "BALANCE_NOT_SUFFICIENT", type: :insufficient_balance }, -2019 => %{ description: "MARGIN_NOT_SUFFICIEN", type: :insufficient_balance }, -2020 => %{ description: "UNABLE_TO_FILL", type: :invalid_order }, -2021 => %{ description: "ORDER_WOULD_IMMEDIATELY_TRIGGER", type: :invalid_order }, -2022 => %{ description: "REDUCE_ONLY_REJECT", type: :exchange_error }, -2023 => %{ description: "USER_IN_LIQUIDATION", type: :access_restricted }, -2024 => %{ description: "POSITION_NOT_SUFFICIENT", type: :insufficient_balance }, -2025 => %{ description: "MAX_OPEN_ORDER_EXCEEDED", type: :rate_limited }, -2026 => %{ description: "REDUCE_ONLY_ORDER_TYPE_NOT_SUPPORTED", type: :exchange_error }, -2027 => %{ description: "MAX_LEVERAGE_RATIO", type: :invalid_parameters }, -2028 => %{ description: "MIN_LEVERAGE_RATIO", type: :invalid_parameters }, -4000 => %{ description: "INVALID_ORDER_STATUS", type: :invalid_order }, -4001 => %{ description: "PRICE_LESS_THAN_ZERO", type: :invalid_order }, -4002 => %{ description: "PRICE_GREATER_THAN_MAX_PRICE", type: :invalid_order }, -4003 => %{ description: "QTY_LESS_THAN_ZERO", type: :invalid_order }, -4004 => %{ description: "QTY_LESS_THAN_MIN_QTY", type: :invalid_order }, -4005 => %{ description: "QTY_GREATER_THAN_MAX_QTY", type: :invalid_order }, -4006 => %{ description: "STOP_PRICE_LESS_THAN_ZERO", type: :invalid_order }, -4007 => %{ description: "STOP_PRICE_GREATER_THAN_MAX_PRICE", type: :invalid_order }, -4008 => %{ description: "TICK_SIZE_LESS_THAN_ZERO", type: :invalid_order }, -4009 => %{ description: "MAX_PRICE_LESS_THAN_MIN_PRICE", type: :invalid_order }, -4010 => %{ description: "MAX_QTY_LESS_THAN_MIN_QTY", type: :invalid_order }, -4011 => %{ description: "STEP_SIZE_LESS_THAN_ZERO", type: :invalid_order }, -4012 => %{ description: "MAX_NUM_ORDERS_LESS_THAN_ZERO", type: :rate_limited }, -4013 => %{ description: "PRICE_LESS_THAN_MIN_PRICE", type: :invalid_order }, -4014 => %{ description: "PRICE_NOT_INCREASED_BY_TICK_SIZE", type: :invalid_order }, -4015 => %{ description: "INVALID_CL_ORD_ID_LEN", type: :invalid_order }, -4016 => %{ description: "PRICE_HIGHTER_THAN_MULTIPLIER_UP", type: :invalid_order }, -4017 => %{ description: "MULTIPLIER_UP_LESS_THAN_ZERO", type: :invalid_order }, -4018 => %{ description: "MULTIPLIER_DOWN_LESS_THAN_ZERO", type: :invalid_order }, -4019 => %{ description: "COMPOSITE_SCALE_OVERFLOW", type: :invalid_parameters }, -4020 => %{ description: "TARGET_STRATEGY_INVALID", type: :invalid_parameters }, -4021 => %{ description: "INVALID_DEPTH_LIMIT", type: :invalid_parameters }, -4022 => %{ description: "WRONG_MARKET_STATUS", type: :market_closed }, -4023 => %{ description: "QTY_NOT_INCREASED_BY_STEP_SIZE", type: :invalid_order }, -4024 => %{ description: "PRICE_LOWER_THAN_MULTIPLIER_DOWN", type: :invalid_order }, -4025 => %{ description: "MULTIPLIER_DECIMAL_LESS_THAN_ZERO", type: :invalid_parameters }, -4026 => %{ description: "COMMISSION_INVALID", type: :invalid_parameters }, -4027 => %{ description: "INVALID_ACCOUNT_TYPE", type: :invalid_parameters }, -4028 => %{ description: "INVALID_LEVERAGE", type: :invalid_parameters }, -4029 => %{ description: "INVALID_TICK_SIZE_PRECISION", type: :invalid_parameters }, -4030 => %{ description: "INVALID_STEP_SIZE_PRECISION", type: :invalid_parameters }, -4031 => %{ description: "INVALID_WORKING_TYPE", type: :invalid_parameters }, -4032 => %{ description: "EXCEED_MAX_CANCEL_ORDER_SIZE", type: :rate_limited }, -4033 => %{ description: "INSURANCE_ACCOUNT_NOT_FOUND", type: :access_restricted }, -4044 => %{ description: "INVALID_BALANCE_TYPE", type: :invalid_parameters }, -4045 => %{ description: "MAX_STOP_ORDER_EXCEEDED", type: :rate_limited }, -4046 => %{ description: "NO_NEED_TO_CHANGE_MARGIN_TYPE", type: :exchange_error }, -4047 => %{ description: "THERE_EXISTS_OPEN_ORDERS", type: :exchange_error }, -4048 => %{ description: "THERE_EXISTS_QUANTITY", type: :exchange_error }, -4049 => %{ description: "ADD_ISOLATED_MARGIN_REJECT", type: :exchange_error }, -4050 => %{ description: "CROSS_BALANCE_INSUFFICIENT", type: :insufficient_balance }, -4051 => %{ description: "ISOLATED_BALANCE_INSUFFICIENT", type: :insufficient_balance }, -4052 => %{ description: "NO_NEED_TO_CHANGE_AUTO_ADD_MARGIN", type: :exchange_error }, -4053 => %{ description: "AUTO_ADD_CROSSED_MARGIN_REJECT", type: :exchange_error }, -4054 => %{ description: "ADD_ISOLATED_MARGIN_NO_POSITION_REJECT", type: :exchange_error }, -4055 => %{ description: "AMOUNT_MUST_BE_POSITIVE", type: :invalid_parameters }, -4056 => %{ description: "INVALID_API_KEY_TYPE", type: :invalid_credentials }, -4057 => %{ description: "INVALID_RSA_PUBLIC_KEY", type: :invalid_credentials }, -4058 => %{ description: "MAX_PRICE_TOO_LARGE", type: :invalid_order }, -4059 => %{ description: "NO_NEED_TO_CHANGE_POSITION_SIDE", type: :exchange_error }, -4060 => %{ description: "INVALID_POSITION_SIDE", type: :invalid_order }, -4061 => %{ description: "POSITION_SIDE_NOT_MATCH", type: :invalid_order }, -4062 => %{ description: "REDUCE_ONLY_CONFLICT", type: :exchange_error }, -4063 => %{ description: "INVALID_OPTIONS_REQUEST_TYPE", type: :invalid_parameters }, -4064 => %{ description: "INVALID_OPTIONS_TIME_FRAME", type: :invalid_parameters }, -4065 => %{ description: "INVALID_OPTIONS_AMOUNT", type: :invalid_parameters }, -4066 => %{ description: "INVALID_OPTIONS_EVENT_TYPE", type: :invalid_parameters }, -4067 => %{ description: "POSITION_SIDE_CHANGE_EXISTS_OPEN_ORDERS", type: :exchange_error }, -4068 => %{ description: "POSITION_SIDE_CHANGE_EXISTS_QUANTITY", type: :exchange_error }, -4069 => %{ description: "INVALID_OPTIONS_PREMIUM_FEE", type: :invalid_parameters }, -4070 => %{ description: "INVALID_CL_OPTIONS_ID_LEN", type: :invalid_order }, -4071 => %{ description: "INVALID_OPTIONS_DIRECTION", type: :invalid_order }, -4072 => %{ description: "OPTIONS_PREMIUM_NOT_UPDATE", type: :exchange_error }, -4073 => %{ description: "OPTIONS_PREMIUM_INPUT_LESS_THAN_ZERO", type: :invalid_parameters }, -4074 => %{ description: "OPTIONS_AMOUNT_BIGGER_THAN_UPPER", type: :invalid_order }, -4075 => %{ description: "OPTIONS_PREMIUM_OUTPUT_ZERO", type: :exchange_error }, -4076 => %{ description: "OPTIONS_PREMIUM_TOO_DIFF", type: :exchange_error }, -4077 => %{ description: "OPTIONS_PREMIUM_REACH_LIMIT", type: :rate_limited }, -4078 => %{ description: "OPTIONS_COMMON_ERROR", type: :invalid_parameters }, -4079 => %{ description: "INVALID_OPTIONS_ID", type: :invalid_parameters }, -4080 => %{ description: "OPTIONS_USER_NOT_FOUND", type: :invalid_parameters }, -4081 => %{ description: "OPTIONS_NOT_FOUND", type: :invalid_parameters }, -4082 => %{ description: "INVALID_BATCH_PLACE_ORDER_SIZE", type: :rate_limited }, -4083 => %{ description: "PLACE_BATCH_ORDERS_FAIL", type: :exchange_error }, -4084 => %{ description: "UPCOMING_METHOD", type: :exchange_error }, -4085 => %{ description: "INVALID_NOTIONAL_LIMIT_COEF", type: :invalid_parameters }, -4086 => %{ description: "INVALID_PRICE_SPREAD_THRESHOLD", type: :invalid_parameters }, -4087 => %{ description: "REDUCE_ONLY_ORDER_PERMISSION", type: :access_restricted }, -4088 => %{ description: "NO_PLACE_ORDER_PERMISSION", type: :access_restricted }, -4104 => %{ description: "INVALID_CONTRACT_TYPE", type: :invalid_order }, -4114 => %{ description: "INVALID_CLIENT_TRAN_ID_LEN", type: :invalid_order }, -4115 => %{ description: "DUPLICATED_CLIENT_TRAN_ID", type: :invalid_order }, -4118 => %{ description: "REDUCE_ONLY_MARGIN_CHECK_FAILED", type: :insufficient_balance }, -4131 => %{ description: "MARKET_ORDER_REJECT", type: :invalid_order }, -4135 => %{ description: "INVALID_ACTIVATION_PRICE", type: :invalid_order }, -4137 => %{ description: "QUANTITY_EXISTS_WITH_CLOSE_POSITION", type: :invalid_order }, -4138 => %{ description: "REDUCE_ONLY_MUST_BE_TRUE", type: :exchange_error }, -4139 => %{ description: "ORDER_TYPE_CANNOT_BE_MKT", type: :invalid_order }, -4140 => %{ description: "INVALID_OPENING_POSITION_STATUS", type: :exchange_error }, -4141 => %{ description: "SYMBOL_ALREADY_CLOSED", type: :market_closed }, -4142 => %{ description: "STRATEGY_INVALID_TRIGGER_PRICE", type: :invalid_order }, -4144 => %{ description: "INVALID_PAIR", type: :invalid_order }, -4161 => %{ description: "ISOLATED_LEVERAGE_REJECT_WITH_POSITION", type: :exchange_error }, -4164 => %{ description: "MIN_NOTIONAL", type: :invalid_order }, -4165 => %{ description: "INVALID_TIME_INTERVAL", type: :invalid_parameters }, -4183 => %{ description: "PRICE_HIGHTER_THAN_STOP_MULTIPLIER_UP", type: :invalid_order }, -4184 => %{ description: "PRICE_LOWER_THAN_STOP_MULTIPLIER_DOWN", type: :invalid_order }, -5060 => %{ description: "The limit order price does not meet the PERCENT_PRICE filter limit.", type: :exchange_error }, -5076 => %{ description: "Total order value should be more than 5 USDT", type: :exchange_error } }, error_codes: %{ -1000 => :exchange_error, -1001 => :network_error, -1002 => :invalid_credentials, -1003 => :rate_limited, -1004 => :invalid_order, -1005 => :invalid_parameters, -1006 => :exchange_error, -1007 => :network_error, -1010 => :exchange_error, -1011 => :access_restricted, -1013 => :invalid_parameters, -1014 => :invalid_order, -1015 => :rate_limited, -1016 => :exchange_error, -1020 => :exchange_error, -1021 => :invalid_credentials, -1022 => :invalid_credentials, -1023 => :invalid_parameters, -1100 => :invalid_parameters, -1101 => :invalid_parameters, -1102 => :invalid_parameters, -1103 => :invalid_parameters, -1104 => :invalid_parameters, -1105 => :invalid_parameters, -1106 => :invalid_parameters, -1108 => :invalid_parameters, -1109 => :invalid_parameters, -1110 => :invalid_order, -1111 => :invalid_parameters, -1112 => :invalid_parameters, -1113 => :invalid_parameters, -1114 => :invalid_parameters, -1115 => :invalid_order, -1116 => :invalid_order, -1117 => :invalid_order, -1118 => :invalid_order, -1119 => :invalid_order, -1120 => :invalid_parameters, -1121 => :invalid_order, -1125 => :invalid_credentials, -1127 => :invalid_parameters, -1128 => :invalid_parameters, -1130 => :invalid_parameters, -1136 => :invalid_order, -2010 => :invalid_order, -2011 => :order_not_found, -2013 => :order_not_found, -2014 => :invalid_credentials, -2015 => :invalid_credentials, -2016 => :market_closed, -2018 => :insufficient_balance, -2019 => :insufficient_balance, -2020 => :invalid_order, -2021 => :invalid_order, -2022 => :exchange_error, -2023 => :access_restricted, -2024 => :insufficient_balance, -2025 => :rate_limited, -2026 => :exchange_error, -2027 => :invalid_parameters, -2028 => :invalid_parameters, -4000 => :invalid_order, -4001 => :invalid_order, -4002 => :invalid_order, -4003 => :invalid_order, -4004 => :invalid_order, -4005 => :invalid_order, -4006 => :invalid_order, -4007 => :invalid_order, -4008 => :invalid_order, -4009 => :invalid_order, -4010 => :invalid_order, -4011 => :invalid_order, -4012 => :rate_limited, -4013 => :invalid_order, -4014 => :invalid_order, -4015 => :invalid_order, -4016 => :invalid_order, -4017 => :invalid_order, -4018 => :invalid_order, -4019 => :invalid_parameters, -4020 => :invalid_parameters, -4021 => :invalid_parameters, -4022 => :market_closed, -4023 => :invalid_order, -4024 => :invalid_order, -4025 => :invalid_parameters, -4026 => :invalid_parameters, -4027 => :invalid_parameters, -4028 => :invalid_parameters, -4029 => :invalid_parameters, -4030 => :invalid_parameters, -4031 => :invalid_parameters, -4032 => :rate_limited, -4033 => :access_restricted, -4044 => :invalid_parameters, -4045 => :rate_limited, -4046 => :exchange_error, -4047 => :exchange_error, -4048 => :exchange_error, -4049 => :exchange_error, -4050 => :insufficient_balance, -4051 => :insufficient_balance, -4052 => :exchange_error, -4053 => :exchange_error, -4054 => :exchange_error, -4055 => :invalid_parameters, -4056 => :invalid_credentials, -4057 => :invalid_credentials, -4058 => :invalid_order, -4059 => :exchange_error, -4060 => :invalid_order, -4061 => :invalid_order, -4062 => :exchange_error, -4063 => :invalid_parameters, -4064 => :invalid_parameters, -4065 => :invalid_parameters, -4066 => :invalid_parameters, -4067 => :exchange_error, -4068 => :exchange_error, -4069 => :invalid_parameters, -4070 => :invalid_order, -4071 => :invalid_order, -4072 => :exchange_error, -4073 => :invalid_parameters, -4074 => :invalid_order, -4075 => :exchange_error, -4076 => :exchange_error, -4077 => :rate_limited, -4078 => :invalid_parameters, -4079 => :invalid_parameters, -4080 => :invalid_parameters, -4081 => :invalid_parameters, -4082 => :rate_limited, -4083 => :exchange_error, -4084 => :exchange_error, -4085 => :invalid_parameters, -4086 => :invalid_parameters, -4087 => :access_restricted, -4088 => :access_restricted, -4104 => :invalid_order, -4114 => :invalid_order, -4115 => :invalid_order, -4118 => :insufficient_balance, -4131 => :invalid_order, -4135 => :invalid_order, -4137 => :invalid_order, -4138 => :exchange_error, -4139 => :invalid_order, -4140 => :exchange_error, -4141 => :market_closed, -4142 => :invalid_order, -4144 => :invalid_order, -4161 => :exchange_error, -4164 => :invalid_order, -4165 => :invalid_parameters, -4183 => :invalid_order, -4184 => :invalid_order, -5060 => :exchange_error, -5076 => :exchange_error }, exceptions: %{ exact: %{ "-1000" => :operation_failed, "-1001" => :network_error, "-1002" => :authentication_error, "-1003" => :rate_limit_exceeded, "-1004" => :duplicate_order_id, "-1005" => :bad_request, "-1006" => :bad_response, "-1007" => :request_timeout, "-1010" => :operation_failed, "-1011" => :permission_denied, "-1013" => :bad_request, "-1014" => :order_not_fillable, "-1015" => :rate_limit_exceeded, "-1016" => :exchange_closed_by_user, "-1020" => :not_supported, "-1021" => :invalid_nonce, "-1022" => :authentication_error, "-1023" => :bad_request, "-1100" => :bad_request, "-1101" => :bad_request, "-1102" => :arguments_required, "-1103" => :bad_request, "-1104" => :bad_request, "-1105" => :arguments_required, "-1106" => :bad_request, "-1108" => :bad_request, "-1109" => :bad_request, "-1110" => :bad_symbol, "-1111" => :bad_request, "-1112" => :bad_request, "-1113" => :bad_request, "-1114" => :bad_request, "-1115" => :invalid_order, "-1116" => :invalid_order, "-1117" => :invalid_order, "-1118" => :invalid_order, "-1119" => :invalid_order, "-1120" => :bad_request, "-1121" => :bad_symbol, "-1125" => :authentication_error, "-1127" => :bad_request, "-1128" => :bad_request, "-1130" => :bad_request, "-1136" => :invalid_order, "-2010" => :invalid_order, "-2011" => :order_not_found, "-2013" => :order_not_found, "-2014" => :authentication_error, "-2015" => :authentication_error, "-2016" => :market_closed, "-2018" => :insufficient_funds, "-2019" => :insufficient_funds, "-2020" => :order_not_fillable, "-2021" => :order_immediately_fillable, "-2022" => :operation_rejected, "-2023" => :account_suspended, "-2024" => :insufficient_funds, "-2025" => :rate_limit_exceeded, "-2026" => :not_supported, "-2027" => :bad_request, "-2028" => :bad_request, "-4000" => :invalid_order, "-4001" => :invalid_order, "-4002" => :invalid_order, "-4003" => :invalid_order, "-4004" => :invalid_order, "-4005" => :invalid_order, "-4006" => :invalid_order, "-4007" => :invalid_order, "-4008" => :invalid_order, "-4009" => :invalid_order, "-4010" => :invalid_order, "-4011" => :invalid_order, "-4012" => :rate_limit_exceeded, "-4013" => :invalid_order, "-4014" => :invalid_order, "-4015" => :invalid_order, "-4016" => :invalid_order, "-4017" => :invalid_order, "-4018" => :invalid_order, "-4019" => :bad_request, "-4020" => :bad_request, "-4021" => :bad_request, "-4022" => :market_closed, "-4023" => :invalid_order, "-4024" => :invalid_order, "-4025" => :bad_request, "-4026" => :bad_request, "-4027" => :bad_request, "-4028" => :bad_request, "-4029" => :bad_request, "-4030" => :bad_request, "-4031" => :bad_request, "-4032" => :rate_limit_exceeded, "-4033" => :account_not_enabled, "-4044" => :bad_request, "-4045" => :rate_limit_exceeded, "-4046" => :no_change, "-4047" => :operation_rejected, "-4048" => :operation_rejected, "-4049" => :operation_rejected, "-4050" => :insufficient_funds, "-4051" => :insufficient_funds, "-4052" => :no_change, "-4053" => :operation_rejected, "-4054" => :operation_rejected, "-4055" => :arguments_required, "-4056" => :authentication_error, "-4057" => :authentication_error, "-4058" => :invalid_order, "-4059" => :no_change, "-4060" => :invalid_order, "-4061" => :invalid_order, "-4062" => :operation_rejected, "-4063" => :bad_request, "-4064" => :bad_request, "-4065" => :bad_request, "-4066" => :bad_request, "-4067" => :operation_rejected, "-4068" => :operation_rejected, "-4069" => :bad_request, "-4070" => :invalid_order, "-4071" => :invalid_order, "-4072" => :no_change, "-4073" => :bad_request, "-4074" => :invalid_order, "-4075" => :operation_rejected, "-4076" => :operation_rejected, "-4077" => :rate_limit_exceeded, "-4078" => :bad_request, "-4079" => :bad_request, "-4080" => :bad_request, "-4081" => :bad_request, "-4082" => :rate_limit_exceeded, "-4083" => :operation_failed, "-4084" => :not_supported, "-4085" => :bad_request, "-4086" => :bad_request, "-4087" => :permission_denied, "-4088" => :permission_denied, "-4104" => :bad_symbol, "-4114" => :invalid_order, "-4115" => :duplicate_order_id, "-4118" => :insufficient_funds, "-4131" => :invalid_order, "-4135" => :invalid_order, "-4137" => :invalid_order, "-4138" => :operation_rejected, "-4139" => :invalid_order, "-4140" => :operation_rejected, "-4141" => :market_closed, "-4142" => :invalid_order, "-4144" => :bad_symbol, "-4161" => :operation_rejected, "-4164" => :invalid_order, "-4165" => :bad_request, "-4183" => :invalid_order, "-4184" => :invalid_order, "-5060" => :operation_rejected, "-5076" => :operation_rejected } }, exchange_options: %{ "accountsByType" => %{ "future" => "FUTURE", "linear" => "FUTURE", "spot" => "SPOT", "swap" => "FUTURE" }, "defaultNetworkCodeReplacements" => %{ "BRC20" => %{ "BRC20" => "BTC" }, "CRO" => %{ "CRC20" => "CRONOS" }, "ETH" => %{ "ERC20" => "ETH" }, "TRX" => %{ "TRC20" => "TRX" } }, "defaultTimeInForce" => "GTC", "defaultType" => "spot", "networks" => %{ "ARB" => "Arbitrum", "BEP20" => "BSC", "ERC20" => "ETH" }, "networksById" => %{ "Arbitrum" => "ARB", "BSC" => "BEP20", "ETH" => "ERC20" }, "networksToChainId" => %{ "Arbitrum" => 42161, "BSC" => 56, "ETH" => 1 }, "quoteOrderQty" => true, "recvWindow" => 10000, "zeroAddress" => "0x0000000000000000000000000000000000000000" }, extended_metadata: %{ fees_url: "https://docs.asterdex.com/product/asterex-simple/fees-and-slippage", limits: %{ "amount" => %{}, "cost" => %{}, "leverage" => %{}, "price" => %{} }, logo_url: "https://github.com/user-attachments/assets/4982201b-73cd-4d7a-8907-e69e239e9609", referral_discount: 0.1, referral_url: "https://www.asterdex.com/en/referral/aA1c2B" }, extracted_metadata: %{ ccxt_version: "4.5.34" }, features: nil, fees: %{ trading: %{ maker: 0.0001, percentage: true, taker: 3.5e-4, tier_based: true } }, handle_content_type_application_zip: nil, handle_errors_source: "handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {\n if (response === undefined) {\n return undefined; // fallback to default error handler\n }\n //\n // {\n // \"code\": -1121,\n // \"msg\": \"Invalid symbol.\",\n // }\n //\n const code = this.safeString(response, 'code');\n const message = this.safeString(response, 'msg');\n if (code !== undefined && code !== '200') {\n const feedback = this.id + ' ' + body;\n this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);\n this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);\n this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);\n throw new errors.ExchangeError(feedback); // unknown message\n }\n return undefined;\n }", has: %{ add_margin: true, borrow_cross_margin: false, borrow_isolated_margin: false, borrow_margin: false, c_o_r_s: false, cancel_all_orders: true, cancel_all_orders_ws: false, cancel_order: true, cancel_order_with_client_order_id: false, cancel_order_ws: false, cancel_orders: true, cancel_orders_with_client_order_id: false, cancel_orders_ws: false, close_all_positions: false, close_position: false, create_convert_trade: false, create_deposit_address: false, create_limit_buy_order: false, create_limit_buy_order_ws: false, create_limit_order: true, create_limit_order_ws: false, create_limit_sell_order: false, create_limit_sell_order_ws: false, create_market_buy_order: false, create_market_buy_order_with_cost: false, create_market_buy_order_with_cost_ws: false, create_market_buy_order_ws: false, create_market_order: true, create_market_order_with_cost: false, create_market_order_with_cost_ws: false, create_market_order_ws: true, create_market_sell_order: false, create_market_sell_order_with_cost: false, create_market_sell_order_with_cost_ws: false, create_market_sell_order_ws: false, create_order: true, create_order_with_take_profit_and_stop_loss: false, create_order_with_take_profit_and_stop_loss_ws: false, create_order_ws: false, create_orders: false, create_post_only_order: false, create_post_only_order_ws: false, create_reduce_only_order: false, create_reduce_only_order_ws: false, create_stop_limit_order: false, create_stop_limit_order_ws: false, create_stop_loss_order: false, create_stop_loss_order_ws: false, create_stop_market_order: false, create_stop_market_order_ws: false, create_stop_order: false, create_stop_order_ws: false, create_take_profit_order: false, create_take_profit_order_ws: false, create_trailing_amount_order: false, create_trailing_amount_order_ws: false, create_trailing_percent_order: false, create_trailing_percent_order_ws: false, create_trigger_order: false, create_trigger_order_ws: false, deposit: false, edit_order: false, edit_order_with_client_order_id: false, edit_order_ws: false, edit_orders: false, fetch_accounts: false, fetch_balance: true, fetch_balance_ws: false, fetch_bids_asks: false, fetch_borrow_interest: false, fetch_borrow_rate: false, fetch_borrow_rate_histories: false, fetch_borrow_rate_history: false, fetch_borrow_rates: false, fetch_borrow_rates_per_symbol: false, fetch_canceled_and_closed_orders: true, fetch_canceled_orders: true, fetch_closed_order: false, fetch_closed_orders: true, fetch_closed_orders_ws: false, fetch_convert_currencies: false, fetch_convert_quote: false, fetch_convert_trade: false, fetch_convert_trade_history: false, fetch_cross_borrow_rate: false, fetch_cross_borrow_rates: false, fetch_currencies: true, fetch_currencies_ws: true, fetch_deposit: false, fetch_deposit_address: false, fetch_deposit_addresses: false, fetch_deposit_addresses_by_network: false, fetch_deposit_withdraw_fee: true, fetch_deposit_withdraw_fees: false, fetch_deposits: false, fetch_deposits_withdrawals: false, fetch_deposits_ws: false, fetch_funding_history: true, fetch_funding_interval: true, fetch_funding_intervals: true, fetch_funding_rate: true, fetch_funding_rate_history: true, fetch_funding_rates: true, fetch_greeks: false, fetch_index_ohlcv: false, fetch_isolated_borrow_rate: true, fetch_isolated_borrow_rates: false, fetch_isolated_positions: false, fetch_l2_order_book: true, fetch_l3_order_book: false, fetch_last_prices: false, fetch_ledger: true, fetch_ledger_entry: false, fetch_leverage: true, fetch_leverage_tiers: false, fetch_leverages: true, fetch_liquidations: false, fetch_long_short_ratio: false, fetch_long_short_ratio_history: false, fetch_margin_adjustment_history: true, fetch_margin_mode: true, fetch_margin_modes: true, fetch_mark_ohlcv: false, fetch_mark_price: false, fetch_mark_prices: false, fetch_market_leverage_tiers: true, fetch_markets: true, fetch_markets_ws: false, fetch_my_liquidations: false, fetch_my_settlement_history: false, fetch_my_trades: true, fetch_my_trades_ws: false, fetch_ohlcv: true, fetch_ohlcv_ws: false, fetch_open_interest: false, fetch_open_interest_history: false, fetch_open_interests: false, fetch_open_order: true, fetch_open_orders: true, fetch_open_orders_ws: false, fetch_option: false, fetch_option_chain: false, fetch_order: true, fetch_order_book: true, fetch_order_book_ws: false, fetch_order_books: false, fetch_order_trades: false, fetch_order_with_client_order_id: false, fetch_order_ws: false, fetch_orders: true, fetch_orders_by_status: false, fetch_orders_ws: false, fetch_position: false, fetch_position_history: false, fetch_position_mode: true, fetch_position_ws: false, fetch_positions: true, fetch_positions_for_symbol: false, fetch_positions_for_symbol_ws: false, fetch_positions_history: false, fetch_positions_risk: true, fetch_positions_ws: false, fetch_premium_index_ohlcv: false, fetch_settlement_history: false, fetch_status: false, fetch_ticker: true, fetch_ticker_ws: false, fetch_tickers: true, fetch_tickers_ws: false, fetch_time: true, fetch_trades: true, fetch_trades_ws: false, fetch_trading_fee: true, fetch_trading_fees: false, fetch_trading_fees_ws: false, fetch_trading_limits: true, fetch_transaction_fee: true, fetch_transaction_fees: false, fetch_transactions: false, fetch_transfer: false, fetch_transfers: false, fetch_underlying_assets: false, fetch_volatility_history: false, fetch_withdraw_addresses: false, fetch_withdrawal: false, fetch_withdrawal_whitelist: false, fetch_withdrawals: false, fetch_withdrawals_ws: false, future: false, margin: false, option: false, private_api: true, public_api: true, reduce_margin: true, repay_cross_margin: false, repay_isolated_margin: false, sandbox: false, set_leverage: true, set_margin: false, set_margin_mode: true, set_position_mode: true, sign_in: false, spot: false, swap: false, transfer: true, un_watch_my_trades: false, un_watch_ohlcv: false, un_watch_ohlcv_for_symbols: false, un_watch_order_book: false, un_watch_order_book_for_symbols: false, un_watch_orders: false, un_watch_positions: false, un_watch_ticker: false, un_watch_tickers: false, un_watch_trades: false, un_watch_trades_for_symbols: false, watch_balance: true, watch_bids_asks: true, watch_liquidations: false, watch_liquidations_for_symbols: false, watch_mark_price: true, watch_mark_prices: true, watch_my_liquidations: false, watch_my_liquidations_for_symbols: false, watch_my_trades: true, watch_ohlcv: true, watch_ohlcv_for_symbols: true, watch_order_book: true, watch_order_book_for_symbols: true, watch_orders: true, watch_orders_for_symbols: false, watch_position: false, watch_positions: true, watch_status: false, watch_ticker: true, watch_tickers: true, watch_trades: true, watch_trades_for_symbols: true, withdraw: true, ws: false }, http_config: nil, id: "aster", markets: nil, name: "Aster", ohlcv_timestamp_resolution: :milliseconds, options: %{ accounts_by_type: %{ "future" => "FUTURE", "linear" => "FUTURE", "spot" => "SPOT", "swap" => "FUTURE" }, default_account_type: "spot", default_time_in_force: "GTC", default_type: "spot", networks: %{ "ARB" => "Arbitrum", "BEP20" => "BSC", "ERC20" => "ETH" }, networks_to_chain_id: %{ "Arbitrum" => 42161, "BSC" => 56, "ETH" => 1 }, quote_order_qty: true, recv_window: 10000, zero_address: "0x0000000000000000000000000000000000000000" }, order_mappings: %{ side_format: :uppercase, side_key: "side", type_format: :uppercase, type_key: "type" }, param_mappings: %{ "amount" => "quantity", "arg0" => "orderId", "arg1" => "symbol", "code" => "asset", "hedged" => "dualSidePosition", "id" => "orderId", "marginMode" => "marginType", "since" => "startTime", "timeframe" => "interval" }, parse_methods: [ %{ "comment" => nil, "examples" => [], "line_end" => 3439, "line_start" => 3278, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "position" }, %{ "comment" => nil, "key" => "id", "value" => "undefined" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "initialMargin", "value" => "initialMargin" }, %{ "comment" => nil, "key" => "initialMarginPercentage", "value" => "this.parseNumber (initialMarginPercentageString)" }, %{ "comment" => nil, "key" => "maintenanceMargin", "value" => "maintenanceMargin" }, %{ "comment" => nil, "key" => "maintenanceMarginPercentage", "value" => "maintenanceMarginPercentage" }, %{ "comment" => nil, "key" => "entryPrice", "value" => "entryPrice" }, %{ "comment" => nil, "key" => "notional", "value" => "notional" }, %{ "comment" => nil, "key" => "leverage", "value" => "this.parseNumber (leverageString)" }, %{ "comment" => nil, "key" => "unrealizedPnl", "value" => "unrealizedPnl" }, %{ "comment" => nil, "key" => "contracts", "value" => "contracts" }, %{ "comment" => nil, "key" => "contractSize", "value" => "contractSize" }, %{ "comment" => nil, "key" => "marginRatio", "value" => "marginRatio" }, %{ "comment" => nil, "key" => "liquidationPrice", "value" => "liquidationPrice" }, %{ "comment" => nil, "key" => "markPrice", "value" => "undefined" }, %{ "comment" => nil, "key" => "collateral", "value" => "collateral" }, %{ "comment" => nil, "key" => "marginMode", "value" => "marginMode" }, %{ "comment" => nil, "key" => "side", "value" => "side" }, %{ "comment" => nil, "key" => "hedged", "value" => "hedged" }, %{ "comment" => nil, "key" => "percentage", "value" => "percentage" } ], "name" => "parseAccountPosition", "signature" => "parseAccountPosition (position, market: Market = undefined)", "source" => "parseAccountPosition (position, market: Market = undefined) {\n const marketId = this.safeString (position, 'symbol');\n market = this.safeMarket (marketId, market, undefined, 'contract');\n const symbol = this.safeString (market, 'symbol');\n const leverageString = this.safeString (position, 'leverage');\n const leverage = (leverageString !== undefined) ? parseInt (leverageString) : undefined;\n const initialMarginString = this.safeString (position, 'initialMargin');\n const initialMargin = this.parseNumber (initialMarginString);\n let initialMarginPercentageString = undefined;\n if (leverageString !== undefined) {\n initialMarginPercentageString = Precise.stringDiv ('1', leverageString, 8);\n const rational = this.isRoundNumber (1000 % leverage);\n if (!rational) {\n initialMarginPercentageString = Precise.stringDiv (Precise.stringAdd (initialMarginPercentageString, '1e-8'), '1', 8);\n }\n }\n // as oppose to notionalValue\n const usdm = ('notional' in position);\n const maintenanceMarginString = this.safeString (position, 'maintMargin');\n const maintenanceMargin = this.parseNumber (maintenanceMarginString);\n const entryPriceString = this.safeString (position, 'entryPrice');\n let entryPrice = this.parseNumber (entryPriceString);\n const notionalString = this.safeString2 (position, 'notional', 'notionalValue');\n const notionalStringAbs = Precise.stringAbs (notionalString);\n const notional = this.parseNumber (notionalStringAbs);\n let contractsString = this.safeString (position, 'positionAmt');\n let contractsStringAbs = Precise.stringAbs (contractsString);\n if (contractsString === undefined) {\n const entryNotional = Precise.stringMul (Precise.stringMul (leverageString, initialMarginString), entryPriceString);\n const contractSizeNew = this.safeString (market, 'contractSize');\n contractsString = Precise.stringDiv (entryNotional, contractSizeNew);\n contractsStringAbs = Precise.stringDiv (Precise.stringAdd (contractsString, '0.5'), '1', 0);\n }\n const contracts = this.parseNumber (contractsStringAbs);\n const leverageBrackets = this.safeDict (this.options, 'leverageBrackets', {});\n const leverageBracket = this.safeList (leverageBrackets, symbol, []);\n let maintenanceMarginPercentageString = undefined;\n for (let i = 0; i < leverageBracket.length; i++) {\n const bracket = leverageBracket[i];\n if (Precise.stringLt (notionalStringAbs, bracket[0])) {\n break;\n }\n maintenanceMarginPercentageString = bracket[1];\n }\n const maintenanceMarginPercentage = this.parseNumber (maintenanceMarginPercentageString);\n const unrealizedPnlString = this.safeString (position, 'unrealizedProfit');\n const unrealizedPnl = this.parseNumber (unrealizedPnlString);\n let timestamp = this.safeInteger (position, 'updateTime');\n if (timestamp === 0) {\n timestamp = undefined;\n }\n let isolated = this.safeBool (position, 'isolated');\n if (isolated === undefined) {\n const isolatedMarginRaw = this.safeString (position, 'isolatedMargin');\n isolated = !Precise.stringEq (isolatedMarginRaw, '0');\n }\n let marginMode = undefined;\n let collateralString = undefined;\n let walletBalance = undefined;\n if (isolated) {\n marginMode = 'isolated';\n walletBalance = this.safeString (position, 'isolatedWallet');\n collateralString = Precise.stringAdd (walletBalance, unrealizedPnlString);\n } else {\n marginMode = 'cross';\n walletBalance = this.safeString (position, 'crossWalletBalance');\n collateralString = this.safeString (position, 'crossMargin');\n }\n const collateral = this.parseNumber (collateralString);\n let marginRatio = undefined;\n let side = undefined;\n let percentage = undefined;\n let liquidationPriceStringRaw = undefined;\n let liquidationPrice = undefined;\n const contractSize = this.safeValue (market, 'contractSize');\n const contractSizeString = this.numberToString (contractSize);\n if (Precise.stringEquals (notionalString, '0')) {\n entryPrice = undefined;\n } else {\n side = Precise.stringLt (notionalString, '0') ? 'short' : 'long';\n marginRatio = this.parseNumber (Precise.stringDiv (Precise.stringAdd (Precise.stringDiv (maintenanceMarginString, collateralString), '5e-5'), '1', 4));\n percentage = this.parseNumber (Precise.stringMul (Precise.stringDiv (unrealizedPnlString, initialMarginString, 4), '100'));\n if (usdm) {\n // calculate liquidation price\n //\n // liquidationPrice = (walletBalance / (contracts * (±1 + mmp))) + (±entryPrice / (±1 + mmp))\n //\n // mmp = maintenanceMarginPercentage\n // where ± is negative for long and positive for short\n // TODO: calculate liquidation price for coinm contracts\n let onePlusMaintenanceMarginPercentageString = undefined;\n let entryPriceSignString = entryPriceString;\n if (side === 'short') {\n onePlusMaintenanceMarginPercentageString = Precise.stringAdd ('1', maintenanceMarginPercentageString);\n } else {\n onePlusMaintenanceMarginPercentageString = Precise.stringAdd ('-1', maintenanceMarginPercentageString);\n entryPriceSignString = Precise.stringMul ('-1', entryPriceSignString);\n }\n const leftSide = Precise.stringDiv (walletBalance, Precise.stringMul (contractsStringAbs, onePlusMaintenanceMarginPercentageString));\n const rightSide = Precise.stringDiv (entryPriceSignString, onePlusMaintenanceMarginPercentageString);\n liquidationPriceStringRaw = Precise.stringAdd (leftSide, rightSide);\n } else {\n // calculate liquidation price\n //\n // liquidationPrice = (contracts * contractSize(±1 - mmp)) / (±1/entryPrice * contracts * contractSize - walletBalance)\n //\n let onePlusMaintenanceMarginPercentageString = undefined;\n let entryPriceSignString = entryPriceString;\n if (side === 'short') {\n onePlusMaintenanceMarginPercentageString = Precise.stringSub ('1', maintenanceMarginPercentageString);\n } else {\n onePlusMaintenanceMarginPercentageString = Precise.stringSub ('-1', maintenanceMarginPercentageString);\n entryPriceSignString = Precise.stringMul ('-1', entryPriceSignString);\n }\n const size = Precise.stringMul (contractsStringAbs, contractSizeString);\n const leftSide = Precise.stringMul (size, onePlusMaintenanceMarginPercentageString);\n const rightSide = Precise.stringSub (Precise.stringMul (Precise.stringDiv ('1', entryPriceSignString), size), walletBalance);\n liquidationPriceStringRaw = Precise.stringDiv (leftSide, rightSide);\n }\n const pricePrecision = this.precisionFromString (this.safeString (market['precision'], 'price'));\n const pricePrecisionPlusOne = pricePrecision + 1;\n const pricePrecisionPlusOneString = pricePrecisionPlusOne.toString ();\n // round half up\n const rounder = new Precise ('5e-' + pricePrecisionPlusOneString);\n const rounderString = rounder.toString ();\n const liquidationPriceRoundedString = Precise.stringAdd (rounderString, liquidationPriceStringRaw);\n let truncatedLiquidationPrice = Precise.stringDiv (liquidationPriceRoundedString, '1', pricePrecision);\n if (truncatedLiquidationPrice[0] === '-') {\n // user cannot be liquidated\n // since he has more collateral than the size of the position\n truncatedLiquidationPrice = undefined;\n }\n liquidationPrice = this.parseNumber (truncatedLiquidationPrice);\n }\n const positionSide = this.safeString (position, 'positionSide');\n const hedged = positionSide !== 'BOTH';\n return {\n 'info': position,\n 'id': undefined,\n 'symbol': symbol,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'initialMargin': initialMargin,\n 'initialMarginPercentage': this.parseNumber (initialMarginPercentageString),\n 'maintenanceMargin': maintenanceMargin,\n 'maintenanceMarginPercentage': maintenanceMarginPercentage,\n 'entryPrice': entryPrice,\n 'notional': notional,\n 'leverage': this.parseNumber (leverageString),\n 'unrealizedPnl': unrealizedPnl,\n 'contracts': contracts,\n 'contractSize': contractSize,\n 'marginRatio': marginRatio,\n 'liquidationPrice': liquidationPrice,\n 'markPrice': undefined,\n 'collateral': collateral,\n 'marginMode': marginMode,\n 'side': side,\n 'hedged': hedged,\n 'percentage': percentage,\n };\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 3276, "line_start" => 3240, "mappings" => [ %{ "comment" => nil, "key" => "crossMargin", "value" => "balances[code]['crossMargin']" }, %{ "comment" => nil, "key" => "crossWalletBalance", "value" => "balances[code]['crossWalletBalance']" }, %{ "comment" => nil, "key" => "crossMargin", "value" => "Precise.stringAdd (crossWalletBalance, crossUnPnl)" }, %{ "comment" => nil, "key" => "crossWalletBalance", "value" => "crossWalletBalance" } ], "name" => "parseAccountPositions", "signature" => "parseAccountPositions (account, filterClosed = false)", "source" => "parseAccountPositions (account, filterClosed = false) {\n const positions = this.safeList (account, 'positions');\n const assets = this.safeList (account, 'assets', []);\n const balances: Dict = {};\n for (let i = 0; i < assets.length; i++) {\n const entry = assets[i];\n const currencyId = this.safeString (entry, 'asset');\n const code = this.safeCurrencyCode (currencyId);\n const crossWalletBalance = this.safeString (entry, 'crossWalletBalance');\n const crossUnPnl = this.safeString (entry, 'crossUnPnl');\n balances[code] = {\n 'crossMargin': Precise.stringAdd (crossWalletBalance, crossUnPnl),\n 'crossWalletBalance': crossWalletBalance,\n };\n }\n const result = [];\n for (let i = 0; i < positions.length; i++) {\n const position = positions[i];\n const marketId = this.safeString (position, 'symbol');\n const market = this.safeMarket (marketId, undefined, undefined, 'contract');\n const code = market['linear'] ? market['quote'] : market['base'];\n const maintenanceMargin = this.safeString (position, 'maintMargin');\n // check for maintenance margin so empty positions are not returned\n const isPositionOpen = (maintenanceMargin !== '0') && (maintenanceMargin !== '0.00000000');\n if (!filterClosed || isPositionOpen) {\n // sometimes not all the codes are correctly returned...\n if (code in balances) {\n const parsed = this.parseAccountPosition (this.extend (position, {\n 'crossMargin': balances[code]['crossMargin'],\n 'crossWalletBalance': balances[code]['crossWalletBalance'],\n }), market);\n result.push (parsed);\n }\n }\n }\n return result;\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 1639, "line_start" => 1626, "mappings" => [], "name" => "parseBalance", "signature" => "parseBalance (response): Balances", "source" => "parseBalance (response): Balances {\n const result: Dict = { 'info': response };\n for (let i = 0; i < response.length; i++) {\n const balance = response[i];\n const currencyId = this.safeString (balance, 'asset');\n const code = this.safeCurrencyCode (currencyId);\n const account = this.account ();\n account['free'] = this.safeString2 (balance, 'free', 'maxWithdrawAmount');\n account['used'] = this.safeString (balance, 'locked');\n account['total'] = this.safeString (balance, 'walletBalance');\n result[code] = account;\n }\n return this.safeBalance (result);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"BTCUSDT\",\n \"markPrice\": \"106729.84047826\",\n \"indexPrice\": \"106775.72673913\",\n \"estimatedSettlePrice\": \"106708.84997006\",\n \"lastFundingRate\": \"0.00010000\",\n \"interestRate\": \"0.00010000\",\n \"nextFundingTime\": 1750147200000,\n \"time\": 1750146970000\n }", "{\n \"symbol\": \"INJUSDT\",\n \"interestRate\": \"0.00010000\",\n \"time\": 1756197479000,\n \"fundingIntervalHours\": 8,\n \"fundingFeeCap\": 0.03,\n \"fundingFeeFloor\": -0.03\n }" ], "line_end" => 1530, "line_start" => 1481, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "contract" }, %{ "comment" => nil, "key" => "symbol", "value" => "this.safeSymbol (marketId, market, undefined, 'contract')" }, %{ "comment" => nil, "key" => "markPrice", "value" => "this.safeNumber (contract, 'markPrice')" }, %{ "comment" => nil, "key" => "indexPrice", "value" => "this.safeNumber (contract, 'indexPrice')" }, %{ "comment" => nil, "key" => "interestRate", "value" => "this.safeNumber (contract, 'interestRate')" }, %{ "comment" => nil, "key" => "estimatedSettlePrice", "value" => "this.safeNumber (contract, 'estimatedSettlePrice')" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "fundingRate", "value" => "this.safeNumber (contract, 'lastFundingRate')" }, %{ "comment" => nil, "key" => "fundingTimestamp", "value" => "undefined" }, %{ "comment" => nil, "key" => "fundingDatetime", "value" => "undefined" }, %{ "comment" => nil, "key" => "nextFundingRate", "value" => "undefined" }, %{ "comment" => nil, "key" => "nextFundingTimestamp", "value" => "nextFundingTimestamp" }, %{ "comment" => nil, "key" => "nextFundingDatetime", "value" => "this.iso8601 (nextFundingTimestamp)" }, %{ "comment" => nil, "key" => "previousFundingRate", "value" => "undefined" }, %{ "comment" => nil, "key" => "previousFundingTimestamp", "value" => "undefined" }, %{ "comment" => nil, "key" => "previousFundingDatetime", "value" => "undefined" }, %{ "comment" => nil, "key" => "interval", "value" => "intervalString" } ], "name" => "parseFundingRate", "signature" => "parseFundingRate (contract, market: Market = undefined): FundingRate", "source" => "parseFundingRate (contract, market: Market = undefined): FundingRate {\n //\n // {\n // \"symbol\": \"BTCUSDT\",\n // \"markPrice\": \"106729.84047826\",\n // \"indexPrice\": \"106775.72673913\",\n // \"estimatedSettlePrice\": \"106708.84997006\",\n // \"lastFundingRate\": \"0.00010000\",\n // \"interestRate\": \"0.00010000\",\n // \"nextFundingTime\": 1750147200000,\n // \"time\": 1750146970000\n // }\n // {\n // \"symbol\": \"INJUSDT\",\n // \"interestRate\": \"0.00010000\",\n // \"time\": 1756197479000,\n // \"fundingIntervalHours\": 8,\n // \"fundingFeeCap\": 0.03,\n // \"fundingFeeFloor\": -0.03\n // }\n //\n const marketId = this.safeString (contract, 'symbol');\n const nextFundingTimestamp = this.safeInteger (contract, 'nextFundingTime');\n const timestamp = this.safeInteger (contract, 'time');\n const interval = this.safeString (contract, 'fundingIntervalHours');\n let intervalString = undefined;\n if (interval !== undefined) {\n intervalString = interval + 'h';\n }\n return {\n 'info': contract,\n 'symbol': this.safeSymbol (marketId, market, undefined, 'contract'),\n 'markPrice': this.safeNumber (contract, 'markPrice'),\n 'indexPrice': this.safeNumber (contract, 'indexPrice'),\n 'interestRate': this.safeNumber (contract, 'interestRate'),\n 'estimatedSettlePrice': this.safeNumber (contract, 'estimatedSettlePrice'),\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'fundingRate': this.safeNumber (contract, 'lastFundingRate'),\n 'fundingTimestamp': undefined,\n 'fundingDatetime': undefined,\n 'nextFundingRate': undefined,\n 'nextFundingTimestamp': nextFundingTimestamp,\n 'nextFundingDatetime': this.iso8601 (nextFundingTimestamp),\n 'previousFundingRate': undefined,\n 'previousFundingTimestamp': undefined,\n 'previousFundingDatetime': undefined,\n 'interval': intervalString,\n } as FundingRate;\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"ETHUSDT\",\n \"incomeType\": \"FUNDING_FEE\",\n \"income\": \"0.00134317\",\n \"asset\": \"USDT\",\n \"time\": \"1621584000000\",\n \"info\": \"FUNDING_FEE\",\n \"tranId\": \"4480321991774044580\",\n \"tradeId\": \"\"\n }" ], "line_end" => 2847, "line_start" => 2822, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "income" }, %{ "comment" => nil, "key" => "symbol", "value" => "this.safeSymbol (marketId, market, undefined, 'swap')" }, %{ "comment" => nil, "key" => "code", "value" => "this.safeCurrencyCode (currencyId)" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "id", "value" => "this.safeString (income, 'tranId')" }, %{ "comment" => nil, "key" => "amount", "value" => "this.safeNumber (income, 'income')" } ], "name" => "parseIncome", "signature" => "parseIncome (income, market: Market = undefined)", "source" => "parseIncome (income, market: Market = undefined) {\n //\n // {\n // \"symbol\": \"ETHUSDT\",\n // \"incomeType\": \"FUNDING_FEE\",\n // \"income\": \"0.00134317\",\n // \"asset\": \"USDT\",\n // \"time\": \"1621584000000\",\n // \"info\": \"FUNDING_FEE\",\n // \"tranId\": \"4480321991774044580\",\n // \"tradeId\": \"\"\n // }\n //\n const marketId = this.safeString (income, 'symbol');\n const currencyId = this.safeString (income, 'asset');\n const timestamp = this.safeInteger (income, 'time');\n return {\n 'info': income,\n 'symbol': this.safeSymbol (marketId, market, undefined, 'swap'),\n 'code': this.safeCurrencyCode (currencyId),\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'id': this.safeString (income, 'tranId'),\n 'amount': this.safeNumber (income, 'income'),\n };\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"\",\n \"incomeType\": \"TRANSFER\",\n \"income\": \"10.00000000\",\n \"asset\": \"USDT\",\n \"time\": 1677645250000,\n \"info\": \"TRANSFER\",\n \"tranId\": 131001573082,\n \"tradeId\": \"\"\n }" ], "line_end" => 2927, "line_start" => 2884, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "item" }, %{ "comment" => nil, "key" => "id", "value" => "this.safeString (item, 'tranId')" }, %{ "comment" => nil, "key" => "direction", "value" => "direction" }, %{ "comment" => nil, "key" => "account", "value" => "undefined" }, %{ "comment" => nil, "key" => "referenceAccount", "value" => "undefined" }, %{ "comment" => nil, "key" => "referenceId", "value" => "this.safeString (item, 'tradeId')" }, %{ "comment" => nil, "key" => "type", "value" => "this.parseLedgerEntryType (type)" }, %{ "comment" => nil, "key" => "currency", "value" => "code" }, %{ "comment" => nil, "key" => "amount", "value" => "this.parseNumber (amount)" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "before", "value" => "undefined" }, %{ "comment" => nil, "key" => "after", "value" => "undefined" }, %{ "comment" => nil, "key" => "status", "value" => "undefined" }, %{ "comment" => nil, "key" => "fee", "value" => "undefined" } ], "name" => "parseLedgerEntry", "signature" => "parseLedgerEntry (item: Dict, currency: Currency = undefined): LedgerEntry", "source" => "parseLedgerEntry (item: Dict, currency: Currency = undefined): LedgerEntry {\n //\n // {\n // \"symbol\": \"\",\n // \"incomeType\": \"TRANSFER\",\n // \"income\": \"10.00000000\",\n // \"asset\": \"USDT\",\n // \"time\": 1677645250000,\n // \"info\": \"TRANSFER\",\n // \"tranId\": 131001573082,\n // \"tradeId\": \"\"\n // }\n //\n let amount = this.safeString (item, 'income');\n let direction = undefined;\n if (Precise.stringLe (amount, '0')) {\n direction = 'out';\n amount = Precise.stringMul ('-1', amount);\n } else {\n direction = 'in';\n }\n const currencyId = this.safeString (item, 'asset');\n const code = this.safeCurrencyCode (currencyId, currency);\n currency = this.safeCurrency (currencyId, currency);\n const timestamp = this.safeInteger (item, 'time');\n const type = this.safeString (item, 'incomeType');\n return this.safeLedgerEntry ({\n 'info': item,\n 'id': this.safeString (item, 'tranId'),\n 'direction': direction,\n 'account': undefined,\n 'referenceAccount': undefined,\n 'referenceId': this.safeString (item, 'tradeId'),\n 'type': this.parseLedgerEntryType (type),\n 'currency': code,\n 'amount': this.parseNumber (amount),\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'before': undefined,\n 'after': undefined,\n 'status': undefined,\n 'fee': undefined,\n }, currency) as LedgerEntry;\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 2940, "line_start" => 2929, "mappings" => [], "name" => "parseLedgerEntryType", "signature" => "parseLedgerEntryType (type)", "source" => "parseLedgerEntryType (type) {\n const ledgerType: Dict = {\n 'TRANSFER': 'transfer',\n 'WELCOME_BONUS': 'cashback',\n 'REALIZED_PNL': 'trade',\n 'FUNDING_FEE': 'fee',\n 'COMMISSION': 'commission',\n 'INSURANCE_CLEAR': 'settlement',\n 'MARKET_MERCHANT_RETURN_REWARD': 'cashback',\n };\n return this.safeString (ledgerType, type, type);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"INJUSDT\",\n \"positionAmt\": \"0.0\",\n \"entryPrice\": \"0.0\",\n \"markPrice\": \"0.00000000\",\n \"unRealizedProfit\": \"0.00000000\",\n \"liquidationPrice\": \"0\",\n \"leverage\": \"20\",\n \"maxNotionalValue\": \"25000\",\n \"marginType\": \"cross\",\n \"isolatedMargin\": \"0.00000000\",\n \"isAutoAddMargin\": \"false\",\n \"positionSide\": \"BOTH\",\n \"notional\": \"0\",\n \"isolatedWallet\": \"0\",\n \"updateTime\": 0\n }" ], "line_end" => 2609, "line_start" => 2568, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "leverage" }, %{ "comment" => nil, "key" => "symbol", "value" => "this.safeSymbol (marketId, market)" }, %{ "comment" => nil, "key" => "marginMode", "value" => "marginMode" }, %{ "comment" => nil, "key" => "longLeverage", "value" => "longLeverage" }, %{ "comment" => nil, "key" => "shortLeverage", "value" => "shortLeverage" } ], "name" => "parseLeverage", "signature" => "parseLeverage (leverage: Dict, market: Market = undefined): Leverage", "source" => "parseLeverage (leverage: Dict, market: Market = undefined): Leverage {\n //\n // {\n // \"symbol\": \"INJUSDT\",\n // \"positionAmt\": \"0.0\",\n // \"entryPrice\": \"0.0\",\n // \"markPrice\": \"0.00000000\",\n // \"unRealizedProfit\": \"0.00000000\",\n // \"liquidationPrice\": \"0\",\n // \"leverage\": \"20\",\n // \"maxNotionalValue\": \"25000\",\n // \"marginType\": \"cross\",\n // \"isolatedMargin\": \"0.00000000\",\n // \"isAutoAddMargin\": \"false\",\n // \"positionSide\": \"BOTH\",\n // \"notional\": \"0\",\n // \"isolatedWallet\": \"0\",\n // \"updateTime\": 0\n // }\n //\n const marketId = this.safeString (leverage, 'symbol');\n const marginMode = this.safeStringLower (leverage, 'marginType');\n const side = this.safeStringLower (leverage, 'positionSide');\n let longLeverage = undefined;\n let shortLeverage = undefined;\n const leverageValue = this.safeInteger (leverage, 'leverage');\n if ((side === undefined) || (side === 'both')) {\n longLeverage = leverageValue;\n shortLeverage = leverageValue;\n } else if (side === 'long') {\n longLeverage = leverageValue;\n } else if (side === 'short') {\n shortLeverage = leverageValue;\n }\n return {\n 'info': leverage,\n 'symbol': this.safeSymbol (marketId, market),\n 'marginMode': marginMode,\n 'longLeverage': longLeverage,\n 'shortLeverage': shortLeverage,\n } as Leverage;\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"INJUSDT\",\n \"positionAmt\": \"0.0\",\n \"entryPrice\": \"0.0\",\n \"markPrice\": \"0.00000000\",\n \"unRealizedProfit\": \"0.00000000\",\n \"liquidationPrice\": \"0\",\n \"leverage\": \"20\",\n \"maxNotionalValue\": \"25000\",\n \"marginType\": \"cross\",\n \"isolatedMargin\": \"0.00000000\",\n \"isAutoAddMargin\": \"false\",\n \"positionSide\": \"BOTH\",\n \"notional\": \"0\",\n \"isolatedWallet\": \"0\",\n \"updateTime\": 0\n }" ], "line_end" => 2676, "line_start" => 2649, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "marginMode" }, %{ "comment" => nil, "key" => "symbol", "value" => "market['symbol']" }, %{ "comment" => nil, "key" => "marginMode", "value" => "this.safeStringLower (marginMode, 'marginType')" } ], "name" => "parseMarginMode", "signature" => "parseMarginMode (marginMode: Dict, market = undefined): MarginMode", "source" => "parseMarginMode (marginMode: Dict, market = undefined): MarginMode {\n //\n // {\n // \"symbol\": \"INJUSDT\",\n // \"positionAmt\": \"0.0\",\n // \"entryPrice\": \"0.0\",\n // \"markPrice\": \"0.00000000\",\n // \"unRealizedProfit\": \"0.00000000\",\n // \"liquidationPrice\": \"0\",\n // \"leverage\": \"20\",\n // \"maxNotionalValue\": \"25000\",\n // \"marginType\": \"cross\",\n // \"isolatedMargin\": \"0.00000000\",\n // \"isAutoAddMargin\": \"false\",\n // \"positionSide\": \"BOTH\",\n // \"notional\": \"0\",\n // \"isolatedWallet\": \"0\",\n // \"updateTime\": 0\n // }\n //\n const marketId = this.safeString (marginMode, 'symbol');\n market = this.safeMarket (marketId, market);\n return {\n 'info': marginMode,\n 'symbol': market['symbol'],\n 'marginMode': this.safeStringLower (marginMode, 'marginType'),\n } as MarginMode;\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"amount\": \"100\",\n \"asset\": \"USDT\",\n \"symbol\": \"BTCUSDT\",\n \"time\": 1578047900425,\n \"type\": 1,\n \"positionSide\": \"LONG\"\n }", "{\n \"amount\": 100.0,\n \"code\": 200,\n \"msg\": \"Successfully modify position margin.\",\n \"type\": 1\n }" ], "line_end" => 2768, "line_start" => 2731, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "data" }, %{ "comment" => nil, "key" => "symbol", "value" => "market['symbol']" }, %{ "comment" => nil, "key" => "type", "value" => "(rawType === 1) ? 'add' : 'reduce'" }, %{ "comment" => nil, "key" => "marginMode", "value" => "'isolated'" }, %{ "comment" => nil, "key" => "amount", "value" => "this.safeNumber (data, 'amount')" }, %{ "comment" => nil, "key" => "code", "value" => "this.safeString (data, 'asset')" }, %{ "comment" => nil, "key" => "total", "value" => "undefined" }, %{ "comment" => nil, "key" => "status", "value" => "(success || noErrorCode) ? 'ok' : 'failed'" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" } ], "name" => "parseMarginModification", "signature" => "parseMarginModification (data: Dict, market: Market = undefined): MarginModification", "source" => "parseMarginModification (data: Dict, market: Market = undefined): MarginModification {\n //\n // {\n // \"amount\": \"100\",\n // \"asset\": \"USDT\",\n // \"symbol\": \"BTCUSDT\",\n // \"time\": 1578047900425,\n // \"type\": 1,\n // \"positionSide\": \"LONG\"\n // }\n //\n // {\n // \"amount\": 100.0,\n // \"code\": 200,\n // \"msg\": \"Successfully modify position margin.\",\n // \"type\": 1\n // }\n //\n const rawType = this.safeInteger (data, 'type');\n const errorCode = this.safeString (data, 'code');\n const marketId = this.safeString (data, 'symbol');\n const timestamp = this.safeInteger (data, 'time');\n market = this.safeMarket (marketId, market, undefined, 'swap');\n const noErrorCode = errorCode === undefined;\n const success = errorCode === '200';\n return {\n 'info': data,\n 'symbol': market['symbol'],\n 'type': (rawType === 1) ? 'add' : 'reduce',\n 'marginMode': 'isolated',\n 'amount': this.safeNumber (data, 'amount'),\n 'code': this.safeString (data, 'asset'),\n 'total': undefined,\n 'status': (success || noErrorCode) ? 'ok' : 'failed',\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n };\n }" }, %{ "comment" => nil, "examples" => [ "[\n 1631158560000,\n \"208.1850\",\n \"208.1850\",\n \"208.1850\",\n \"208.1850\",\n \"11.84\",\n 1631158619999,\n \"2464.910400\",\n 1,\n \"11.84\",\n \"2464.910400\",\n \"0\"\n ]" ], "line_end" => 881, "line_start" => 856, "mappings" => [], "name" => "parseOHLCV", "signature" => "parseOHLCV (ohlcv, market: Market = undefined): OHLCV", "source" => "parseOHLCV (ohlcv, market: Market = undefined): OHLCV {\n //\n // [\n // 1631158560000,\n // \"208.1850\",\n // \"208.1850\",\n // \"208.1850\",\n // \"208.1850\",\n // \"11.84\",\n // 1631158619999,\n // \"2464.910400\",\n // 1,\n // \"11.84\",\n // \"2464.910400\",\n // \"0\"\n // ]\n //\n return [\n this.safeInteger (ohlcv, 0),\n this.safeNumber (ohlcv, 1),\n this.safeNumber (ohlcv, 2),\n this.safeNumber (ohlcv, 3),\n this.safeNumber (ohlcv, 4),\n this.safeNumber (ohlcv, 5),\n ];\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"avgPrice\": \"0.00000\",\n \"clientOrderId\": \"abc\",\n \"cumQuote\": \"0\",\n \"executedQty\": \"0\",\n \"orderId\": 1917641,\n \"origQty\": \"0.40\",\n \"origType\": \"TRAILING_STOP_MARKET\",\n \"price\": \"0\",\n \"reduceOnly\": false,\n \"side\": \"BUY\",\n \"positionSide\": \"SHORT\",\n \"status\": \"NEW\",\n \"stopPrice\": \"9300\",\n \"closePosition\": false,\n \"symbol\": \"BTCUSDT\",\n \"time\": 1579276756075,\n \"timeInForce\": \"GTC\",\n \"type\": \"TRAILING_STOP_MARKET\",\n \"activatePrice\": \"9020\",\n \"priceRate\": \"0.3\",\n \"updateTime\": 1579276756075,\n \"workingType\": \"CONTRACT_PRICE\",\n \"priceProtect\": false\n }", "{\n \"orderId\": 38,\n \"symbol\": \"ADA25SLP25\",\n \"status\": \"FILLED\",\n \"clientOrderId\": \"afMd4GBQyHkHpGWdiy34Li\",\n \"price\": \"20\",\n \"avgPrice\": \"12.0000000000000000\",\n \"origQty\": \"10\",\n \"executedQty\": \"10\",\n \"cumQuote\": \"120\",\n \"timeInForce\": \"GTC\",\n \"type\": \"LIMIT\",\n \"side\": \"BUY\",\n \"stopPrice\": \"0\",\n \"origType\": \"LIMIT\",\n \"time\": 1649913186270,\n \"updateTime\": 1649913186297\n }" ], "line_end" => 1939, "line_start" => 1856, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "info" }, %{ "comment" => nil, "key" => "id", "value" => "this.safeString (order, 'orderId')" }, %{ "comment" => nil, "key" => "clientOrderId", "value" => "this.safeString (order, 'clientOrderId')" }, %{ "comment" => nil, "key" => "symbol", "value" => "this.safeSymbol (marketId, market)" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "lastTradeTimestamp", "value" => "lastTradeTimestamp" }, %{ "comment" => nil, "key" => "lastUpdateTimestamp", "value" => "this.safeInteger (order, 'updateTime')" }, %{ "comment" => nil, "key" => "type", "value" => "this.parseOrderType (rawType)" }, %{ "comment" => nil, "key" => "timeInForce", "value" => "this.safeString (order, 'timeInForce')" }, %{ "comment" => nil, "key" => "postOnly", "value" => "undefined" }, %{ "comment" => nil, "key" => "side", "value" => "side" }, %{ "comment" => nil, "key" => "price", "value" => "this.safeString (order, 'price')" }, %{ "comment" => nil, "key" => "triggerPrice", "value" => "triggerPrice" }, %{ "comment" => nil, "key" => "average", "value" => "this.safeString (order, 'avgPrice')" }, %{ "comment" => nil, "key" => "cost", "value" => "this.safeString (order, 'cumQuote')" }, %{ "comment" => nil, "key" => "amount", "value" => "this.safeString (order, 'origQty')" }, %{ "comment" => nil, "key" => "filled", "value" => "this.safeString (order, 'executedQty')" }, %{ "comment" => nil, "key" => "remaining", "value" => "undefined" }, %{ "comment" => nil, "key" => "status", "value" => "this.parseOrderStatus (statusId)" }, %{ "comment" => nil, "key" => "fee", "value" => "undefined" }, %{ "comment" => nil, "key" => "trades", "value" => "undefined" }, %{ "comment" => nil, "key" => "reduceOnly", "value" => "this.safeBool2 (order, 'reduceOnly', 'ro')" } ], "name" => "parseOrder", "signature" => "parseOrder (order: Dict, market: Market = undefined): Order", "source" => "parseOrder (order: Dict, market: Market = undefined): Order {\n //\n // swap\n // {\n // \"avgPrice\": \"0.00000\",\n // \"clientOrderId\": \"abc\",\n // \"cumQuote\": \"0\",\n // \"executedQty\": \"0\",\n // \"orderId\": 1917641,\n // \"origQty\": \"0.40\",\n // \"origType\": \"TRAILING_STOP_MARKET\",\n // \"price\": \"0\",\n // \"reduceOnly\": false,\n // \"side\": \"BUY\",\n // \"positionSide\": \"SHORT\",\n // \"status\": \"NEW\",\n // \"stopPrice\": \"9300\",\n // \"closePosition\": false,\n // \"symbol\": \"BTCUSDT\",\n // \"time\": 1579276756075,\n // \"timeInForce\": \"GTC\",\n // \"type\": \"TRAILING_STOP_MARKET\",\n // \"activatePrice\": \"9020\",\n // \"priceRate\": \"0.3\",\n // \"updateTime\": 1579276756075,\n // \"workingType\": \"CONTRACT_PRICE\",\n // \"priceProtect\": false\n // }\n // spot\n // {\n // \"orderId\": 38,\n // \"symbol\": \"ADA25SLP25\",\n // \"status\": \"FILLED\",\n // \"clientOrderId\": \"afMd4GBQyHkHpGWdiy34Li\",\n // \"price\": \"20\",\n // \"avgPrice\": \"12.0000000000000000\",\n // \"origQty\": \"10\",\n // \"executedQty\": \"10\",\n // \"cumQuote\": \"120\",\n // \"timeInForce\": \"GTC\",\n // \"type\": \"LIMIT\",\n // \"side\": \"BUY\",\n // \"stopPrice\": \"0\",\n // \"origType\": \"LIMIT\",\n // \"time\": 1649913186270,\n // \"updateTime\": 1649913186297\n // }\n //\n const info = order;\n const marketId = this.safeString (order, 'symbol');\n market = this.safeMarket (marketId, market);\n const side = this.safeStringLower (order, 'side');\n const timestamp = this.safeInteger (order, 'time');\n const lastTradeTimestamp = this.safeInteger (order, 'updateTime');\n const statusId = this.safeStringUpper (order, 'status');\n const rawType = this.safeStringUpper (order, 'type');\n const stopPriceString = this.safeString (order, 'stopPrice');\n const triggerPrice = this.parseNumber (this.omitZero (stopPriceString));\n return this.safeOrder ({\n 'info': info,\n 'id': this.safeString (order, 'orderId'),\n 'clientOrderId': this.safeString (order, 'clientOrderId'),\n 'symbol': this.safeSymbol (marketId, market),\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'lastTradeTimestamp': lastTradeTimestamp,\n 'lastUpdateTimestamp': this.safeInteger (order, 'updateTime'),\n 'type': this.parseOrderType (rawType),\n 'timeInForce': this.safeString (order, 'timeInForce'),\n 'postOnly': undefined,\n 'side': side,\n 'price': this.safeString (order, 'price'),\n 'triggerPrice': triggerPrice,\n 'average': this.safeString (order, 'avgPrice'),\n 'cost': this.safeString (order, 'cumQuote'),\n 'amount': this.safeString (order, 'origQty'),\n 'filled': this.safeString (order, 'executedQty'),\n 'remaining': undefined,\n 'status': this.parseOrderStatus (statusId),\n 'fee': undefined,\n 'trades': undefined,\n 'reduceOnly': this.safeBool2 (order, 'reduceOnly', 'ro'),\n }, market);\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 1841, "line_start" => 1831, "mappings" => [], "name" => "parseOrderStatus", "signature" => "parseOrderStatus (status: Str)", "source" => "parseOrderStatus (status: Str) {\n const statuses: Dict = {\n 'NEW': 'open',\n 'PARTIALLY_FILLED': 'open',\n 'FILLED': 'closed',\n 'CANCELED': 'canceled',\n 'REJECTED': 'canceled',\n 'EXPIRED': 'canceled',\n };\n return this.safeString (statuses, status, status);\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 1854, "line_start" => 1843, "mappings" => [], "name" => "parseOrderType", "signature" => "parseOrderType (type: Str)", "source" => "parseOrderType (type: Str) {\n const types: Dict = {\n 'LIMIT': 'limit',\n 'MARKET': 'market',\n 'STOP': 'limit',\n 'STOP_MARKET': 'market',\n 'TAKE_PROFIT': 'limit',\n 'TAKE_PROFIT_MARKET': 'market',\n 'TRAILING_STOP_MARKET': 'market',\n };\n return this.safeString (types, type, type);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"entryPrice\": \"6563.66500\",\n \"marginType\": \"isolated\",\n \"isAutoAddMargin\": \"false\",\n \"isolatedMargin\": \"15517.54150468\",\n \"leverage\": \"10\",\n \"liquidationPrice\": \"5930.78\",\n \"markPrice\": \"6679.50671178\",\n \"maxNotionalValue\": \"20000000\",\n \"positionSide\": \"LONG\",\n \"positionAmt\": \"20.000\",\n \"symbol\": \"BTCUSDT\",\n \"unRealizedProfit\": \"2316.83423560\",\n \"updateTime\": 1625474304765\n }" ], "line_end" => 3158, "line_start" => 2990, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "position" }, %{ "comment" => nil, "key" => "id", "value" => "undefined" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "contracts", "value" => "contracts" }, %{ "comment" => nil, "key" => "contractSize", "value" => "contractSize" }, %{ "comment" => nil, "key" => "unrealizedPnl", "value" => "unrealizedPnl" }, %{ "comment" => nil, "key" => "leverage", "value" => "this.parseNumber (leverageString)" }, %{ "comment" => nil, "key" => "liquidationPrice", "value" => "liquidationPrice" }, %{ "comment" => nil, "key" => "collateral", "value" => "collateral" }, %{ "comment" => nil, "key" => "notional", "value" => "notional" }, %{ "comment" => nil, "key" => "markPrice", "value" => "markPrice" }, %{ "comment" => nil, "key" => "entryPrice", "value" => "entryPrice" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "initialMargin", "value" => "this.parseNumber (initialMarginString)" }, %{ "comment" => nil, "key" => "initialMarginPercentage", "value" => "this.parseNumber (initialMarginPercentageString)" }, %{ "comment" => nil, "key" => "maintenanceMargin", "value" => "maintenanceMargin" }, %{ "comment" => nil, "key" => "maintenanceMarginPercentage", "value" => "maintenanceMarginPercentage" }, %{ "comment" => nil, "key" => "marginRatio", "value" => "marginRatio" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "marginMode", "value" => "marginMode" }, %{ "comment" => nil, "key" => "side", "value" => "side" }, %{ "comment" => nil, "key" => "hedged", "value" => "hedged" }, %{ "comment" => nil, "key" => "percentage", "value" => "percentage" }, %{ "comment" => nil, "key" => "stopLossPrice", "value" => "undefined" }, %{ "comment" => nil, "key" => "takeProfitPrice", "value" => "undefined" } ], "name" => "parsePositionRisk", "signature" => "parsePositionRisk (position, market: Market = undefined)", "source" => "parsePositionRisk (position, market: Market = undefined) {\n //\n // {\n // \"entryPrice\": \"6563.66500\",\n // \"marginType\": \"isolated\",\n // \"isAutoAddMargin\": \"false\",\n // \"isolatedMargin\": \"15517.54150468\",\n // \"leverage\": \"10\",\n // \"liquidationPrice\": \"5930.78\",\n // \"markPrice\": \"6679.50671178\",\n // \"maxNotionalValue\": \"20000000\",\n // \"positionSide\": \"LONG\",\n // \"positionAmt\": \"20.000\",\n // \"symbol\": \"BTCUSDT\",\n // \"unRealizedProfit\": \"2316.83423560\",\n // \"updateTime\": 1625474304765\n // }\n //\n const marketId = this.safeString (position, 'symbol');\n market = this.safeMarket (marketId, market, undefined, 'contract');\n const symbol = this.safeString (market, 'symbol');\n const isolatedMarginString = this.safeString (position, 'isolatedMargin');\n const leverageBrackets = this.safeDict (this.options, 'leverageBrackets', {});\n const leverageBracket = this.safeList (leverageBrackets, symbol, []);\n const notionalString = this.safeString2 (position, 'notional', 'notionalValue');\n const notionalStringAbs = Precise.stringAbs (notionalString);\n let maintenanceMarginPercentageString = undefined;\n for (let i = 0; i < leverageBracket.length; i++) {\n const bracket = leverageBracket[i];\n if (Precise.stringLt (notionalStringAbs, bracket[0])) {\n break;\n }\n maintenanceMarginPercentageString = bracket[1];\n }\n const notional = this.parseNumber (notionalStringAbs);\n const contractsAbs = Precise.stringAbs (this.safeString (position, 'positionAmt'));\n const contracts = this.parseNumber (contractsAbs);\n const unrealizedPnlString = this.safeString (position, 'unRealizedProfit');\n const unrealizedPnl = this.parseNumber (unrealizedPnlString);\n const liquidationPriceString = this.omitZero (this.safeString (position, 'liquidationPrice'));\n const liquidationPrice = this.parseNumber (liquidationPriceString);\n let collateralString = undefined;\n let marginMode = this.safeString (position, 'marginType');\n if (marginMode === undefined && isolatedMarginString !== undefined) {\n marginMode = Precise.stringEq (isolatedMarginString, '0') ? 'cross' : 'isolated';\n }\n let side = undefined;\n if (Precise.stringGt (notionalString, '0')) {\n side = 'long';\n } else if (Precise.stringLt (notionalString, '0')) {\n side = 'short';\n }\n const entryPriceString = this.safeString (position, 'entryPrice');\n const entryPrice = this.parseNumber (entryPriceString);\n const contractSize = this.safeValue (market, 'contractSize');\n const contractSizeString = this.numberToString (contractSize);\n // as oppose to notionalValue\n const linear = ('notional' in position);\n if (marginMode === 'cross') {\n // calculate collateral\n const precision = this.safeDict (market, 'precision', {});\n const basePrecisionValue = this.safeString (precision, 'base');\n const quotePrecisionValue = this.safeString2 (precision, 'quote', 'price');\n const precisionIsUndefined = (basePrecisionValue === undefined) && (quotePrecisionValue === undefined);\n if (!precisionIsUndefined) {\n if (linear) {\n // walletBalance = (liquidationPrice * (±1 + mmp) ± entryPrice) * contracts\n let onePlusMaintenanceMarginPercentageString = undefined;\n let entryPriceSignString = entryPriceString;\n if (side === 'short') {\n onePlusMaintenanceMarginPercentageString = Precise.stringAdd ('1', maintenanceMarginPercentageString);\n entryPriceSignString = Precise.stringMul ('-1', entryPriceSignString);\n } else {\n onePlusMaintenanceMarginPercentageString = Precise.stringAdd ('-1', maintenanceMarginPercentageString);\n }\n const inner = Precise.stringMul (liquidationPriceString, onePlusMaintenanceMarginPercentageString);\n const leftSide = Precise.stringAdd (inner, entryPriceSignString);\n const quotePrecision = this.precisionFromString (this.safeString2 (precision, 'quote', 'price'));\n if (quotePrecision !== undefined) {\n collateralString = Precise.stringDiv (Precise.stringMul (leftSide, contractsAbs), '1', quotePrecision);\n }\n } else {\n // walletBalance = (contracts * contractSize) * (±1/entryPrice - (±1 - mmp) / liquidationPrice)\n let onePlusMaintenanceMarginPercentageString = undefined;\n let entryPriceSignString = entryPriceString;\n if (side === 'short') {\n onePlusMaintenanceMarginPercentageString = Precise.stringSub ('1', maintenanceMarginPercentageString);\n } else {\n onePlusMaintenanceMarginPercentageString = Precise.stringSub ('-1', maintenanceMarginPercentageString);\n entryPriceSignString = Precise.stringMul ('-1', entryPriceSignString);\n }\n const leftSide = Precise.stringMul (contractsAbs, contractSizeString);\n const rightSide = Precise.stringSub (Precise.stringDiv ('1', entryPriceSignString), Precise.stringDiv (onePlusMaintenanceMarginPercentageString, liquidationPriceString));\n const basePrecision = this.precisionFromString (this.safeString (precision, 'base'));\n if (basePrecision !== undefined) {\n collateralString = Precise.stringDiv (Precise.stringMul (leftSide, rightSide), '1', basePrecision);\n }\n }\n }\n } else {\n collateralString = this.safeString (position, 'isolatedMargin');\n }\n collateralString = (collateralString === undefined) ? '0' : collateralString;\n const collateral = this.parseNumber (collateralString);\n const markPrice = this.parseNumber (this.omitZero (this.safeString (position, 'markPrice')));\n let timestamp = this.safeInteger (position, 'updateTime');\n if (timestamp === 0) {\n timestamp = undefined;\n }\n const maintenanceMarginPercentage = this.parseNumber (maintenanceMarginPercentageString);\n let maintenanceMarginString = Precise.stringMul (maintenanceMarginPercentageString, notionalStringAbs);\n if (maintenanceMarginString === undefined) {\n // for a while, this new value was a backup to the existing calculations, but in future we might prioritize this\n maintenanceMarginString = this.safeString (position, 'maintMargin');\n }\n const maintenanceMargin = this.parseNumber (maintenanceMarginString);\n let initialMarginString = undefined;\n let initialMarginPercentageString = undefined;\n const leverageString = this.safeString (position, 'leverage');\n if (leverageString !== undefined) {\n const leverage = parseInt (leverageString);\n const rational = this.isRoundNumber (1000 % leverage);\n initialMarginPercentageString = Precise.stringDiv ('1', leverageString, 8);\n if (!rational) {\n initialMarginPercentageString = Precise.stringAdd (initialMarginPercentageString, '1e-8');\n }\n const unrounded = Precise.stringMul (notionalStringAbs, initialMarginPercentageString);\n initialMarginString = Precise.stringDiv (unrounded, '1', 8);\n } else {\n initialMarginString = this.safeString (position, 'initialMargin');\n const unrounded = Precise.stringMul (initialMarginString, '1');\n initialMarginPercentageString = Precise.stringDiv (unrounded, notionalStringAbs, 8);\n }\n let marginRatio = undefined;\n let percentage = undefined;\n if (!Precise.stringEquals (collateralString, '0')) {\n marginRatio = this.parseNumber (Precise.stringDiv (Precise.stringAdd (Precise.stringDiv (maintenanceMarginString, collateralString), '5e-5'), '1', 4));\n percentage = this.parseNumber (Precise.stringMul (Precise.stringDiv (unrealizedPnlString, initialMarginString, 4), '100'));\n }\n const positionSide = this.safeString (position, 'positionSide');\n const hedged = positionSide !== 'BOTH';\n return this.safePosition ({\n 'info': position,\n 'id': undefined,\n 'symbol': symbol,\n 'contracts': contracts,\n 'contractSize': contractSize,\n 'unrealizedPnl': unrealizedPnl,\n 'leverage': this.parseNumber (leverageString),\n 'liquidationPrice': liquidationPrice,\n 'collateral': collateral,\n 'notional': notional,\n 'markPrice': markPrice,\n 'entryPrice': entryPrice,\n 'timestamp': timestamp,\n 'initialMargin': this.parseNumber (initialMarginString),\n 'initialMarginPercentage': this.parseNumber (initialMarginPercentageString),\n 'maintenanceMargin': maintenanceMargin,\n 'maintenanceMarginPercentage': maintenanceMarginPercentage,\n 'marginRatio': marginRatio,\n 'datetime': this.iso8601 (timestamp),\n 'marginMode': marginMode,\n 'side': side,\n 'hedged': hedged,\n 'percentage': percentage,\n 'stopLossPrice': undefined,\n 'takeProfitPrice': undefined,\n });\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"BTCUSDT\",\n \"priceChange\": \"-2274.38\",\n \"priceChangePercent\": \"-2.049\",\n \"weightedAvgPrice\": \"109524.37084136\",\n \"lastPrice\": \"108738.78\",\n \"lastQty\": \"0.00034\",\n \"openPrice\": \"111013.16\",\n \"highPrice\": \"111975.81\",\n \"lowPrice\": \"107459.25\",\n \"volume\": \"28.67876\",\n \"quoteVolume\": \"3141023.14551030\",\n \"openTime\": \"1760578800000\",\n \"closeTime\": \"1760665024749\",\n \"firstId\": \"37447\",\n \"lastId\": \"39698\",\n \"count\": \"2252\",\n \"baseAsset\": \"BTC\",\n \"quoteAsset\": \"USDT\",\n \"bidPrice\": \"108705.11\",\n \"bidQty\": \"0.03351\",\n \"askPrice\": \"108725.99\",\n \"askQty\": \"0.08724\"\n }", "{\n \"symbol\": \"BTCUSDT\",\n \"priceChange\": \"1845.7\",\n \"priceChangePercent\": \"1.755\",\n \"weightedAvgPrice\": \"105515.5\",\n \"lastPrice\": \"107037.7\",\n \"lastQty\": \"0.004\",\n \"openPrice\": \"105192.0\",\n \"highPrice\": \"107223.5\",\n \"lowPrice\": \"104431.6\",\n \"volume\": \"8753.286\",\n \"quoteVolume\": \"923607368.61\",\n \"openTime\": 1749976620000,\n \"closeTime\": 1750063053754,\n \"firstId\": 24195078,\n \"lastId\": 24375783,\n \"count\": 180706\n }" ], "line_end" => 1354, "line_start" => 1265, "mappings" => [ %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "high", "value" => "high" }, %{ "comment" => nil, "key" => "low", "value" => "low" }, %{ "comment" => nil, "key" => "bid", "value" => "this.safeString (ticker, 'bidPrice')" }, %{ "comment" => nil, "key" => "bidVolume", "value" => "this.safeString (ticker, 'bidQty')" }, %{ "comment" => nil, "key" => "ask", "value" => "this.safeString (ticker, 'askPrice')" }, %{ "comment" => nil, "key" => "askVolume", "value" => "this.safeString (ticker, 'askQty')" }, %{ "comment" => nil, "key" => "vwap", "value" => "undefined" }, %{ "comment" => nil, "key" => "open", "value" => "open" }, %{ "comment" => nil, "key" => "close", "value" => "last" }, %{ "comment" => nil, "key" => "last", "value" => "last" }, %{ "comment" => nil, "key" => "previousClose", "value" => "undefined" }, %{ "comment" => nil, "key" => "change", "value" => "undefined" }, %{ "comment" => nil, "key" => "percentage", "value" => "percentage" }, %{ "comment" => nil, "key" => "average", "value" => "undefined" }, %{ "comment" => nil, "key" => "baseVolume", "value" => "baseVolume" }, %{ "comment" => nil, "key" => "quoteVolume", "value" => "quoteVolume" }, %{ "comment" => nil, "key" => "markPrice", "value" => "undefined" }, %{ "comment" => nil, "key" => "indexPrice", "value" => "undefined" }, %{ "comment" => nil, "key" => "info", "value" => "ticker" } ], "name" => "parseTicker", "signature" => "parseTicker (ticker: Dict, market: Market = undefined): Ticker", "source" => "parseTicker (ticker: Dict, market: Market = undefined): Ticker {\n //\n // spot\n // {\n // \"symbol\": \"BTCUSDT\",\n // \"priceChange\": \"-2274.38\",\n // \"priceChangePercent\": \"-2.049\",\n // \"weightedAvgPrice\": \"109524.37084136\",\n // \"lastPrice\": \"108738.78\",\n // \"lastQty\": \"0.00034\",\n // \"openPrice\": \"111013.16\",\n // \"highPrice\": \"111975.81\",\n // \"lowPrice\": \"107459.25\",\n // \"volume\": \"28.67876\",\n // \"quoteVolume\": \"3141023.14551030\",\n // \"openTime\": \"1760578800000\",\n // \"closeTime\": \"1760665024749\",\n // \"firstId\": \"37447\",\n // \"lastId\": \"39698\",\n // \"count\": \"2252\",\n // \"baseAsset\": \"BTC\",\n // \"quoteAsset\": \"USDT\",\n // \"bidPrice\": \"108705.11\",\n // \"bidQty\": \"0.03351\",\n // \"askPrice\": \"108725.99\",\n // \"askQty\": \"0.08724\"\n // }\n // swap\n // {\n // \"symbol\": \"BTCUSDT\",\n // \"priceChange\": \"1845.7\",\n // \"priceChangePercent\": \"1.755\",\n // \"weightedAvgPrice\": \"105515.5\",\n // \"lastPrice\": \"107037.7\",\n // \"lastQty\": \"0.004\",\n // \"openPrice\": \"105192.0\",\n // \"highPrice\": \"107223.5\",\n // \"lowPrice\": \"104431.6\",\n // \"volume\": \"8753.286\",\n // \"quoteVolume\": \"923607368.61\",\n // \"openTime\": 1749976620000,\n // \"closeTime\": 1750063053754,\n // \"firstId\": 24195078,\n // \"lastId\": 24375783,\n // \"count\": 180706\n // }\n //\n const timestamp = this.safeInteger (ticker, 'closeTime');\n let marketType = undefined;\n if ('bidQty' in ticker) {\n marketType = 'spot';\n } else {\n marketType = 'contract';\n }\n const marketId = this.safeString (ticker, 'symbol');\n market = this.safeMarket (marketId, market, undefined, marketType);\n const symbol = market['symbol'];\n const last = this.safeString (ticker, 'lastPrice');\n const open = this.safeString (ticker, 'openPrice');\n let percentage = this.safeString (ticker, 'priceChangePercent');\n percentage = Precise.stringMul (percentage, '100');\n const quoteVolume = this.safeString (ticker, 'quoteVolume');\n const baseVolume = this.safeString (ticker, 'volume');\n const high = this.safeString (ticker, 'highPrice');\n const low = this.safeString (ticker, 'lowPrice');\n return this.safeTicker ({\n 'symbol': symbol,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'high': high,\n 'low': low,\n 'bid': this.safeString (ticker, 'bidPrice'),\n 'bidVolume': this.safeString (ticker, 'bidQty'),\n 'ask': this.safeString (ticker, 'askPrice'),\n 'askVolume': this.safeString (ticker, 'askQty'),\n 'vwap': undefined,\n 'open': open,\n 'close': last,\n 'last': last,\n 'previousClose': undefined,\n 'change': undefined,\n 'percentage': percentage,\n 'average': undefined,\n 'baseVolume': baseVolume,\n 'quoteVolume': quoteVolume,\n 'markPrice': undefined,\n 'indexPrice': undefined,\n 'info': ticker,\n }, market);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"id\": 3913206,\n \"price\": \"644.100\",\n \"qty\": \"0.08\",\n \"quoteQty\": \"51.528\",\n \"time\": 1749784506633,\n \"isBuyerMaker\": true\n }", "{\n \"id\": 657,\n \"price\": \"1.01000000\",\n \"qty\": \"5.00000000\",\n \"baseQty\": \"4.95049505\",\n \"time\": 1755156533943,\n \"isBuyerMaker\": false\n }", "{\n \"buyer\": false,\n \"commission\": \"-0.07819010\",\n \"commissionAsset\": \"USDT\",\n \"id\": 698759,\n \"maker\": false,\n \"orderId\": 25851813,\n \"price\": \"7819.01\",\n \"qty\": \"0.002\",\n \"quoteQty\": \"15.63802\",\n \"realizedPnl\": \"-0.91539999\",\n \"side\": \"SELL\",\n \"positionSide\": \"SHORT\",\n \"symbol\": \"BTCUSDT\",\n \"time\": 1569514978020\n }" ], "line_end" => 1033, "line_start" => 956, "mappings" => [ %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "info", "value" => "trade" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "order", "value" => "this.safeString (trade, 'orderId')" }, %{ "comment" => nil, "key" => "type", "value" => "undefined" }, %{ "comment" => nil, "key" => "side", "value" => "side" }, %{ "comment" => nil, "key" => "takerOrMaker", "value" => "takerOrMaker" }, %{ "comment" => nil, "key" => "price", "value" => "priceString" }, %{ "comment" => nil, "key" => "amount", "value" => "amountString" }, %{ "comment" => nil, "key" => "cost", "value" => "costString" }, %{ "comment" => nil, "key" => "fee", "value" => "{\n 'cost': this.parseNumber (Precise.stringAbs (this.safeString (trade, 'commission'))),\n 'currency': currencyCode,\n }" }, %{ "comment" => nil, "key" => "cost", "value" => "this.parseNumber (Precise.stringAbs (this.safeString (trade, 'commission')))" }, %{ "comment" => nil, "key" => "currency", "value" => "currencyCode" } ], "name" => "parseTrade", "signature" => "parseTrade (trade: Dict, market: Market = undefined): Trade", "source" => "parseTrade (trade: Dict, market: Market = undefined): Trade {\n //\n // fetchTrades\n //\n // {\n // \"id\": 3913206,\n // \"price\": \"644.100\",\n // \"qty\": \"0.08\",\n // \"quoteQty\": \"51.528\",\n // \"time\": 1749784506633,\n // \"isBuyerMaker\": true\n // }\n //\n // {\n // \"id\": 657,\n // \"price\": \"1.01000000\",\n // \"qty\": \"5.00000000\",\n // \"baseQty\": \"4.95049505\",\n // \"time\": 1755156533943,\n // \"isBuyerMaker\": false\n // }\n //\n // fetchMyTrades\n //\n // {\n // \"buyer\": false,\n // \"commission\": \"-0.07819010\",\n // \"commissionAsset\": \"USDT\",\n // \"id\": 698759,\n // \"maker\": false,\n // \"orderId\": 25851813,\n // \"price\": \"7819.01\",\n // \"qty\": \"0.002\",\n // \"quoteQty\": \"15.63802\",\n // \"realizedPnl\": \"-0.91539999\",\n // \"side\": \"SELL\",\n // \"positionSide\": \"SHORT\",\n // \"symbol\": \"BTCUSDT\",\n // \"time\": 1569514978020\n // }\n //\n const id = this.safeString (trade, 'id');\n const symbol = market['symbol'];\n const currencyId = this.safeString (trade, 'commissionAsset');\n const currencyCode = this.safeCurrencyCode (currencyId);\n const amountString = this.safeString (trade, 'qty');\n const priceString = this.safeString (trade, 'price');\n const costString = this.safeString2 (trade, 'quoteQty', 'baseQty');\n const timestamp = this.safeInteger (trade, 'time');\n let side = this.safeStringLower (trade, 'side');\n const isMaker = this.safeBool (trade, 'maker');\n let takerOrMaker = undefined;\n if (isMaker !== undefined) {\n takerOrMaker = isMaker ? 'maker' : 'taker';\n }\n const isBuyerMaker = this.safeBool (trade, 'isBuyerMaker');\n if (isBuyerMaker !== undefined) {\n side = isBuyerMaker ? 'sell' : 'buy';\n }\n return this.safeTrade ({\n 'id': id,\n 'info': trade,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'symbol': symbol,\n 'order': this.safeString (trade, 'orderId'),\n 'type': undefined,\n 'side': side,\n 'takerOrMaker': takerOrMaker,\n 'price': priceString,\n 'amount': amountString,\n 'cost': costString,\n 'fee': {\n 'cost': this.parseNumber (Precise.stringAbs (this.safeString (trade, 'commission'))),\n 'currency': currencyCode,\n },\n }, market);\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 1797, "line_start" => 1785, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "fee" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "maker", "value" => "this.safeNumber (fee, 'makerCommissionRate')" }, %{ "comment" => nil, "key" => "taker", "value" => "this.safeNumber (fee, 'takerCommissionRate')" }, %{ "comment" => nil, "key" => "percentage", "value" => "false" }, %{ "comment" => nil, "key" => "tierBased", "value" => "false" } ], "name" => "parseTradingFee", "signature" => "parseTradingFee (fee: Dict, market: Market = undefined): TradingFeeInterface", "source" => "parseTradingFee (fee: Dict, market: Market = undefined): TradingFeeInterface {\n const marketId = this.safeString (fee, 'symbol');\n market = this.safeMarket (marketId, market);\n const symbol = this.safeSymbol (marketId, market);\n return {\n 'info': fee,\n 'symbol': symbol,\n 'maker': this.safeNumber (fee, 'makerCommissionRate'),\n 'taker': this.safeNumber (fee, 'takerCommissionRate'),\n 'percentage': false,\n 'tierBased': false,\n };\n }" } ], path_prefix: "", pro: true, quote_json_numbers: nil, rate_limits: %{ interval_ms: 333, period: 1000, requests: 3, rolling_window_size: 60000 }, raw_endpoints: %{ private: [], public: [] }, required_credentials: %{ api_key: true, password: false, secret: true, uid: false }, requires_eddsa: false, response_error: nil, signing: %{ api_key_header: "X-MBX-APIKEY", confidence: :high, pattern: :hmac_sha256_query, recv_window: 5000, recv_window_key: "recvWindow", uses_recv_window: true }, spec_format_version: 1, status: %{ "eta" => nil, "status" => "ok", "updated" => nil, "url" => nil }, symbol_format: nil, symbol_formats: %{ precision_mode: 4, sample_limits: %{ "amount" => %{ "max" => 9000, "min" => 1.0e-5 }, "cost" => %{}, "price" => %{ "max" => 1000000, "min" => 0.01 } }, sample_precision: %{ "amount" => 1.0e-5, "base" => 1.0e-8, "price" => 0.01, "quote" => 1.0e-8 }, spot: %{ base: "TEST", base_id: "TEST", case: :upper, contract: false, id: "TESTUSDT", limits: %{ "amount" => %{ "max" => 9000, "min" => 1.0e-5 }, "cost" => %{}, "leverage" => %{}, "market" => %{ "max" => 9000, "min" => 1.0e-5 }, "price" => %{ "max" => 1000000, "min" => 0.01 } }, maker: 0.0001, precision: %{ "amount" => 1.0e-5, "base" => 1.0e-8, "price" => 0.01, "quote" => 1.0e-8 }, quote: "USDT", quote_id: "USDT", separator: "", symbol: "TEST/USDT", taker: 3.5e-4 }, swap: %{ base: "ASTER", base_id: "ASTER", case: :upper, contract: true, contract_size: 1, id: "ASTERUSDT", inverse: false, limits: %{ "amount" => %{ "max" => 10000000, "min" => 0.01 }, "cost" => %{ "min" => 5 }, "leverage" => %{}, "market" => %{ "max" => 900000, "min" => 0.01 }, "price" => %{ "max" => 200, "min" => 0.0001 } }, linear: true, maker: 0.0001, precision: %{ "amount" => 0.01, "base" => 1.0e-8, "price" => 0.0001, "quote" => 1.0e-8 }, quote: "USDT", quote_id: "USDT", separator: "", settle: "USDT", settle_id: "USDT", symbol: "ASTER/USDT:USDT", taker: 3.5e-4 } }, symbol_patterns: %{ spot: %{ case: :upper, component_order: nil, date_format: nil, pattern: :no_separator_upper, separator: "", suffix: nil }, swap: %{ case: :upper, component_order: nil, date_format: nil, pattern: :implicit, separator: "", suffix: nil } }, timeframes: %{ "12h" => "12h", "15m" => "15m", "1M" => "1M", "1d" => "1d", "1h" => "1h", "1m" => "1m", "1w" => "1w", "2h" => "2h", "30m" => "30m", "3d" => "3d", "3m" => "3m", "4h" => "4h", "5m" => "5m", "6h" => "6h", "8h" => "8h" }, url_strategy: %{ detected_from: "fallback", pattern: :no_prefix, prefix: nil }, urls: %{ api: "https://fapi.asterdex.com/fapi", api_sections: %{ "fapiPrivate" => "https://fapi.asterdex.com/fapi", "fapiPublic" => "https://fapi.asterdex.com/fapi", "sapiPrivate" => "https://sapi.asterdex.com/api", "sapiPublic" => "https://sapi.asterdex.com/api" }, doc: "https://github.com/asterdex/api-docs", other: nil, sandbox: nil, www: "https://www.asterdex.com/en" }, version: nil, ws: %{ channel_templates: %{ watch_balance: %{ auth_required: true, market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_bids_asks: %{ market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_mark_price: %{ market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_mark_prices: %{ market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_my_trades: %{ auth_required: true, market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_ohlcv: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_ohlcv_for_symbols: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_order_book: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_order_book_for_symbols: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_orders: %{ auth_required: true, market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_positions: %{ auth_required: true, market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_ticker: %{ market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_tickers: %{ market_id_format: :native, params: [], pattern: :stream_based, separator: "@" }, watch_trades: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" }, watch_trades_for_symbols: %{ market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :stream_based, separator: "@" } }, has: %{ watch_balance: true, watch_bids_asks: true, watch_liquidations: nil, watch_liquidations_for_symbols: nil, watch_mark_price: true, watch_mark_prices: true, watch_my_liquidations: nil, watch_my_liquidations_for_symbols: nil, watch_my_trades: true, watch_ohlcv: true, watch_ohlcv_for_symbols: true, watch_order_book: true, watch_order_book_for_symbols: true, watch_orders: true, watch_orders_for_symbols: nil, watch_position: nil, watch_positions: true, watch_status: nil, watch_ticker: true, watch_tickers: true, watch_trades: true, watch_trades_for_symbols: true }, hostname: "aster.markets", message_patterns: [ %{ args_field: "params", format: :method, keys: [ "method", "params" ], kind_field: "method", kind_value: "SUBSCRIBE", sources: [ :send, :watch_multiple ] }, %{ args_field: "params", format: :method, keys: [ "method", "params" ], kind_field: "method", kind_value: "UNSUBSCRIBE", sources: [ :watch_multiple ] } ], options: %{ "watchBalance" => %{ "awaitBalanceSnapshot" => true, "fetchBalanceSnapshot" => false }, "watchPositions" => %{ "awaitPositionsSnapshot" => true, "fetchPositionsSnapshot" => true } }, subscription_config: %{ args_field: "params", args_format: :string_list, market_id_format: :native, op_field: "method", separator: "@" }, subscription_pattern: :method_subscribe, urls: %{ "private" => %{ "spot" => "wss://sstream.asterdex.com/ws", "swap" => "wss://fstream.asterdex.com/ws" }, "public" => %{ "spot" => "wss://sstream.asterdex.com/stream", "swap" => "wss://fstream.asterdex.com/stream" } }, watch_methods: [ "watchBalance", "watchBidsAsks", "watchMarkPrice", "watchMarkPrices", "watchMyTrades", "watchOHLCV", "watchOHLCVForSymbols", "watchOrderBook", "watchOrderBookForSymbols", "watchOrders", "watchPositions", "watchTicker", "watchTickers", "watchTrades", "watchTradesForSymbols" ] } }