# Bitvavo Exchange Specification # # Auto-generated by: mix ccxt.extract bitvavo # CCXT version: 4.5.42 # Spec format version: 2 # # 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: [ "NL" ], currencies: %{}, currency_aliases: %{ "BCHSV" => "BSV", "MIOTA" => "IOTA", "XBT" => "BTC" }, dex: false, enable_rate_limit: true, endpoint_extraction_stats: %{ "capturedMethods" => 20, "coveragePercent" => 100, "enabledMethods" => 30, "excluded" => [ %{ "method" => "fetchDepositWithdrawFee", "reason" => "emulated (returns cached data, no HTTP call)" } ], "excludedMethods" => 1, "extractableMethods" => 29, "failures" => [ %{ "error" => "bitvavo canceAllOrders() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "cancelAllOrders" }, %{ "error" => "bitvavo cancelOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "cancelOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createLimitOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createMarketOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createStopLimitOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createStopMarketOrder" }, %{ "error" => "bitvavo createOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "createStopOrder" }, %{ "error" => "bitvavo editOrder() requires an operatorId in params or options, eg: exchange.options['operatorId'] = 1234567890", "method" => "editOrder" } ] }, endpoints: [ %{ api_section: "private", auth: true, cost: 5, expects: :single, market_type: :spot, method: :get, name: :fetch_balance, param_mappings: %{}, params: [], path: "/balance", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_currencies, param_mappings: %{}, params: [], path: "/assets", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_deposit_address, param_mappings: %{ "code" => "symbol" }, params: [ :code ], path: "/deposit", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_deposit_withdraw_fees, param_mappings: %{}, params: [ :codes ], path: "/assets", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 5, expects: :list, market_type: :spot, method: :get, name: :fetch_deposits, param_mappings: %{ "code" => "symbol" }, params: [ :code, :since, :limit ], path: "/depositHistory", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_l2_order_book, param_mappings: %{ "symbol" => "market" }, params: [ :symbol, :limit ], path: "/{market}/book", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_markets, param_mappings: %{}, params: [], path: "/markets", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 5, expects: :list, market_type: :spot, method: :get, name: :fetch_my_trades, pagination: %{ style: :dynamic }, param_mappings: %{ "symbol" => "market" }, params: [ :symbol, :since, :limit ], path: "/trades", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, default_params: %{ "end" => "" }, expects: :list, market_type: :spot, method: :get, name: :fetch_ohlcv, pagination: %{ style: :time_window }, param_mappings: %{ "since" => "start", "symbol" => "market", "timeframe" => "interval" }, params: [ :symbol, :timeframe, :since, :limit ], path: "/{market}/candles", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_open_orders, param_mappings: %{ "symbol" => "market" }, params: [ :symbol, :since, :limit ], path: "/ordersOpen", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_order, param_mappings: %{ "id" => "orderId", "symbol" => "market" }, params: [ :id, :symbol ], path: "/order", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_order_book, param_mappings: %{ "limit" => "depth", "symbol" => "market" }, params: [ :symbol, :limit ], path: "/{market}/book", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 5, expects: :list, market_type: :spot, method: :get, name: :fetch_orders, pagination: %{ style: :dynamic }, param_mappings: %{ "symbol" => "market" }, params: [ :symbol, :since, :limit ], path: "/orders", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_ticker, param_mappings: %{ "symbol" => "market" }, params: [ :symbol ], path: "/ticker/24h", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_tickers, param_mappings: %{}, params: [ :symbols ], path: "/ticker/24h", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 1, expects: :single, market_type: :spot, method: :get, name: :fetch_time, param_mappings: %{}, params: [], path: "/time", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted }, %{ api_section: "public", auth: false, cost: 5, expects: :list, market_type: :spot, method: :get, name: :fetch_trades, pagination: %{ style: :dynamic }, param_mappings: %{ "since" => "start", "symbol" => "market" }, params: [ :symbol, :since, :limit ], path: "/{market}/trades", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 1, expects: :list, market_type: :spot, method: :get, name: :fetch_trading_fees, param_mappings: %{}, params: [], path: "/account", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 5, expects: :list, market_type: :spot, method: :get, name: :fetch_withdrawals, param_mappings: %{ "code" => "symbol" }, params: [ :code, :since, :limit ], path: "/withdrawalHistory", response_transformer: {:extract_path, ["nonce"]}, source: :intercepted }, %{ api_section: "private", auth: true, cost: 1, expects: :single, market_type: :spot, method: :post, name: :withdraw, param_mappings: %{ "code" => "symbol" }, params: [ :code, :amount, :address, :tag ], path: "/withdrawal", response_transformer: {:extract_path_unwrap, ["nonce"]}, source: :intercepted } ], error_code_details: %{ 101 => %{ description: "Unknown error. Operation may or may not have succeeded.", type: :exchange_error }, 102 => %{ description: "Invalid JSON.", type: :invalid_parameters }, 103 => %{ description: "You have been rate limited. Please observe the Bitvavo-Ratelimit-AllowAt header to see when you can send requests again. Failure to respect this limit will result in an IP ban. The default value is 1000 weighted requests per minute. Please contact support if you wish to increase this limit.", type: :rate_limited }, 104 => %{ description: "You have been rate limited by the number of new orders. The default value is 100 new orders per second or 100.000 new orders per day. Please update existing orders instead of cancelling and creating orders. Please contact support if you wish to increase this limit.", type: :rate_limited }, 105 => %{ description: "Your IP or API key has been banned for not respecting the rate limit. The ban expires at ${expiryInMs}.", type: :access_restricted }, 107 => %{ description: "The matching engine is overloaded. Please wait 500ms and resubmit your order.", type: :network_error }, 108 => %{ description: "The matching engine could not process your order in time. Please consider increasing the access window or resubmit your order.", type: :network_error }, 109 => %{ description: "The matching engine did not respond in time. Operation may or may not have succeeded.", type: :network_error }, 110 => %{ description: "Invalid endpoint. Please check url and HTTP method.", type: :invalid_parameters }, 200 => %{ description: "${param} url parameter is not supported. Please note that parameters are case-sensitive and use body parameters for PUT and POST requests.", type: :invalid_parameters }, 201 => %{ description: "${param} body parameter is not supported. Please note that parameters are case-sensitive and use url parameters for GET and DELETE requests.", type: :invalid_parameters }, 202 => %{ description: "${param} order parameter is not supported. Please note that certain parameters are only allowed for market or limit orders.", type: :invalid_parameters }, 203 => %{ description: "{\"errorCode\":203,\"error\":\"symbol parameter is required.\"}", type: :invalid_order }, 204 => %{ description: "${param} parameter is not supported.", type: :invalid_parameters }, 205 => %{ description: "${param} parameter is invalid.", type: :invalid_parameters }, 206 => %{ description: "Use either ${paramA} or ${paramB}. The usage of both parameters at the same time is not supported.", type: :invalid_parameters }, 210 => %{ description: "Amount exceeds the maximum allowed amount (1000000000).", type: :invalid_order }, 211 => %{ description: "Price exceeds the maximum allowed amount (100000000000).", type: :invalid_order }, 212 => %{ description: "Amount is below the minimum allowed amount for this asset.", type: :invalid_order }, 213 => %{ description: "Price is below the minimum allowed amount (0.000000000000001).", type: :invalid_order }, 214 => %{ description: "Price is too detailed", type: :invalid_order }, 215 => %{ description: "Price is too detailed. A maximum of 15 digits behind the decimal point are allowed.", type: :invalid_order }, 216 => %{ description: "{\"errorCode\":216,\"error\":\"You do not have sufficient balance to complete this operation.\"}", type: :insufficient_balance }, 217 => %{ description: "{\"errorCode\":217,\"error\":\"Minimum order size in quote currency is 5 EUR or 0.001 BTC.\"}", type: :invalid_order }, 230 => %{ description: "The order is rejected by the matching engine.", type: :exchange_error }, 231 => %{ description: "The order is rejected by the matching engine. TimeInForce must be GTC when markets are paused.", type: :exchange_error }, 232 => %{ description: "You must change at least one of amount, amountRemaining, price, timeInForce, selfTradePrevention or postOnly.", type: :invalid_parameters }, 233 => %{ description: "{\"errorCode\":233,\"error\":\"Order must be active (status new or partiallyFilled) to allow updating/cancelling.\"}", type: :invalid_order }, 234 => %{ description: "Market orders cannot be updated.", type: :invalid_order }, 235 => %{ description: "You can only have 100 open orders on each book.", type: :exchange_error }, 236 => %{ description: "You can only update amount or amountRemaining, not both.", type: :invalid_parameters }, 240 => %{ description: "{\"errorCode\":240,\"error\":\"No order found. Please be aware that simultaneously updating the same order may return this error.\"}", type: :order_not_found }, 300 => %{ description: "Authentication is required for this endpoint.", type: :invalid_credentials }, 301 => %{ description: "{\"errorCode\":301,\"error\":\"API Key must be of length 64.\"}", type: :invalid_credentials }, 302 => %{ description: "Timestamp is invalid. This must be a timestamp in ms. See Bitvavo-Access-Timestamp header or timestamp parameter for websocket.", type: :invalid_credentials }, 303 => %{ description: "Window must be between 100 and 60000 ms.", type: :invalid_credentials }, 304 => %{ description: "Request was not received within acceptable window (default 30s, or custom with Bitvavo-Access-Window header) of Bitvavo-Access-Timestamp header (or timestamp parameter for websocket).", type: :invalid_credentials }, 305 => %{ description: "{\"errorCode\":305,\"error\":\"No active API key found.\"}", type: :invalid_credentials }, 306 => %{ description: "No active API key found. Please ensure that you have confirmed the API key by e-mail.", type: :invalid_credentials }, 307 => %{ description: "This key does not allow access from this IP.", type: :access_restricted }, 308 => %{ description: "{\"errorCode\":308,\"error\":\"The signature length is invalid (HMAC-SHA256 should return a 64 length hexadecimal string).\"}", type: :invalid_credentials }, 309 => %{ description: "{\"errorCode\":309,\"error\":\"The signature is invalid.\"}", type: :invalid_credentials }, 310 => %{ description: "This key does not allow trading actions.", type: :access_restricted }, 311 => %{ description: "This key does not allow showing account information.", type: :access_restricted }, 312 => %{ description: "This key does not allow withdrawal of funds.", type: :access_restricted }, 315 => %{ description: "Websocket connections may not be used in a browser. Please use REST requests for this.", type: :invalid_parameters }, 317 => %{ description: "This account is locked. Please contact support.", type: :access_restricted }, 400 => %{ description: "Unknown error. Please contact support with a copy of your request.", type: :exchange_error }, 401 => %{ description: "Deposits for this asset are not available at this time.", type: :exchange_error }, 402 => %{ description: "You need to verify your identitiy before you can deposit and withdraw digital assets.", type: :access_restricted }, 403 => %{ description: "You need to verify your phone number before you can deposit and withdraw digital assets.", type: :access_restricted }, 404 => %{ description: "Could not complete this operation, because our node cannot be reached. Possibly under maintenance.", type: :network_error }, 405 => %{ description: "You cannot withdraw digital assets during a cooldown period. This is the result of newly added bank accounts.", type: :exchange_error }, 406 => %{ description: "{\"errorCode\":406,\"error\":\"Your withdrawal is too small.\"}", type: :invalid_parameters }, 407 => %{ description: "Internal transfer is not possible.", type: :exchange_error }, 408 => %{ description: "{\"errorCode\":408,\"error\":\"You do not have sufficient balance to complete this operation.\"}", type: :insufficient_balance }, 409 => %{ description: "{\"errorCode\":409,\"error\":\"This is not a verified bank account.\"}", type: :invalid_parameters }, 410 => %{ description: "Withdrawals for this asset are not available at this time.", type: :exchange_error }, 411 => %{ description: "You can not transfer assets to yourself.", type: :invalid_parameters }, 412 => %{ description: "{\"errorCode\":412,\"error\":\"eth_address_invalid.\"}", type: :invalid_parameters }, 413 => %{ description: "This address violates the whitelist.", type: :invalid_parameters }, 414 => %{ description: "You cannot withdraw assets within 2 minutes of logging in.", type: :exchange_error }, "amount parameter is invalid" => %{ description: "{\"errorCode\":205,\"error\":\"amount parameter is invalid.\"}", type: :invalid_order }, "orderId parameter is invalid" => %{ description: "{\"errorCode\":205,\"error\":\"orderId parameter is invalid.\"}", type: :invalid_order }, "start parameter is invalid" => %{ description: "{\"errorCode\":205,\"error\":\"start parameter is invalid.\"}", type: :invalid_parameters }, "symbol parameter is invalid" => %{ description: "{\"errorCode\":205,\"error\":\"symbol parameter is invalid.\"}", type: :invalid_order } }, error_codes: %{ 101 => :exchange_error, 102 => :invalid_parameters, 103 => :rate_limited, 104 => :rate_limited, 105 => :access_restricted, 107 => :network_error, 108 => :network_error, 109 => :network_error, 110 => :invalid_parameters, 200 => :invalid_parameters, 201 => :invalid_parameters, 202 => :invalid_parameters, 203 => :invalid_order, 204 => :invalid_parameters, 205 => :invalid_parameters, 206 => :invalid_parameters, 210 => :invalid_order, 211 => :invalid_order, 212 => :invalid_order, 213 => :invalid_order, 214 => :invalid_order, 215 => :invalid_order, 216 => :insufficient_balance, 217 => :invalid_order, 230 => :exchange_error, 231 => :exchange_error, 232 => :invalid_parameters, 233 => :invalid_order, 234 => :invalid_order, 235 => :exchange_error, 236 => :invalid_parameters, 240 => :order_not_found, 300 => :invalid_credentials, 301 => :invalid_credentials, 302 => :invalid_credentials, 303 => :invalid_credentials, 304 => :invalid_credentials, 305 => :invalid_credentials, 306 => :invalid_credentials, 307 => :access_restricted, 308 => :invalid_credentials, 309 => :invalid_credentials, 310 => :access_restricted, 311 => :access_restricted, 312 => :access_restricted, 315 => :invalid_parameters, 317 => :access_restricted, 400 => :exchange_error, 401 => :exchange_error, 402 => :access_restricted, 403 => :access_restricted, 404 => :network_error, 405 => :exchange_error, 406 => :invalid_parameters, 407 => :exchange_error, 408 => :insufficient_balance, 409 => :invalid_parameters, 410 => :exchange_error, 411 => :invalid_parameters, 412 => :invalid_parameters, 413 => :invalid_parameters, 414 => :exchange_error, "amount parameter is invalid" => :invalid_order, "orderId parameter is invalid" => :invalid_order, "start parameter is invalid" => :invalid_parameters, "symbol parameter is invalid" => :invalid_order }, exceptions: %{ broad: %{ "amount parameter is invalid" => :invalid_order, "orderId parameter is invalid" => :invalid_order, "start parameter is invalid" => :bad_request, "symbol parameter is invalid" => :bad_symbol }, exact: %{ "101" => :exchange_error, "102" => :bad_request, "103" => :rate_limit_exceeded, "104" => :rate_limit_exceeded, "105" => :permission_denied, "107" => :exchange_not_available, "108" => :exchange_not_available, "109" => :exchange_not_available, "110" => :bad_request, "200" => :bad_request, "201" => :bad_request, "202" => :bad_request, "203" => :bad_symbol, "204" => :bad_request, "205" => :bad_request, "206" => :bad_request, "210" => :invalid_order, "211" => :invalid_order, "212" => :invalid_order, "213" => :invalid_order, "214" => :invalid_order, "215" => :invalid_order, "216" => :insufficient_funds, "217" => :invalid_order, "230" => :exchange_error, "231" => :exchange_error, "232" => :bad_request, "233" => :invalid_order, "234" => :invalid_order, "235" => :exchange_error, "236" => :bad_request, "240" => :order_not_found, "300" => :authentication_error, "301" => :authentication_error, "302" => :authentication_error, "303" => :authentication_error, "304" => :authentication_error, "305" => :authentication_error, "306" => :authentication_error, "307" => :permission_denied, "308" => :authentication_error, "309" => :authentication_error, "310" => :permission_denied, "311" => :permission_denied, "312" => :permission_denied, "315" => :bad_request, "317" => :account_suspended, "400" => :exchange_error, "401" => :exchange_error, "402" => :permission_denied, "403" => :permission_denied, "404" => :on_maintenance, "405" => :exchange_error, "406" => :bad_request, "407" => :exchange_error, "408" => :insufficient_funds, "409" => :invalid_address, "410" => :exchange_error, "411" => :bad_request, "412" => :invalid_address, "413" => :invalid_address, "414" => :exchange_error } }, exchange_options: %{ "BITVAVO-ACCESS-WINDOW" => 10000, "currencyToPrecisionRoundingMode" => 0, "defaultNetworkCodeReplacements" => %{ "BRC20" => %{ "BRC20" => "BTC" }, "CRO" => %{ "CRC20" => "CRONOS" }, "ETH" => %{ "ERC20" => "ETH" }, "TRX" => %{ "TRC20" => "TRX" } }, "fiatCurrencies" => [ "EUR" ], "networks" => %{ "ERC20" => "ETH", "TRC20" => "TRX" }, "networksById" => %{ "ETH" => "ERC20", "TRX" => "TRC20" }, "operatorId" => nil }, extended_metadata: %{ fees_url: "https://bitvavo.com/en/fees", limits: %{ "amount" => %{}, "cost" => %{}, "leverage" => %{}, "price" => %{} }, logo_url: "https://github.com/user-attachments/assets/d213155c-8c71-4701-9bd5-45351febc2a8", referral_url: "https://bitvavo.com/?a=24F34952F7" }, extracted_metadata: %{ ccxt_version: "4.5.42" }, features: %{ future: %{}, spot: %{ create_order: %{ hedged: false, iceberg: false, leverage: false, margin_mode: false, market_buy_by_cost: true, market_buy_requires_price: false, self_trade_prevention: %{ e_x_p_i_r_e__b_o_t_h: true, e_x_p_i_r_e__m_a_k_e_r: false, e_x_p_i_r_e__t_a_k_e_r: false, n_o_n_e: false }, stop_loss_price: true, take_profit_price: true, time_in_force: %{ fok: true, gtd: false, ioc: true, po: true }, trailing: false, trigger_price: true }, fetch_my_trades: %{ days_back: 100000, limit: 1000, margin_mode: false, symbol_required: true, until_days: 100000 }, fetch_ohlcv: %{ limit: 1440 }, fetch_open_orders: %{ margin_mode: false, symbol_required: true, trailing: false, trigger: false }, fetch_order: %{ margin_mode: false, symbol_required: true, trailing: false, trigger: false }, fetch_orders: %{ days_back: 100000, limit: 1000, margin_mode: true, symbol_required: true, trailing: false, trigger: false, until_days: 100000 }, sandbox: false }, swap: %{} }, fees: %{ trading: %{ maker: 0.002, percentage: true, taker: 0.0025, tier_based: true, tiers: %{ maker: [ %{ fee: 0.0015, volume: 0 }, %{ fee: 0.001, volume: 100000 }, %{ fee: 0.0008, volume: 250000 }, %{ fee: 0.0006, volume: 500000 }, %{ fee: 0.0005, volume: 1000000 }, %{ fee: 0.0004, volume: 2500000 }, %{ fee: 0.0004, volume: 5000000 }, %{ fee: 0.0003, volume: 10000000 }, %{ fee: 0.0003, volume: 25000000 } ], taker: [ %{ fee: 0.0025, volume: 0 }, %{ fee: 0.002, volume: 100000 }, %{ fee: 0.0016, volume: 250000 }, %{ fee: 0.0012, volume: 500000 }, %{ fee: 0.001, volume: 1000000 }, %{ fee: 0.0008, volume: 2500000 }, %{ fee: 0.0006, volume: 5000000 }, %{ fee: 0.0005, volume: 10000000 }, %{ fee: 0.0004, volume: 25000000 } ] } } }, forward_aliases: %{ spot: %{ "IOTA" => "MIOTA" } }, 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 // {\"errorCode\":308,\"error\":\"The signature length is invalid (HMAC-SHA256 should return a 64 length hexadecimal string).\"}\n // {\"errorCode\":203,\"error\":\"symbol parameter is required.\"}\n // {\"errorCode\":205,\"error\":\"symbol parameter is invalid.\"}\n //\n const errorCode = this.safeString(response, 'errorCode');\n const error = this.safeString(response, 'error');\n if (errorCode !== undefined) {\n const feedback = this.id + ' ' + body;\n this.throwBroadlyMatchedException(this.exceptions['broad'], error, feedback);\n this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);\n throw new errors.ExchangeError(feedback); // unknown message\n }\n return undefined;\n }", has: %{ add_margin: false, 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: false, cancel_orders_with_client_order_id: false, cancel_orders_ws: false, close_all_positions: false, close_position: 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: true, create_stop_limit_order_ws: false, create_stop_loss_order: false, create_stop_loss_order_ws: false, create_stop_market_order: true, create_stop_market_order_ws: false, create_stop_order: true, 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: true, edit_order_with_client_order_id: false, edit_order_ws: false, edit_orders: false, fetch_a_d_l_rank: 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: false, fetch_canceled_orders: false, fetch_closed_order: false, fetch_closed_orders: false, 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: true, fetch_deposit_addresses: false, fetch_deposit_addresses_by_network: false, fetch_deposit_withdraw_fee: true, fetch_deposit_withdraw_fees: true, fetch_deposits: true, fetch_deposits_withdrawals: false, fetch_deposits_ws: false, fetch_funding_history: false, fetch_funding_interval: false, fetch_funding_intervals: false, fetch_funding_rate: false, fetch_funding_rate_history: false, fetch_funding_rates: false, fetch_greeks: false, fetch_index_ohlcv: false, fetch_isolated_borrow_rate: false, 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: false, fetch_ledger_entry: false, fetch_leverage: false, fetch_leverage_tiers: false, fetch_leverages: false, fetch_liquidations: false, fetch_long_short_ratio: false, fetch_long_short_ratio_history: false, fetch_margin_adjustment_history: false, fetch_margin_mode: false, fetch_margin_modes: false, fetch_mark_ohlcv: false, fetch_mark_prices: false, fetch_market_leverage_tiers: false, 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: false, 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_a_d_l_rank: false, fetch_position_history: false, fetch_position_mode: false, fetch_position_ws: false, fetch_positions: false, fetch_positions_a_d_l_rank: false, fetch_positions_for_symbol: false, fetch_positions_for_symbol_ws: false, fetch_positions_history: false, fetch_positions_risk: false, 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: false, fetch_trading_fees: true, fetch_trading_fees_ws: false, fetch_trading_limits: false, fetch_transaction_fee: false, 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: true, fetch_withdrawals_ws: false, future: false, margin: false, option: false, private_api: true, public_api: true, reduce_margin: false, repay_cross_margin: false, repay_isolated_margin: false, repay_margin: false, sandbox: false, set_leverage: false, set_margin: false, set_margin_mode: false, set_position_mode: false, sign_in: false, spot: true, swap: false, transfer: false, 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: false, watch_bids_asks: true, watch_liquidations: false, watch_liquidations_for_symbols: false, watch_my_liquidations: false, watch_my_liquidations_for_symbols: false, watch_my_trades: true, watch_ohlcv: true, watch_ohlcv_for_symbols: false, watch_order_book: true, watch_order_book_for_symbols: false, watch_orders: true, watch_orders_for_symbols: false, watch_position: false, watch_positions: false, watch_status: false, watch_ticker: true, watch_tickers: true, watch_trades: true, watch_trades_for_symbols: false, withdraw: true, ws: false }, http_config: nil, id: "bitvavo", markets: nil, name: "Bitvavo", ohlcv_timestamp_resolution: :milliseconds, options: %{ "b_i_t_v_a_v_o-_a_c_c_e_s_s-_w_i_n_d_o_w" => 10000, :currency_to_precision_rounding_mode => 0, "fiat_currencies" => [ "EUR" ], :networks => %{ "ERC20" => "ETH", "TRC20" => "TRX" }, "operator_id" => nil }, order_mappings: nil, param_mappings: %{ "code" => "symbol", "id" => "orderId", "limit" => "depth", "since" => "start", "symbol" => "market", "timeframe" => "interval" }, parse_methods: [ %{ "comment" => nil, "examples" => [], "line_end" => 1123, "line_start" => 1107, "mappings" => [], "name" => "parseBalance", "signature" => "parseBalance (response): Balances", "source" => "parseBalance (response): Balances {\n const result: Dict = {\n 'info': response,\n 'timestamp': undefined,\n 'datetime': undefined,\n };\n for (let i = 0; i < response.length; i++) {\n const balance = response[i];\n const currencyId = this.safeString (balance, 'symbol');\n const code = this.safeCurrencyCode (currencyId);\n const account = this.account ();\n account['free'] = this.safeString (balance, 'available');\n account['used'] = this.safeString (balance, 'inOrder');\n result[code] = account;\n }\n return this.safeBalance (result);\n }" }, %{ "comment" => nil, "examples" => [ "[\n {\n \"symbol\": \"USDT\",\n \"displayTicker\": \"USDT\",\n \"name\": \"Tether\",\n \"slug\": \"tether\",\n \"popularity\": -1,\n \"decimals\": 6,\n \"depositFee\": \"0\",\n \"depositConfirmations\": 64,\n \"depositStatus\": \"OK\",\n \"withdrawalFee\": \"3.2\",\n \"withdrawalMinAmount\": \"3.2\",\n \"withdrawalStatus\": \"OK\",\n \"networks\": [\n \"ETH\"\n ],\n \"light\": {\n \"color\": \"#009393\",\n \"icon\": { \"hash\": \"4ad7c699\", \"svg\": \"https://...\", \"webp16\": \"https://...\", \"webp32\": \"https://...\", \"webp64\": \"https://...\", \"webp128\": \"https://...\", \"webp256\": \"https://...\", \"png16\": \"https://...\", \"png32\": \"https://...\", \"png64\": \"https://...\", \"png128\": \"https://...\", \"png256\": \"https://...\"\n }\n },\n \"dark\": {\n \"color\": \"#009393\",\n \"icon\": { \"hash\": \"4ad7c699\", \"svg\": \"https://...\", \"webp16\": \"https://...\", \"webp32\": \"https://...\", \"webp64\": \"https://...\", \"webp128\": \"https://...\", \"webp256\": \"https://...\", \"png16\": \"https://...\", \"png32\": \"https://...\", \"png64\": \"https://...\", \"png128\": \"https://...\", \"png256\": \"https://...\"\n }\n },\n \"visibility\": \"PUBLIC\",\n \"message\": \"\"\n },\n ]" ], "line_end" => 666, "line_start" => 567, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "currency" }, %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "code", "value" => "code" }, %{ "comment" => nil, "key" => "name", "value" => "this.safeString (currency, 'name')" }, %{ "comment" => nil, "key" => "active", "value" => "active" }, %{ "comment" => nil, "key" => "deposit", "value" => "deposit" }, %{ "comment" => nil, "key" => "withdraw", "value" => "withdrawal" }, %{ "comment" => nil, "key" => "networks", "value" => "networks" }, %{ "comment" => nil, "key" => "fee", "value" => "withdrawFee" }, %{ "comment" => nil, "key" => "precision", "value" => "undefined" }, %{ "comment" => nil, "key" => "type", "value" => "isFiat ? 'fiat' : 'crypto'" }, %{ "comment" => nil, "key" => "limits", "value" => "{\n 'amount': {\n 'min': undefined,\n 'max': undefined,\n },\n 'deposit': {\n 'min': undefined,\n 'max': undefined,\n },\n 'withdraw': {\n 'min': minWithdraw,\n 'max': undefined,\n },\n }" }, %{ "comment" => nil, "key" => "amount", "value" => "{\n 'min': undefined,\n 'max': undefined,\n }" }, %{ "comment" => nil, "key" => "deposit", "value" => "{\n 'min': undefined,\n 'max': undefined,\n }" }, %{ "comment" => nil, "key" => "withdraw", "value" => "{\n 'min': minWithdraw,\n 'max': undefined,\n }" } ], "name" => "parseCurrenciesCustom", "signature" => "parseCurrenciesCustom (currencies)", "source" => "parseCurrenciesCustom (currencies) {\n //\n // [\n // {\n // \"symbol\": \"USDT\",\n // \"displayTicker\": \"USDT\",\n // \"name\": \"Tether\",\n // \"slug\": \"tether\",\n // \"popularity\": -1,\n // \"decimals\": 6,\n // \"depositFee\": \"0\",\n // \"depositConfirmations\": 64,\n // \"depositStatus\": \"OK\",\n // \"withdrawalFee\": \"3.2\",\n // \"withdrawalMinAmount\": \"3.2\",\n // \"withdrawalStatus\": \"OK\",\n // \"networks\": [\n // \"ETH\"\n // ],\n // \"light\": {\n // \"color\": \"#009393\",\n // \"icon\": { \"hash\": \"4ad7c699\", \"svg\": \"https://...\", \"webp16\": \"https://...\", \"webp32\": \"https://...\", \"webp64\": \"https://...\", \"webp128\": \"https://...\", \"webp256\": \"https://...\", \"png16\": \"https://...\", \"png32\": \"https://...\", \"png64\": \"https://...\", \"png128\": \"https://...\", \"png256\": \"https://...\"\n // }\n // },\n // \"dark\": {\n // \"color\": \"#009393\",\n // \"icon\": { \"hash\": \"4ad7c699\", \"svg\": \"https://...\", \"webp16\": \"https://...\", \"webp32\": \"https://...\", \"webp64\": \"https://...\", \"webp128\": \"https://...\", \"webp256\": \"https://...\", \"png16\": \"https://...\", \"png32\": \"https://...\", \"png64\": \"https://...\", \"png128\": \"https://...\", \"png256\": \"https://...\"\n // }\n // },\n // \"visibility\": \"PUBLIC\",\n // \"message\": \"\"\n // },\n // ]\n //\n const fiatCurrencies = this.safeList (this.options, 'fiatCurrencies', []);\n const result: Dict = {};\n for (let i = 0; i < currencies.length; i++) {\n const currency = currencies[i];\n const id = this.safeString (currency, 'symbol');\n const code = this.safeCurrencyCode (id);\n const isFiat = this.inArray (code, fiatCurrencies);\n const networks: Dict = {};\n const networksArray = this.safeList (currency, 'networks', []);\n const deposit = this.safeString (currency, 'depositStatus') === 'OK';\n const withdrawal = this.safeString (currency, 'withdrawalStatus') === 'OK';\n const active = deposit && withdrawal;\n const withdrawFee = this.safeNumber (currency, 'withdrawalFee');\n const precision = this.safeString (currency, 'decimals', '8');\n const minWithdraw = this.safeNumber (currency, 'withdrawalMinAmount');\n // btw, absolutely all of them have 1 network atm\n for (let j = 0; j < networksArray.length; j++) {\n const networkId = networksArray[j];\n const networkCode = this.networkIdToCode (networkId);\n networks[networkCode] = {\n 'info': currency,\n 'id': networkId,\n 'network': networkCode,\n 'active': active,\n 'deposit': deposit,\n 'withdraw': withdrawal,\n 'fee': withdrawFee,\n 'precision': this.parseNumber (this.parsePrecision (precision)),\n 'limits': {\n 'withdraw': {\n 'min': minWithdraw,\n 'max': undefined,\n },\n },\n };\n }\n result[code] = this.safeCurrencyStructure ({\n 'info': currency,\n 'id': id,\n 'code': code,\n 'name': this.safeString (currency, 'name'),\n 'active': active,\n 'deposit': deposit,\n 'withdraw': withdrawal,\n 'networks': networks,\n 'fee': withdrawFee,\n 'precision': undefined,\n 'type': isFiat ? 'fiat' : 'crypto',\n 'limits': {\n 'amount': {\n 'min': undefined,\n 'max': undefined,\n },\n 'deposit': {\n 'min': undefined,\n 'max': undefined,\n },\n 'withdraw': {\n 'min': minWithdraw,\n 'max': undefined,\n },\n },\n });\n }\n return result;\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"symbol\": \"1INCH\",\n \"name\": \"1inch\",\n \"decimals\": 8,\n \"depositFee\": \"0\",\n \"depositConfirmations\": 64,\n \"depositStatus\": \"OK\",\n \"withdrawalFee\": \"6.1\",\n \"withdrawalMinAmount\": \"6.1\",\n \"withdrawalStatus\": \"OK\",\n \"networks\": [\n \"ETH\"\n ],\n \"message\": \"\"\n }" ], "line_end" => 2160, "line_start" => 2118, "mappings" => [ %{ "comment" => nil, "key" => "fee", "value" => "this.safeNumber (fee, 'depositFee')" }, %{ "comment" => nil, "key" => "percentage", "value" => "false" } ], "name" => "parseDepositWithdrawFee", "signature" => "parseDepositWithdrawFee (fee, currency: Currency = undefined)", "source" => "parseDepositWithdrawFee (fee, currency: Currency = undefined) {\n //\n // {\n // \"symbol\": \"1INCH\",\n // \"name\": \"1inch\",\n // \"decimals\": 8,\n // \"depositFee\": \"0\",\n // \"depositConfirmations\": 64,\n // \"depositStatus\": \"OK\",\n // \"withdrawalFee\": \"6.1\",\n // \"withdrawalMinAmount\": \"6.1\",\n // \"withdrawalStatus\": \"OK\",\n // \"networks\": [\n // \"ETH\"\n // ],\n // \"message\": \"\"\n // }\n //\n const result: Dict = {\n 'info': fee,\n 'withdraw': {\n 'fee': this.safeNumber (fee, 'withdrawalFee'),\n 'percentage': false,\n },\n 'deposit': {\n 'fee': this.safeNumber (fee, 'depositFee'),\n 'percentage': false,\n },\n 'networks': {},\n };\n const networks = this.safeValue (fee, 'networks');\n let networkId = this.safeValue (networks, 0); // Bitvavo currently only supports one network per currency\n const currencyCode = this.safeString (currency, 'code');\n if (networkId === 'Mainnet') {\n networkId = currencyCode;\n }\n const networkCode = this.networkIdToCode (networkId, currencyCode);\n result['networks'][networkCode] = {\n 'deposit': result['deposit'],\n 'withdraw': result['withdraw'],\n };\n return result;\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 519, "line_start" => 454, "mappings" => [ %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "symbol", "value" => "base + '/' + quote" }, %{ "comment" => nil, "key" => "base", "value" => "base" }, %{ "comment" => nil, "key" => "quote", "value" => "quote" }, %{ "comment" => nil, "key" => "settle", "value" => "undefined" }, %{ "comment" => nil, "key" => "baseId", "value" => "baseId" }, %{ "comment" => nil, "key" => "quoteId", "value" => "quoteId" }, %{ "comment" => nil, "key" => "settleId", "value" => "undefined" }, %{ "comment" => nil, "key" => "type", "value" => "'spot'" }, %{ "comment" => nil, "key" => "spot", "value" => "true" }, %{ "comment" => nil, "key" => "margin", "value" => "false" }, %{ "comment" => nil, "key" => "swap", "value" => "false" }, %{ "comment" => nil, "key" => "future", "value" => "false" }, %{ "comment" => nil, "key" => "option", "value" => "false" }, %{ "comment" => nil, "key" => "active", "value" => "(status === 'trading')" }, %{ "comment" => nil, "key" => "contract", "value" => "false" }, %{ "comment" => nil, "key" => "linear", "value" => "undefined" }, %{ "comment" => nil, "key" => "inverse", "value" => "undefined" }, %{ "comment" => nil, "key" => "contractSize", "value" => "undefined" }, %{ "comment" => nil, "key" => "expiry", "value" => "undefined" }, %{ "comment" => nil, "key" => "expiryDatetime", "value" => "undefined" }, %{ "comment" => nil, "key" => "strike", "value" => "undefined" }, %{ "comment" => nil, "key" => "optionType", "value" => "undefined" }, %{ "comment" => nil, "key" => "taker", "value" => "fees['trading']['taker']" }, %{ "comment" => nil, "key" => "maker", "value" => "fees['trading']['maker']" }, %{ "comment" => nil, "key" => "precision", "value" => "{\n 'amount': this.parseNumber (this.parsePrecision (this.safeString (market, 'quantityDecimals'))),\n 'price': this.safeNumber (market, 'tickSize'),\n 'cost': this.parseNumber (this.parsePrecision (this.safeString (market, 'notionalDecimals'))),\n }" }, %{ "comment" => nil, "key" => "limits", "value" => "{\n 'leverage': {\n 'min': undefined,\n 'max': undefined,\n },\n 'amount': {\n 'min': this.safeNumber (market, 'minOrderInBaseAsset'),\n 'max': this.safeNumber (market, 'maxOrderInBaseAsset'),\n },\n 'price': {\n 'min': undefined,\n 'max': undefined,\n },\n 'cost': {\n 'min': this.safeNumber (market, 'minOrderInQuoteAsset'),\n 'max': this.safeNumber (market, 'maxOrderInQuoteAsset'),\n },\n }" }, %{ "comment" => nil, "key" => "created", "value" => "undefined" }, %{ "comment" => nil, "key" => "info", "value" => "market" }, %{ "comment" => nil, "key" => "leverage", "value" => "{\n 'min': undefined,\n 'max': undefined,\n }" }, %{ "comment" => nil, "key" => "amount", "value" => "{\n 'min': this.safeNumber (market, 'minOrderInBaseAsset'),\n 'max': this.safeNumber (market, 'maxOrderInBaseAsset'),\n }" }, %{ "comment" => nil, "key" => "price", "value" => "{\n 'min': undefined,\n 'max': undefined,\n }" }, %{ "comment" => nil, "key" => "cost", "value" => "{\n 'min': this.safeNumber (market, 'minOrderInQuoteAsset'),\n 'max': this.safeNumber (market, 'maxOrderInQuoteAsset'),\n }" }, %{ "comment" => nil, "key" => "min", "value" => "undefined" }, %{ "comment" => nil, "key" => "max", "value" => "undefined" } ], "name" => "parseMarkets", "signature" => "parseMarkets (markets)", "source" => "parseMarkets (markets) {\n const result = [];\n const fees = this.fees;\n for (let i = 0; i < markets.length; i++) {\n const market = markets[i];\n const id = this.safeString (market, 'market');\n const baseId = this.safeString (market, 'base');\n const quoteId = this.safeString (market, 'quote');\n const base = this.safeCurrencyCode (baseId);\n const quote = this.safeCurrencyCode (quoteId);\n const status = this.safeString (market, 'status');\n result.push (this.safeMarketStructure ({\n 'id': id,\n 'symbol': base + '/' + quote,\n 'base': base,\n 'quote': quote,\n 'settle': undefined,\n 'baseId': baseId,\n 'quoteId': quoteId,\n 'settleId': undefined,\n 'type': 'spot',\n 'spot': true,\n 'margin': false,\n 'swap': false,\n 'future': false,\n 'option': false,\n 'active': (status === 'trading'),\n 'contract': false,\n 'linear': undefined,\n 'inverse': undefined,\n 'contractSize': undefined,\n 'expiry': undefined,\n 'expiryDatetime': undefined,\n 'strike': undefined,\n 'optionType': undefined,\n 'taker': fees['trading']['taker'],\n 'maker': fees['trading']['maker'],\n 'precision': {\n 'amount': this.parseNumber (this.parsePrecision (this.safeString (market, 'quantityDecimals'))),\n 'price': this.safeNumber (market, 'tickSize'),\n 'cost': this.parseNumber (this.parsePrecision (this.safeString (market, 'notionalDecimals'))),\n },\n 'limits': {\n 'leverage': {\n 'min': undefined,\n 'max': undefined,\n },\n 'amount': {\n 'min': this.safeNumber (market, 'minOrderInBaseAsset'),\n 'max': this.safeNumber (market, 'maxOrderInBaseAsset'),\n },\n 'price': {\n 'min': undefined,\n 'max': undefined,\n },\n 'cost': {\n 'min': this.safeNumber (market, 'minOrderInQuoteAsset'),\n 'max': this.safeNumber (market, 'maxOrderInQuoteAsset'),\n },\n },\n 'created': undefined,\n 'info': market,\n }));\n }\n return result;\n }" }, %{ "comment" => nil, "examples" => [ "[\n 1590383700000,\n \"8088.5\",\n \"8088.5\",\n \"8088.5\",\n \"8088.5\",\n \"0.04788623\"\n ]" ], "line_end" => 1044, "line_start" => 1025, "mappings" => [], "name" => "parseOHLCV", "signature" => "parseOHLCV (ohlcv, market: Market = undefined): OHLCV", "source" => "parseOHLCV (ohlcv, market: Market = undefined): OHLCV {\n //\n // [\n // 1590383700000,\n // \"8088.5\",\n // \"8088.5\",\n // \"8088.5\",\n // \"8088.5\",\n // \"0.04788623\"\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 \"orderId\": \"2e7ce7fc-44e2-4d80-a4a7-d079c4750b61\"\n }", "{\n \"orderId\":\"af76d6ce-9f7c-4006-b715-bb5d430652d0\",\n \"market\":\"ETH-EUR\",\n \"created\":1590505649241,\n \"updated\":1590505649241,\n \"status\":\"filled\",\n \"side\":\"sell\",\n \"orderType\":\"market\",\n \"amount\":\"0.249825\",\n \"amountRemaining\":\"0\",\n \"price\": \"183.49\", // limit orders only\n \"onHold\":\"0\",\n \"onHoldCurrency\":\"ETH\",\n \"filledAmount\":\"0.249825\",\n \"filledAmountQuote\":\"45.84038925\",\n \"feePaid\":\"0.12038925\",\n \"feeCurrency\":\"EUR\",\n \"fills\":[\n {\n \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n \"timestamp\":1590505649245,\n \"amount\":\"0.249825\",\n \"price\":\"183.49\",\n \"taker\":true,\n \"fee\":\"0.12038925\",\n \"feeCurrency\":\"EUR\",\n \"settled\":true\n }\n ],\n \"selfTradePrevention\":\"decrementAndCancel\",\n \"visible\":false,\n \"disableMarketProtection\":false\n \"timeInForce\": \"GTC\",\n \"postOnly\": true,\n }" ], "line_end" => 1799, "line_start" => 1698, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "order" }, %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "clientOrderId", "value" => "undefined" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "lastTradeTimestamp", "value" => "undefined" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "type", "value" => "type" }, %{ "comment" => nil, "key" => "timeInForce", "value" => "timeInForce" }, %{ "comment" => nil, "key" => "postOnly", "value" => "postOnly" }, %{ "comment" => nil, "key" => "side", "value" => "side" }, %{ "comment" => nil, "key" => "price", "value" => "price" }, %{ "comment" => nil, "key" => "triggerPrice", "value" => "this.safeNumber (order, 'triggerPrice')" }, %{ "comment" => nil, "key" => "amount", "value" => "amount" }, %{ "comment" => nil, "key" => "cost", "value" => "cost" }, %{ "comment" => nil, "key" => "average", "value" => "undefined" }, %{ "comment" => nil, "key" => "filled", "value" => "filled" }, %{ "comment" => nil, "key" => "remaining", "value" => "remaining" }, %{ "comment" => nil, "key" => "status", "value" => "status" }, %{ "comment" => nil, "key" => "fee", "value" => "fee" }, %{ "comment" => nil, "key" => "trades", "value" => "rawTrades" }, %{ "comment" => nil, "key" => "cost", "value" => "feeCost" }, %{ "comment" => nil, "key" => "currency", "value" => "feeCurrencyCode" } ], "name" => "parseOrder", "signature" => "parseOrder (order: Dict, market: Market = undefined): Order", "source" => "parseOrder (order: Dict, market: Market = undefined): Order {\n //\n // cancelOrder, cancelAllOrders\n //\n // {\n // \"orderId\": \"2e7ce7fc-44e2-4d80-a4a7-d079c4750b61\"\n // }\n //\n // createOrder, fetchOrder, fetchOpenOrders, fetchOrders, editOrder\n //\n // {\n // \"orderId\":\"af76d6ce-9f7c-4006-b715-bb5d430652d0\",\n // \"market\":\"ETH-EUR\",\n // \"created\":1590505649241,\n // \"updated\":1590505649241,\n // \"status\":\"filled\",\n // \"side\":\"sell\",\n // \"orderType\":\"market\",\n // \"amount\":\"0.249825\",\n // \"amountRemaining\":\"0\",\n // \"price\": \"183.49\", // limit orders only\n // \"onHold\":\"0\",\n // \"onHoldCurrency\":\"ETH\",\n // \"filledAmount\":\"0.249825\",\n // \"filledAmountQuote\":\"45.84038925\",\n // \"feePaid\":\"0.12038925\",\n // \"feeCurrency\":\"EUR\",\n // \"fills\":[\n // {\n // \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n // \"timestamp\":1590505649245,\n // \"amount\":\"0.249825\",\n // \"price\":\"183.49\",\n // \"taker\":true,\n // \"fee\":\"0.12038925\",\n // \"feeCurrency\":\"EUR\",\n // \"settled\":true\n // }\n // ],\n // \"selfTradePrevention\":\"decrementAndCancel\",\n // \"visible\":false,\n // \"disableMarketProtection\":false\n // \"timeInForce\": \"GTC\",\n // \"postOnly\": true,\n // }\n //\n const id = this.safeString (order, 'orderId');\n const timestamp = this.safeInteger (order, 'created');\n const marketId = this.safeString (order, 'market');\n market = this.safeMarket (marketId, market, '-');\n const symbol = market['symbol'];\n const status = this.parseOrderStatus (this.safeString (order, 'status'));\n const side = this.safeString (order, 'side');\n const type = this.safeString (order, 'orderType');\n const price = this.safeString (order, 'price');\n const amount = this.safeString (order, 'amount');\n const remaining = this.safeString (order, 'amountRemaining');\n const filled = this.safeString (order, 'filledAmount');\n let cost = this.safeString (order, 'filledAmountQuote');\n if (cost === undefined) {\n const amountQuote = this.safeString (order, 'amountQuote');\n const amountQuoteRemaining = this.safeString (order, 'amountQuoteRemaining');\n cost = Precise.stringSub (amountQuote, amountQuoteRemaining);\n }\n let fee = undefined;\n const feeCost = this.safeNumber (order, 'feePaid');\n if (feeCost !== undefined) {\n const feeCurrencyId = this.safeString (order, 'feeCurrency');\n const feeCurrencyCode = this.safeCurrencyCode (feeCurrencyId);\n fee = {\n 'cost': feeCost,\n 'currency': feeCurrencyCode,\n };\n }\n const rawTrades = this.safeValue (order, 'fills', []);\n const timeInForce = this.safeString (order, 'timeInForce');\n const postOnly = this.safeValue (order, 'postOnly');\n // https://github.com/ccxt/ccxt/issues/8489\n return this.safeOrder ({\n 'info': order,\n 'id': id,\n 'clientOrderId': undefined,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'lastTradeTimestamp': undefined,\n 'symbol': symbol,\n 'type': type,\n 'timeInForce': timeInForce,\n 'postOnly': postOnly,\n 'side': side,\n 'price': price,\n 'triggerPrice': this.safeNumber (order, 'triggerPrice'),\n 'amount': amount,\n 'cost': cost,\n 'average': undefined,\n 'filled': filled,\n 'remaining': remaining,\n 'status': status,\n 'fee': fee,\n 'trades': rawTrades,\n }, market);\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 1696, "line_start" => 1679, "mappings" => [], "name" => "parseOrderStatus", "signature" => "parseOrderStatus (status: Str)", "source" => "parseOrderStatus (status: Str) {\n const statuses: Dict = {\n 'new': 'open',\n 'canceled': 'canceled',\n 'canceledAuction': 'canceled',\n 'canceledSelfTradePrevention': 'canceled',\n 'canceledIOC': 'canceled',\n 'canceledFOK': 'canceled',\n 'canceledMarketProtection': 'canceled',\n 'canceledPostOnly': 'canceled',\n 'filled': 'closed',\n 'partiallyFilled': 'open',\n 'expired': 'canceled',\n 'rejected': 'canceled',\n 'awaitingTrigger': 'open', // https://github.com/ccxt/ccxt/issues/8489\n };\n return this.safeString (statuses, status, status);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"market\":\"ETH-BTC\",\n \"open\":\"0.022578\",\n \"high\":\"0.023019\",\n \"low\":\"0.022573\",\n \"last\":\"0.023019\",\n \"volume\":\"25.16366324\",\n \"volumeQuote\":\"0.57333305\",\n \"bid\":\"0.023039\",\n \"bidSize\":\"0.53500578\",\n \"ask\":\"0.023041\",\n \"askSize\":\"0.47859202\",\n \"timestamp\":1590381666900\n }" ], "line_end" => 751, "line_start" => 703, "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" => "this.safeString (ticker, 'high')" }, %{ "comment" => nil, "key" => "low", "value" => "this.safeString (ticker, 'low')" }, %{ "comment" => nil, "key" => "bid", "value" => "this.safeString (ticker, 'bid')" }, %{ "comment" => nil, "key" => "bidVolume", "value" => "this.safeString (ticker, 'bidSize')" }, %{ "comment" => nil, "key" => "ask", "value" => "this.safeString (ticker, 'ask')" }, %{ "comment" => nil, "key" => "askVolume", "value" => "this.safeString (ticker, 'askSize')" }, %{ "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" => "percentage", "value" => "undefined" }, %{ "comment" => nil, "key" => "average", "value" => "undefined" }, %{ "comment" => nil, "key" => "baseVolume", "value" => "baseVolume" }, %{ "comment" => nil, "key" => "quoteVolume", "value" => "quoteVolume" }, %{ "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 // fetchTicker\n //\n // {\n // \"market\":\"ETH-BTC\",\n // \"open\":\"0.022578\",\n // \"high\":\"0.023019\",\n // \"low\":\"0.022573\",\n // \"last\":\"0.023019\",\n // \"volume\":\"25.16366324\",\n // \"volumeQuote\":\"0.57333305\",\n // \"bid\":\"0.023039\",\n // \"bidSize\":\"0.53500578\",\n // \"ask\":\"0.023041\",\n // \"askSize\":\"0.47859202\",\n // \"timestamp\":1590381666900\n // }\n //\n const marketId = this.safeString (ticker, 'market');\n const symbol = this.safeSymbol (marketId, market, '-');\n const timestamp = this.safeInteger (ticker, 'timestamp');\n const last = this.safeString (ticker, 'last');\n const baseVolume = this.safeString (ticker, 'volume');\n const quoteVolume = this.safeString (ticker, 'volumeQuote');\n const open = this.safeString (ticker, 'open');\n return this.safeTicker ({\n 'symbol': symbol,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'high': this.safeString (ticker, 'high'),\n 'low': this.safeString (ticker, 'low'),\n 'bid': this.safeString (ticker, 'bid'),\n 'bidVolume': this.safeString (ticker, 'bidSize'),\n 'ask': this.safeString (ticker, 'ask'),\n 'askVolume': this.safeString (ticker, 'askSize'),\n 'vwap': undefined,\n 'open': open,\n 'close': last,\n 'last': last,\n 'previousClose': undefined, // previous day close\n 'change': undefined,\n 'percentage': undefined,\n 'average': undefined,\n 'baseVolume': baseVolume,\n 'quoteVolume': quoteVolume,\n 'info': ticker,\n }, market);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"id\":\"94154c98-6e8b-4e33-92a8-74e33fc05650\",\n \"timestamp\":1590382761859,\n \"amount\":\"0.06026079\",\n \"price\":\"8095.3\",\n \"side\":\"buy\"\n }", "{\n \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n \"timestamp\":1590505649245,\n \"amount\":\"0.249825\",\n \"price\":\"183.49\",\n \"taker\":true,\n \"fee\":\"0.12038925\",\n \"feeCurrency\":\"EUR\",\n \"settled\":true\n }", "{\n \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n \"orderId\":\"af76d6ce-9f7c-4006-b715-bb5d430652d0\",\n \"timestamp\":1590505649245,\n \"market\":\"ETH-EUR\",\n \"side\":\"sell\",\n \"amount\":\"0.249825\",\n \"price\":\"183.49\",\n \"taker\":true,\n \"fee\":\"0.12038925\",\n \"feeCurrency\":\"EUR\",\n \"settled\":true\n }", "{\n \"event\": \"fill\",\n \"timestamp\": 1590964470132,\n \"market\": \"ETH-EUR\",\n \"orderId\": \"85d082e1-eda4-4209-9580-248281a29a9a\",\n \"fillId\": \"861d2da5-aa93-475c-8d9a-dce431bd4211\",\n \"side\": \"sell\",\n \"amount\": \"0.1\",\n \"price\": \"211.46\",\n \"taker\": true,\n \"fee\": \"0.056\",\n \"feeCurrency\": \"EUR\"\n }" ], "line_end" => 931, "line_start" => 836, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "trade" }, %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "symbol", "value" => "symbol" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "order", "value" => "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" => "undefined" }, %{ "comment" => nil, "key" => "fee", "value" => "fee" }, %{ "comment" => nil, "key" => "cost", "value" => "feeCostString" }, %{ "comment" => nil, "key" => "currency", "value" => "feeCurrencyCode" } ], "name" => "parseTrade", "signature" => "parseTrade (trade: Dict, market: Market = undefined): Trade", "source" => "parseTrade (trade: Dict, market: Market = undefined): Trade {\n //\n // fetchTrades (public)\n //\n // {\n // \"id\":\"94154c98-6e8b-4e33-92a8-74e33fc05650\",\n // \"timestamp\":1590382761859,\n // \"amount\":\"0.06026079\",\n // \"price\":\"8095.3\",\n // \"side\":\"buy\"\n // }\n //\n // createOrder, fetchOpenOrders, fetchOrders, editOrder (private)\n //\n // {\n // \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n // \"timestamp\":1590505649245,\n // \"amount\":\"0.249825\",\n // \"price\":\"183.49\",\n // \"taker\":true,\n // \"fee\":\"0.12038925\",\n // \"feeCurrency\":\"EUR\",\n // \"settled\":true\n // }\n //\n // fetchMyTrades (private)\n //\n // {\n // \"id\":\"b0c86aa5-6ed3-4a2d-ba3a-be9a964220f4\",\n // \"orderId\":\"af76d6ce-9f7c-4006-b715-bb5d430652d0\",\n // \"timestamp\":1590505649245,\n // \"market\":\"ETH-EUR\",\n // \"side\":\"sell\",\n // \"amount\":\"0.249825\",\n // \"price\":\"183.49\",\n // \"taker\":true,\n // \"fee\":\"0.12038925\",\n // \"feeCurrency\":\"EUR\",\n // \"settled\":true\n // }\n //\n // watchMyTrades (private)\n //\n // {\n // \"event\": \"fill\",\n // \"timestamp\": 1590964470132,\n // \"market\": \"ETH-EUR\",\n // \"orderId\": \"85d082e1-eda4-4209-9580-248281a29a9a\",\n // \"fillId\": \"861d2da5-aa93-475c-8d9a-dce431bd4211\",\n // \"side\": \"sell\",\n // \"amount\": \"0.1\",\n // \"price\": \"211.46\",\n // \"taker\": true,\n // \"fee\": \"0.056\",\n // \"feeCurrency\": \"EUR\"\n // }\n //\n const priceString = this.safeString (trade, 'price');\n const amountString = this.safeString (trade, 'amount');\n const timestamp = this.safeInteger (trade, 'timestamp');\n const side = this.safeString (trade, 'side');\n const id = this.safeString2 (trade, 'id', 'fillId');\n const marketId = this.safeString (trade, 'market');\n const symbol = this.safeSymbol (marketId, market, '-');\n const taker = this.safeValue (trade, 'taker');\n let takerOrMaker = undefined;\n if (taker !== undefined) {\n takerOrMaker = taker ? 'taker' : 'maker';\n }\n const feeCostString = this.safeString (trade, 'fee');\n let fee = undefined;\n if (feeCostString !== undefined) {\n const feeCurrencyId = this.safeString (trade, 'feeCurrency');\n const feeCurrencyCode = this.safeCurrencyCode (feeCurrencyId);\n fee = {\n 'cost': feeCostString,\n 'currency': feeCurrencyCode,\n };\n }\n const orderId = this.safeString (trade, 'orderId');\n return this.safeTrade ({\n 'info': trade,\n 'id': id,\n 'symbol': symbol,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'order': orderId,\n 'type': undefined,\n 'side': side,\n 'takerOrMaker': takerOrMaker,\n 'price': priceString,\n 'amount': amountString,\n 'cost': undefined,\n 'fee': fee,\n }, market);\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"fees\": {\n \"taker\": \"0.0025\",\n \"maker\": \"0.0015\",\n \"volume\": \"10000.00\"\n }\n }" ], "line_end" => 982, "line_start" => 956, "mappings" => [], "name" => "parseTradingFees", "signature" => "parseTradingFees (fees, market = undefined)", "source" => "parseTradingFees (fees, market = undefined) {\n //\n // {\n // \"fees\": {\n // \"taker\": \"0.0025\",\n // \"maker\": \"0.0015\",\n // \"volume\": \"10000.00\"\n // }\n // }\n //\n const feesValue = this.safeValue (fees, 'fees');\n const maker = this.safeNumber (feesValue, 'maker');\n const taker = this.safeNumber (feesValue, 'taker');\n const result: Dict = {};\n for (let i = 0; i < this.symbols.length; i++) {\n const symbol = this.symbols[i];\n result[symbol] = {\n 'info': fees,\n 'symbol': symbol,\n 'maker': maker,\n 'taker': taker,\n 'percentage': true,\n 'tierBased': true,\n };\n }\n return result;\n }" }, %{ "comment" => nil, "examples" => [ "{\n \"success\": true,\n \"symbol\": \"BTC\",\n \"amount\": \"1.5\"\n }", "{\n \"timestamp\": 1542967486256,\n \"symbol\": \"BTC\",\n \"amount\": \"0.99994\",\n \"address\": \"BitcoinAddress\",\n \"paymentId\": \"10002653\",\n \"txId\": \"927b3ea50c5bb52c6854152d305dfa1e27fc01d10464cf10825d96d69d235eb3\",\n \"fee\": \"0.00006\",\n \"status\": \"awaiting_processing\"\n }", "{\n \"timestamp\":1590492401000,\n \"symbol\":\"ETH\",\n \"amount\":\"0.249825\",\n \"fee\":\"0\",\n \"status\":\"completed\",\n \"txId\":\"0x5167b473fd37811f9ef22364c3d54726a859ef9d98934b3a1e11d7baa8d2c2e2\"\n }" ], "line_end" => 2116, "line_start" => 2037, "mappings" => [ %{ "comment" => nil, "key" => "info", "value" => "transaction" }, %{ "comment" => nil, "key" => "id", "value" => "id" }, %{ "comment" => nil, "key" => "txid", "value" => "txid" }, %{ "comment" => nil, "key" => "timestamp", "value" => "timestamp" }, %{ "comment" => nil, "key" => "datetime", "value" => "this.iso8601 (timestamp)" }, %{ "comment" => nil, "key" => "addressFrom", "value" => "undefined" }, %{ "comment" => nil, "key" => "address", "value" => "address" }, %{ "comment" => nil, "key" => "addressTo", "value" => "address" }, %{ "comment" => nil, "key" => "tagFrom", "value" => "undefined" }, %{ "comment" => nil, "key" => "tag", "value" => "tag" }, %{ "comment" => nil, "key" => "tagTo", "value" => "tag" }, %{ "comment" => nil, "key" => "type", "value" => "type" }, %{ "comment" => nil, "key" => "amount", "value" => "amount" }, %{ "comment" => nil, "key" => "currency", "value" => "code" }, %{ "comment" => nil, "key" => "status", "value" => "status" }, %{ "comment" => nil, "key" => "updated", "value" => "undefined" }, %{ "comment" => nil, "key" => "fee", "value" => "fee" }, %{ "comment" => nil, "key" => "network", "value" => "undefined" }, %{ "comment" => nil, "key" => "comment", "value" => "undefined" }, %{ "comment" => nil, "key" => "internal", "value" => "undefined" } ], "name" => "parseTransaction", "signature" => "parseTransaction (transaction: Dict, currency: Currency = undefined): Transaction", "source" => "parseTransaction (transaction: Dict, currency: Currency = undefined): Transaction {\n //\n // withdraw\n //\n // {\n // \"success\": true,\n // \"symbol\": \"BTC\",\n // \"amount\": \"1.5\"\n // }\n //\n // fetchWithdrawals\n //\n // {\n // \"timestamp\": 1542967486256,\n // \"symbol\": \"BTC\",\n // \"amount\": \"0.99994\",\n // \"address\": \"BitcoinAddress\",\n // \"paymentId\": \"10002653\",\n // \"txId\": \"927b3ea50c5bb52c6854152d305dfa1e27fc01d10464cf10825d96d69d235eb3\",\n // \"fee\": \"0.00006\",\n // \"status\": \"awaiting_processing\"\n // }\n //\n // fetchDeposits\n //\n // {\n // \"timestamp\":1590492401000,\n // \"symbol\":\"ETH\",\n // \"amount\":\"0.249825\",\n // \"fee\":\"0\",\n // \"status\":\"completed\",\n // \"txId\":\"0x5167b473fd37811f9ef22364c3d54726a859ef9d98934b3a1e11d7baa8d2c2e2\"\n // }\n //\n const id = undefined;\n const timestamp = this.safeInteger (transaction, 'timestamp');\n const currencyId = this.safeString (transaction, 'symbol');\n const code = this.safeCurrencyCode (currencyId, currency);\n const status = this.parseTransactionStatus (this.safeString (transaction, 'status'));\n const amount = this.safeNumber (transaction, 'amount');\n const address = this.safeString (transaction, 'address');\n const txid = this.safeString (transaction, 'txId');\n let fee = undefined;\n const feeCost = this.safeNumber (transaction, 'fee');\n if (feeCost !== undefined) {\n fee = {\n 'cost': feeCost,\n 'currency': code,\n };\n }\n let type = undefined;\n if (('success' in transaction) || ('address' in transaction)) {\n type = 'withdrawal';\n } else {\n type = 'deposit';\n }\n const tag = this.safeString (transaction, 'paymentId');\n return {\n 'info': transaction,\n 'id': id,\n 'txid': txid,\n 'timestamp': timestamp,\n 'datetime': this.iso8601 (timestamp),\n 'addressFrom': undefined,\n 'address': address,\n 'addressTo': address,\n 'tagFrom': undefined,\n 'tag': tag,\n 'tagTo': tag,\n 'type': type,\n 'amount': amount,\n 'currency': code,\n 'status': status,\n 'updated': undefined,\n 'fee': fee,\n 'network': undefined,\n 'comment': undefined,\n 'internal': undefined,\n } as Transaction;\n }" }, %{ "comment" => nil, "examples" => [], "line_end" => 2035, "line_start" => 2022, "mappings" => [], "name" => "parseTransactionStatus", "signature" => "parseTransactionStatus (status: Str)", "source" => "parseTransactionStatus (status: Str) {\n const statuses: Dict = {\n 'awaiting_processing': 'pending',\n 'awaiting_email_confirmation': 'pending',\n 'awaiting_bitvavo_inspection': 'pending',\n 'approved': 'pending',\n 'sending': 'pending',\n 'in_mempool': 'pending',\n 'processed': 'pending',\n 'completed': 'ok',\n 'canceled': 'canceled',\n };\n return this.safeString (statuses, status, status);\n }" } ], path_prefix: "/v2/", pro: true, quote_json_numbers: nil, rate_limits: %{ interval_ms: 60, period: 1000, requests: 16, rolling_window_size: 60000 }, raw_endpoints: %{ private: [ %{ auth: false, cost: 1, method: :get, path: "/account" }, %{ auth: false, cost: 5, method: :get, path: "/balance" }, %{ auth: false, cost: 1, method: :get, path: "/deposit" }, %{ auth: false, cost: 5, method: :get, path: "/depositHistory" }, %{ auth: false, cost: 5, method: :get, path: "/institutional/subaccounts/balance" }, %{ auth: false, cost: 5, method: :get, path: "/institutional/subaccounts/history" }, %{ auth: false, cost: 1, method: :get, path: "/institutional/subaccounts/orders/open" }, %{ auth: false, cost: 1, method: :get, path: "/order" }, %{ auth: false, cost: 5, method: :get, path: "/orders" }, %{ auth: false, cost: 1, method: :get, path: "/ordersOpen" }, %{ auth: false, cost: 5, method: :get, path: "/subaccounts" }, %{ auth: false, cost: 5, method: :get, path: "/subaccounts/transfers" }, %{ auth: false, cost: 5, method: :get, path: "/subaccounts/transfers/{transferId}" }, %{ auth: false, cost: 5, method: :get, path: "/trades" }, %{ auth: false, cost: 5, method: :get, path: "/withdrawalHistory" }, %{ auth: false, cost: 1, method: :post, path: "/order" }, %{ auth: false, cost: 5, method: :post, path: "/subaccounts" }, %{ auth: false, cost: 5, method: :post, path: "/subaccounts/transfers" }, %{ auth: false, cost: 1, method: :post, path: "/withdrawal" }, %{ auth: false, cost: 1, method: :put, path: "/order" }, %{ auth: false, cost: 1, method: :delete, path: "/institutional/subaccounts/order" }, %{ auth: false, cost: 1, method: :delete, path: "/institutional/subaccounts/orders" }, %{ auth: false, cost: 1, method: :delete, path: "/order" }, %{ auth: false, cost: 1, method: :delete, path: "/orders" } ], public: [ %{ auth: false, cost: 1, method: :get, path: "/assets" }, %{ auth: false, cost: 1, method: :get, path: "/markets" }, %{ auth: false, cost: 1, method: :get, path: "/ticker/24h" }, %{ auth: false, cost: 1, method: :get, path: "/ticker/book" }, %{ auth: false, cost: 1, method: :get, path: "/ticker/price" }, %{ auth: false, cost: 1, method: :get, path: "/time" }, %{ auth: false, cost: 1, method: :get, path: "/{market}/book" }, %{ auth: false, cost: 1, method: :get, path: "/{market}/candles" }, %{ auth: false, cost: 5, method: :get, path: "/{market}/trades" } ] }, required_credentials: %{ api_key: true, password: false, secret: true, uid: false }, requires_eddsa: false, response_error: nil, signing: %{ api_key_header: "ACCESS-KEY", confidence: :medium, passphrase_header: "ACCESS-PASSPHRASE", pattern: :hmac_sha256_passphrase_signed, signature_header: "ACCESS-SIGN", timestamp_header: "ACCESS-TIMESTAMP" }, spec_format_version: 2, status: %{ "eta" => nil, "status" => "ok", "updated" => nil, "url" => nil }, symbol_format: nil, symbol_formats: %{ precision_mode: 4, sample_limits: %{ "amount" => %{ "max" => 299591900.15284, "min" => 149.79595 }, "cost" => %{ "max" => 10000000, "min" => 5 }, "price" => %{} }, sample_precision: %{ "amount" => 1.0e-5, "price" => 1.0e-6 }, spot: %{ base: "FUN", base_id: "FUN", case: :upper, contract: false, id: "FUN-EUR", limits: %{ "amount" => %{ "max" => 299591900.15284, "min" => 149.79595 }, "cost" => %{ "max" => 10000000, "min" => 5 }, "leverage" => %{}, "price" => %{} }, maker: 0.002, precision: %{ "amount" => 1.0e-5, "cost" => 0.01, "price" => 1.0e-6 }, quote: "EUR", quote_id: "EUR", separator: "-", symbol: "FUN/EUR", taker: 0.0025 } }, symbol_patterns: %{ spot: %{ case: :upper, component_order: nil, date_format: nil, pattern: :dash_upper, prefix: nil, separator: "-", suffix: nil } }, timeframes: %{ "12h" => "12h", "15m" => "15m", "1d" => "1d", "1h" => "1h", "1m" => "1m", "2h" => "2h", "30m" => "30m", "4h" => "4h", "5m" => "5m", "6h" => "6h", "8h" => "8h" }, url_strategy: %{ detected_from: "sign_method", pattern: :version_slash, prefix: "/v2/" }, urls: %{ api: "https://api.bitvavo.com", api_sections: %{ "private" => "https://api.bitvavo.com", "public" => "https://api.bitvavo.com" }, doc: "https://docs.bitvavo.com/", other: nil, sandbox: nil, www: "https://bitvavo.com/" }, version: "v2", ws: %{ auth: %{ algorithm: :sha256, encoding: :hex, market_specific: false, message_format: :op_args, op_field: "action", op_value: "auth", pattern: :generic_hmac, payload_format: "custom", requires_passphrase: false, timestamp_unit: :milliseconds }, channel_templates: %{ watch_bids_asks: %{ channel_name: "ticker24h", market_id_format: :native, params: [], pattern: :action_subscribe }, watch_my_trades: %{ auth_required: true, channel_name: "account", market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe }, watch_ohlcv: %{ channel_name: "candles", market_id_format: :native, params: [ %{ "default" => nil, "name" => "interval" }, %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe }, watch_order_book: %{ channel_name: "book", market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe }, watch_order_book_snapshot: %{ channel_name: "getBook", market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe }, watch_orders: %{ auth_required: true, channel_name: "account", market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe }, watch_public: %{ market_id_format: :native, params: [], pattern: :action_subscribe }, watch_public_multiple: %{ market_id_format: :native, params: [], pattern: :action_subscribe }, watch_ticker: %{ channel_name: "ticker24h", market_id_format: :native, params: [], pattern: :action_subscribe }, watch_tickers: %{ channel_name: "ticker24h", market_id_format: :native, params: [], pattern: :action_subscribe }, watch_trades: %{ channel_name: "trades", market_id_format: :native, params: [ %{ "default" => nil, "name" => "limit" } ], pattern: :action_subscribe } }, has: %{ watch_balance: nil, watch_bids_asks: true, watch_liquidations: nil, watch_liquidations_for_symbols: nil, watch_my_liquidations: nil, watch_my_liquidations_for_symbols: nil, watch_my_trades: true, watch_ohlcv: true, watch_ohlcv_for_symbols: nil, watch_order_book: true, watch_order_book_for_symbols: nil, watch_orders: true, watch_orders_for_symbols: nil, watch_position: nil, watch_positions: nil, watch_status: nil, watch_ticker: true, watch_tickers: true, watch_trades: true, watch_trades_for_symbols: nil }, message_patterns: [ %{ format: :action, keys: [ "action", "key", "signature", "timestamp" ], kind_field: "action", kind_value: "authenticate", sources: [ :send, :watch ] }, %{ args_field: "channels", format: :action, keys: [ "action", "channels" ], kind_field: "action", kind_value: "subscribe", sources: [ :send, :watch, :watch_multiple ] } ], options: %{ "supressMultipleWsRequestsError" => false }, subscription_config: %{ args_field: "params", args_format: :params_object, market_id_format: :native, op_field: "action" }, subscription_pattern: :action_subscribe, urls: "wss://ws.bitvavo.com/v2", watch_methods: [ "watchBidsAsks", "watchMyTrades", "watchOHLCV", "watchOrderBook", "watchOrderBookSnapshot", "watchOrders", "watchPublic", "watchPublicMultiple", "watchRequest", "watchTicker", "watchTickers", "watchTrades" ] } }