UNPKG

bfx-api-node-rest

Version:
1,191 lines (1,058 loc) 97.5 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>rest2.js - Documentation</title> <script src="scripts/prettify/prettify.js"></script> <script src="scripts/prettify/lang-css.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc.css"> <script src="scripts/nav.js" defer></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <input type="checkbox" id="nav-trigger" class="nav-trigger" /> <label for="nav-trigger" class="navicon-button x"> <div class="navicon"></div> </label> <label for="nav-trigger" class="overlay"></label> <nav > <input type="text" id="nav-search" placeholder="Search" /> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="RESTv1.html">RESTv1</a><ul class='methods'><li data-type='method'><a href="RESTv1.html#account_infos">account_infos</a></li><li data-type='method'><a href="RESTv1.html#active_credits">active_credits</a></li><li data-type='method'><a href="RESTv1.html#active_offers">active_offers</a></li><li data-type='method'><a href="RESTv1.html#active_orders">active_orders</a></li><li data-type='method'><a href="RESTv1.html#active_positions">active_positions</a></li><li data-type='method'><a href="RESTv1.html#balance_history">balance_history</a></li><li data-type='method'><a href="RESTv1.html#cancel_all_orders">cancel_all_orders</a></li><li data-type='method'><a href="RESTv1.html#cancel_multiple_orders">cancel_multiple_orders</a></li><li data-type='method'><a href="RESTv1.html#cancel_offer">cancel_offer</a></li><li data-type='method'><a href="RESTv1.html#cancel_order">cancel_order</a></li><li data-type='method'><a href="RESTv1.html#claim_position">claim_position</a></li><li data-type='method'><a href="RESTv1.html#close_swap">close_swap</a></li><li data-type='method'><a href="RESTv1.html#fundingbook">fundingbook</a></li><li data-type='method'><a href="RESTv1.html#get_symbols">get_symbols</a></li><li data-type='method'><a href="RESTv1.html#lends">lends</a></li><li data-type='method'><a href="RESTv1.html#margin_infos">margin_infos</a></li><li data-type='method'><a href="RESTv1.html#movements">movements</a></li><li data-type='method'><a href="RESTv1.html#multiple_new_orders">multiple_new_orders</a></li><li data-type='method'><a href="RESTv1.html#new_deposit">new_deposit</a></li><li data-type='method'><a href="RESTv1.html#new_offer">new_offer</a></li><li data-type='method'><a href="RESTv1.html#new_order">new_order</a></li><li data-type='method'><a href="RESTv1.html#offer_status">offer_status</a></li><li data-type='method'><a href="RESTv1.html#order_status">order_status</a></li><li data-type='method'><a href="RESTv1.html#orderbook">orderbook</a></li><li data-type='method'><a href="RESTv1.html#orders_history">orders_history</a></li><li data-type='method'><a href="RESTv1.html#past_trades">past_trades</a></li><li data-type='method'><a href="RESTv1.html#replace_order">replace_order</a></li><li data-type='method'><a href="RESTv1.html#stats">stats</a></li><li data-type='method'><a href="RESTv1.html#symbols_details">symbols_details</a></li><li data-type='method'><a href="RESTv1.html#taken_swaps">taken_swaps</a></li><li data-type='method'><a href="RESTv1.html#ticker">ticker</a></li><li data-type='method'><a href="RESTv1.html#today">today</a></li><li data-type='method'><a href="RESTv1.html#total_taken_swaps">total_taken_swaps</a></li><li data-type='method'><a href="RESTv1.html#trades">trades</a></li><li data-type='method'><a href="RESTv1.html#transfer">transfer</a></li><li data-type='method'><a href="RESTv1.html#wallet_balances">wallet_balances</a></li><li data-type='method'><a href="RESTv1.html#withdraw">withdraw</a></li></ul></li><li><a href="RESTv2.html">RESTv2</a><ul class='methods'><li data-type='method'><a href="RESTv2.html#accountFees">accountFees</a></li><li data-type='method'><a href="RESTv2.html#accountSummary">accountSummary</a></li><li data-type='method'><a href="RESTv2.html#accountTrades">accountTrades</a></li><li data-type='method'><a href="RESTv2.html#activeOrders">activeOrders</a></li><li data-type='method'><a href="RESTv2.html#activeOrdersWithIds">activeOrdersWithIds</a></li><li data-type='method'><a href="RESTv2.html#alertDelete">alertDelete</a></li><li data-type='method'><a href="RESTv2.html#alertList">alertList</a></li><li data-type='method'><a href="RESTv2.html#alertSet">alertSet</a></li><li data-type='method'><a href="RESTv2.html#calcAvailableBalance">calcAvailableBalance</a></li><li data-type='method'><a href="RESTv2.html#cancelAllFundingOffers">cancelAllFundingOffers</a></li><li data-type='method'><a href="RESTv2.html#cancelFundingOffer">cancelFundingOffer</a></li><li data-type='method'><a href="RESTv2.html#cancelOrder">cancelOrder</a></li><li data-type='method'><a href="RESTv2.html#cancelOrderMulti">cancelOrderMulti</a></li><li data-type='method'><a href="RESTv2.html#cancelOrderWithCid">cancelOrderWithCid</a></li><li data-type='method'><a href="RESTv2.html#cancelOrders">cancelOrders</a></li><li data-type='method'><a href="RESTv2.html#cancelRecurringAlgoOrder">cancelRecurringAlgoOrder</a></li><li data-type='method'><a href="RESTv2.html#candles">candles</a></li><li data-type='method'><a href="RESTv2.html#changeLogs">changeLogs</a></li><li data-type='method'><a href="RESTv2.html#claimPosition">claimPosition</a></li><li data-type='method'><a href="RESTv2.html#closeFunding">closeFunding</a></li><li data-type='method'><a href="RESTv2.html#closePosition">closePosition</a></li><li data-type='method'><a href="RESTv2.html#conf">conf</a></li><li data-type='method'><a href="RESTv2.html#currencies">currencies</a></li><li data-type='method'><a href="RESTv2.html#deleteSettings">deleteSettings</a></li><li data-type='method'><a href="RESTv2.html#derivsPositionCollateralSet">derivsPositionCollateralSet</a></li><li data-type='method'><a href="RESTv2.html#exchangeRate">exchangeRate</a></li><li data-type='method'><a href="RESTv2.html#fundingCreditHistory">fundingCreditHistory</a></li><li data-type='method'><a href="RESTv2.html#fundingCredits">fundingCredits</a></li><li data-type='method'><a href="RESTv2.html#fundingInfo">fundingInfo</a></li><li data-type='method'><a href="RESTv2.html#fundingLoanHistory">fundingLoanHistory</a></li><li data-type='method'><a href="RESTv2.html#fundingLoans">fundingLoans</a></li><li data-type='method'><a href="RESTv2.html#fundingOfferHistory">fundingOfferHistory</a></li><li data-type='method'><a href="RESTv2.html#fundingOffers">fundingOffers</a></li><li data-type='method'><a href="RESTv2.html#fundingTrades">fundingTrades</a></li><li data-type='method'><a href="RESTv2.html#futures">futures</a></li><li data-type='method'><a href="RESTv2.html#generateInvoice">generateInvoice</a></li><li data-type='method'><a href="RESTv2.html#generateToken">generateToken</a></li><li data-type='method'><a href="RESTv2.html#getCoreSettings">getCoreSettings</a></li><li data-type='method'><a href="RESTv2.html#getDepositAddress">getDepositAddress</a></li><li data-type='method'><a href="RESTv2.html#getRecurringAlgoOrder">getRecurringAlgoOrder</a></li><li data-type='method'><a href="RESTv2.html#getRecurringAlgoOrders">getRecurringAlgoOrders</a></li><li data-type='method'><a href="RESTv2.html#getRecurringAoOrders">getRecurringAoOrders</a></li><li data-type='method'><a href="RESTv2.html#getSettings">getSettings</a></li><li data-type='method'><a href="RESTv2.html#getURL">getURL</a></li><li data-type='method'><a href="RESTv2.html#getWeightedAverages">getWeightedAverages</a></li><li data-type='method'><a href="RESTv2.html#inactiveSymbols">inactiveSymbols</a></li><li data-type='method'><a href="RESTv2.html#invalidateAuthToken">invalidateAuthToken</a></li><li data-type='method'><a href="RESTv2.html#keepFunding">keepFunding</a></li><li data-type='method'><a href="RESTv2.html#keyPermissions">keyPermissions</a></li><li data-type='method'><a href="RESTv2.html#ledgers">ledgers</a></li><li data-type='method'><a href="RESTv2.html#liquidations">liquidations</a></li><li data-type='method'><a href="RESTv2.html#lnxInvoicePayments">lnxInvoicePayments</a></li><li data-type='method'><a href="RESTv2.html#logins">logins</a></li><li data-type='method'><a href="RESTv2.html#marginInfo">marginInfo</a></li><li data-type='method'><a href="RESTv2.html#marketAveragePrice">marketAveragePrice</a></li><li data-type='method'><a href="RESTv2.html#movementInfo">movementInfo</a></li><li data-type='method'><a href="RESTv2.html#movements">movements</a></li><li data-type='method'><a href="RESTv2.html#orderBook">orderBook</a></li><li data-type='method'><a href="RESTv2.html#orderHistory">orderHistory</a></li><li data-type='method'><a href="RESTv2.html#orderHistoryWithIds">orderHistoryWithIds</a></li><li data-type='method'><a href="RESTv2.html#orderMultiOp">orderMultiOp</a></li><li data-type='method'><a href="RESTv2.html#orderTrades">orderTrades</a></li><li data-type='method'><a href="RESTv2.html#payAddCurrencyConversion">payAddCurrencyConversion</a></li><li data-type='method'><a href="RESTv2.html#payCurrencyConversionList">payCurrencyConversionList</a></li><li data-type='method'><a href="RESTv2.html#payCurrencyList">payCurrencyList</a></li><li data-type='method'><a href="RESTv2.html#payDeposits">payDeposits</a></li><li data-type='method'><a href="RESTv2.html#payDepositsUnlinked">payDepositsUnlinked</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceComplete">payInvoiceComplete</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceCreate">payInvoiceCreate</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceCreatePos">payInvoiceCreatePos</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceCurrencyDetailed">payInvoiceCurrencyDetailed</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceEvents">payInvoiceEvents</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceExpire">payInvoiceExpire</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceList">payInvoiceList</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceListPaginated">payInvoiceListPaginated</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceMarkRefunded">payInvoiceMarkRefunded</a></li><li data-type='method'><a href="RESTv2.html#payInvoiceUpdate">payInvoiceUpdate</a></li><li data-type='method'><a href="RESTv2.html#payMerchantDailyLimit">payMerchantDailyLimit</a></li><li data-type='method'><a href="RESTv2.html#payMerchantSettingsList">payMerchantSettingsList</a></li><li data-type='method'><a href="RESTv2.html#payMerchantSettingsRead">payMerchantSettingsRead</a></li><li data-type='method'><a href="RESTv2.html#payMerchantSettingsWrite">payMerchantSettingsWrite</a></li><li data-type='method'><a href="RESTv2.html#payMerchantSettingsWriteBatch">payMerchantSettingsWriteBatch</a></li><li data-type='method'><a href="RESTv2.html#payPublicInvoiceCurrencyDetailed">payPublicInvoiceCurrencyDetailed</a></li><li data-type='method'><a href="RESTv2.html#payRefundInvoice">payRefundInvoice</a></li><li data-type='method'><a href="RESTv2.html#payRemoveCurrencyConversion">payRemoveCurrencyConversion</a></li><li data-type='method'><a href="RESTv2.html#performance">performance</a></li><li data-type='method'><a href="RESTv2.html#positions">positions</a></li><li data-type='method'><a href="RESTv2.html#positionsAudit">positionsAudit</a></li><li data-type='method'><a href="RESTv2.html#positionsHistory">positionsHistory</a></li><li data-type='method'><a href="RESTv2.html#positionsSnapshot">positionsSnapshot</a></li><li data-type='method'><a href="RESTv2.html#stats">stats</a></li><li data-type='method'><a href="RESTv2.html#status">status</a></li><li data-type='method'><a href="RESTv2.html#statusMessages">statusMessages</a></li><li data-type='method'><a href="RESTv2.html#submitAutoFunding">submitAutoFunding</a></li><li data-type='method'><a href="RESTv2.html#submitFundingOffer">submitFundingOffer</a></li><li data-type='method'><a href="RESTv2.html#submitOrder">submitOrder</a></li><li data-type='method'><a href="RESTv2.html#submitOrderMulti">submitOrderMulti</a></li><li data-type='method'><a href="RESTv2.html#submitRecurringAlgoOrder">submitRecurringAlgoOrder</a></li><li data-type='method'><a href="RESTv2.html#symbolDetails">symbolDetails</a></li><li data-type='method'><a href="RESTv2.html#symbols">symbols</a></li><li data-type='method'><a href="RESTv2.html#ticker">ticker</a></li><li data-type='method'><a href="RESTv2.html#tickers">tickers</a></li><li data-type='method'><a href="RESTv2.html#tickersHistory">tickersHistory</a></li><li data-type='method'><a href="RESTv2.html#trades">trades</a></li><li data-type='method'><a href="RESTv2.html#transfer">transfer</a></li><li data-type='method'><a href="RESTv2.html#updateOrder">updateOrder</a></li><li data-type='method'><a href="RESTv2.html#updateOrderMulti">updateOrderMulti</a></li><li data-type='method'><a href="RESTv2.html#updateRecurringAlgoOrder">updateRecurringAlgoOrder</a></li><li data-type='method'><a href="RESTv2.html#updateSettings">updateSettings</a></li><li data-type='method'><a href="RESTv2.html#userInfo">userInfo</a></li><li data-type='method'><a href="RESTv2.html#usesAgent">usesAgent</a></li><li data-type='method'><a href="RESTv2.html#wallets">wallets</a></li><li data-type='method'><a href="RESTv2.html#walletsHistory">walletsHistory</a></li><li data-type='method'><a href="RESTv2.html#withdraw">withdraw</a></li></ul></li></ul><h3><a href="global.html">Global</a></h3> </nav> <div id="main"> <h1 class="page-title">rest2.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>'use strict' const debug = require('debug')('bfx:rest2') const fetch = require('node-fetch') const _isEmpty = require('lodash/isEmpty') const _isString = require('lodash/isString') const _isFunction = require('lodash/isFunction') const _pick = require('lodash/pick') const _omitBy = require('lodash/omitBy') const _isNil = require('lodash/isNil') const _isInteger = require('lodash/isInteger') const _flatten = require('lodash/flatten') const { URLSearchParams } = require('url') const { genAuthSig, nonce, isClass } = require('bfx-api-node-util') const { FundingCredit, FundingLoan, FundingOffer, FundingTrade, MarginInfo, Order, Position, Trade, PublicTrade, TradingTicker, TradingTickerHist, FundingTicker, FundingTickerHist, Wallet, WalletHist, Alert, Candle, Movement, MovementInfo, LedgerEntry, Liquidations, UserInfo, Currency, StatusMessagesDeriv, Notification, Login, ChangeLog, Invoice, SymbolDetails, TransactionFee, AccountSummary, AuthPermission, CoreSettings, WeightedAverages } = require('bfx-api-node-models') const BASE_TIMEOUT = 15000 const API_URL = 'https://api.bitfinex.com' /** * Parses response into notification object * * @param {object} data - notification * @returns {Notification} n * @private */ function _takeResNotify (data) { const notification = new Notification(data) return notification } /** * Communicates with v2 of the Bitfinex HTTP API */ class RESTv2 { /** * Instantiate a new REST v2 transport. * * @param {object} opts - options * @param {string} [opts.affCode] - affiliate code to be applied to all orders * @param {string} [opts.apiKey] - API key * @param {string} [opts.apiSecret] - API secret * @param {string} [opts.authToken] - optional auth option * @param {string} [opts.url] - endpoint URL * @param {boolean} [opts.transform] - default false * @param {object} [opts.agent] - optional node agent for connection (proxy) * @param {number} [opts.timeout] - default 15000 */ constructor (opts = { affCode: null, apiKey: '', apiSecret: '', authToken: '', company: '', url: API_URL, transform: false, agent: null, timeout: BASE_TIMEOUT }) { this._checkOpts(opts) this._url = opts.url || API_URL this._apiKey = opts.apiKey || '' this._apiSecret = opts.apiSecret || '' this._authToken = opts.authToken || '' this._company = opts.company || '' this._transform = !!opts.transform this._agent = opts.agent this._affCode = opts.affCode this._timeout = _isInteger(opts.timeout) ? opts.timeout : BASE_TIMEOUT } /** * Check constructor options * * @param {object} opts - constructor options * @throws {Error} - throws an Error if check is not passed * @returns {undefined} * @private */ _checkOpts (opts) { if ( !_isNil(opts.timeout) &amp;&amp; !_isInteger(opts.timeout) ) { throw new Error('ERR_TIMEOUT_DATA_TYPE_ERROR') } } /** * @returns {boolean} url */ getURL () { return this._url } /** * @returns {boolean} usesAgent */ usesAgent () { return !!this._agent } async _request (url, reqOpts, transformer, cb) { try { const resp = await fetch(url, reqOpts) const raw = await resp.text() if (!resp.ok) { const err = this._apiError(resp, raw) throw err } const json = JSON.parse(raw) return this._response(json, transformer, cb) } catch (err) { return this._cb(err, null, cb) } } _apiError (resp, rawBody) { const err = new Error(`HTTP code ${resp.status} ${resp.statusText || ''}`) err.status = resp.status err.statustext = resp.statusText try { const [, code, response] = JSON.parse(rawBody) err.code = code err.response = response } catch (_err) { err.response = rawBody } return err } /** * @param {string} path - path * @param {object} payload - payload * @param {Function} [cb] - legacy callback * @param {object|Function} transformer - model class or function * @returns {Promise} p * @private */ async _makeAuthRequest (path, payload = {}, cb, transformer) { if ((!this._apiKey || !this._apiSecret) &amp;&amp; !this._authToken) { const e = new Error('missing api key or secret') return this._cb(e, null, cb) } const url = `${this._url}/v2${path}` const n = nonce() const sanitizedPayload = _omitBy(payload, _isNil) const keys = () => { const sigPayload = `/api/v2${path}${n}${JSON.stringify(sanitizedPayload)}` const { sig } = genAuthSig(this._apiSecret, sigPayload) return { 'bfx-apikey': this._apiKey, 'bfx-signature': sig } } const auth = (this._authToken) ? { 'bfx-token': this._authToken } : keys() debug('POST %s', url) const reqOpts = { method: 'POST', timeout: this._timeout, headers: { 'content-type': 'application/json', 'bfx-nonce': n, ...auth }, agent: this._agent, body: JSON.stringify(sanitizedPayload) } return this._request(url, reqOpts, transformer, cb) } /** * @param {string} path - path * @param {Function} [cb] - legacy callback * @param {object|Function} transformer - model class or function * @returns {Promise} p * @private */ async _makePublicRequest (path, cb, transformer) { if ((cb !== null &amp;&amp; cb !== undefined) &amp;&amp; typeof cb !== 'function') { throw new Error('_makePublicRequest cb param must be a function') } const url = `${this._url}/v2${path}` debug('GET %s', url) const reqOpts = { method: 'GET', timeout: this._timeout, agent: this._agent } return this._request(url, reqOpts, transformer, cb) } /** * @param {string} path - path * @param {object} body - payload * @param {Function} [cb] - legacy callback * @param {object|Function} transformer - model class or function * @returns {Promise} p * @private */ async _makePublicPostRequest (path, payload, cb, transformer) { const url = `${this._url}/v2${path}` debug('POST %s', url) const sanitizedPayload = _omitBy(payload, _isNil) const reqOpts = { method: 'POST', timeout: this._timeout, headers: { 'content-type': 'application/json' }, agent: this._agent, body: JSON.stringify(sanitizedPayload) } return this._request(url, reqOpts, transformer, cb) } /** * @param {object} data * @param {object|Function} transformer - model class or function * @returns {object|object[]} finalData * @private */ _doTransform (data, transformer) { if (isClass(transformer)) { return this._classTransform(data, transformer) } else if (_isFunction(transformer)) { return transformer(data) } else { return data } } /** * @param {object} data - data * @param {object} ModelClass - class * @returns {object|object[]} finalData * @private */ _classTransform (data, ModelClass) { if (!data || data.length === 0) return [] if (!ModelClass || !this._transform) return data if (Array.isArray(data[0])) { return data.map(row => new ModelClass(row, this)) } return new ModelClass(data, this) } /** * @param {object} data - data * @param {object|Function} transformer - model class or function * @param {Function} [cb] - legacy callback * @returns {Promise&lt;object|object[]>} finalData * @private */ _response (data, transformer, cb) { try { const res = (this._transform) ? this._doTransform(data, transformer) : data return this._cb(null, res, cb) } catch (e) { return this._cb(e, null, cb) } } /** * @param {Error} err - error * @param {object} res -resposne * @param {Function} [cb] - legacy callback * @returns {Promise} p * @private */ _cb (err, res, cb) { const _isCbFunc = _isFunction(cb) if (err) { if (err.error &amp;&amp; err.error[1] === 10114) { err.message += ' see https://github.com/bitfinexcom/bitfinex-api-node/blob/master/README.md#nonce-too-small for help' } return _isCbFunc ? cb(err) : Promise.reject(err) } return _isCbFunc ? cb(null, res) : Promise.resolve(res) } /** * @param {Array[]} data order matters * @returns {Array[]} merged arr of currencies and names sorted with no pairs repeated adding pool and explorer to each * @private */ _genCurrencyList (data) { if (!Array.isArray(data) || data.length !== 6) { return data } const transformArrToObj = (arr) => { const obj = {} arr.forEach((c) => { if (!Array.isArray(c)) { obj[c] = c } else if (c.length > 1) { obj[c[0]] = c[1] } }) return obj } const listedCurr = transformArrToObj(data[0]) const mapedCurrSym = transformArrToObj(data[1]) const mapedCurrLabel = transformArrToObj(data[2]) const pool = transformArrToObj(data[3]) const explorer = transformArrToObj(data[4]) const walletFx = transformArrToObj(data[5]) const allCurrObj = { ...listedCurr, ...mapedCurrSym, ...mapedCurrLabel } // Assigne explores of pool to currencies Object.keys(pool).forEach((key) => { if (!explorer[key]) { if (explorer[pool[key]]) { explorer[key] = explorer[pool[key]] } } }) const allCurArr = [] Object.keys(allCurrObj).forEach((key) => { const cPool = pool[key] || null const cExpl = explorer[key] || [] const cName = allCurrObj[key] const cSymbol = mapedCurrSym[key] || key const cWfx = walletFx[key] || [] allCurArr.push([key, cName, cPool, cExpl, cSymbol, cWfx]) }) return allCurArr } /** * @param {object} params - parameters * @param {string} params.symbol - i.e. tBTCUSD * @param {string} params.prec - i.e. P0 * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-books */ orderBook (params, cb = null) { const { symbol, prec } = params return this._makePublicRequest(`/book/${symbol}/${prec}`, cb) } /** * @param {object} params - parameters * @param {string} params.symbol - Symbol you want information about i.e tBTCUSD, fUSD * @param {string} params.amount - Amount. Positive for buy, negative for sell (ex. "1.123") * @param {string} [params.period] - (optional) Maximum period for Margin Funding * @param {string} [params.rate_limit] - Limit rate/price (ex. "1000.5") * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference#rest-public-calc-market-average-price */ marketAveragePrice (params, cb = null) { const usp = new URLSearchParams(params) return this._makePublicPostRequest(`/calc/trade/avg?${usp.toString()}`, {}, cb) } /** * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-platform-status */ status (params = {}, cb = null) { return this._makePublicRequest('/platform/status', cb) } /** * @param {object} [params] - parameters * @param {string} [params.type] - type * @param {string[]} [params.keys] - keys * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#status */ statusMessages (params = {}, cb = null) { const { type = 'deriv', keys = ['ALL'] } = params const url = `/status/${type}?keys=${keys.join(',')}` const transformer = (type === 'deriv') ? StatusMessagesDeriv : null return this._makePublicRequest(url, cb, transformer) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-ticker */ ticker (params, cb = null) { const { symbol } = params const transformer = (data) => { const ticker = [symbol, ...data] return (symbol[0] === 't') ? new TradingTicker(ticker) : new FundingTicker(ticker) } return this._makePublicRequest(`/ticker/${symbol}`, cb, transformer) } /** * @param {object} [params] - parameters * @param {string[]} [params.symbols] - symbols * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-tickers */ tickers (params = {}, cb = null) { const { symbols = [] } = params const transformer = (data) => { return data.map(ticker => ( (ticker[0] || '')[0] === 't' ? new TradingTicker(ticker) : new FundingTicker(ticker) )) } const url = `/tickers?symbols=${symbols.length ? symbols.join(',') : 'ALL'}` return this._makePublicRequest(url, cb, transformer) } /** * @param {object} [params] - parameters * @param {string[]} [params.symbols] - symbols * @param {number} [params.start] - query start timestamp * @param {number} [params.end] - query end timestamp * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-tickers-history */ tickersHistory (params = {}, cb = null) { const { symbols = [], start, end, limit = 250 } = params const transformer = (data) => { return data.map(ticker => ( (ticker[0] || '')[0] === 't' ? new TradingTickerHist(ticker) : new FundingTickerHist(ticker) )) } const s = (start) ? `&amp;start=${start}` : '' const e = (end) ? `&amp;end=${end}` : '' const query = `?symbols=${symbols.length ? symbols.join(',') : 'ALL'}${s}${e}&amp;limit=${limit}` const url = `/tickers/hist${query}` return this._makePublicRequest(url, cb, transformer) } /** * @param {object} params - parameters * @param {string} params.key - key * @param {string} params.context - context * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-stats */ stats (params, cb = null) { const { key, context } = params return this._makePublicRequest(`/stats1/${key}/${context}`, cb) } /** * @param {object} params - parameters * @param {string} params.timeframe - 1m, 5m, 15m, 30m, 1h, 3h, 6h, 12h, 1D, 7D, 14D, 1M * @param {string} params.symbol - symbol * @param {string} params.section - hist, last * @param {object} [params.query] - query params * @param {number} [params.query.sort] - query sort param * @param {number} [params.query.start] - query sort param * @param {number} [params.query.end] - query sort param * @param {number} [params.query.limit] - query sort param * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see http://docs.bitfinex.com/v2/reference#rest-public-candles */ candles (params, cb = null) { const { timeframe, symbol, section, query = {} } = params let url = `/candles/trade:${timeframe}:${symbol}/${section}` if (Object.keys(query).length > 0) { url += `?${new URLSearchParams(query).toString()}` } return this._makePublicRequest(url, cb, Candle) } /** * Query configuration information * * @param {object} [params] - parameters * @param {string[]} [params.keys] - keys * @param {Function} [cb] - legacy callback * @returns {Promise} p */ conf (params = {}, cb = null) { const { keys = [] } = params if (_isEmpty(keys)) { return this._response([], null, cb) } const url = `/conf/${keys.join(',')}` return this._makePublicRequest(url, cb) } /** * Get a list of valid currencies ids, full names, pool and explorer * * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-currencies */ async currencies (params = {}, cb = null) { const suffix = (this._company) ? ':' + this._company : '' const url = `/conf/${[ `pub:list:currency${suffix}`, `pub:map:currency:sym${suffix}`, `pub:map:currency:label${suffix}`, `pub:map:currency:pool${suffix}`, `pub:map:currency:explorer${suffix}`, `pub:map:currency:wfx${suffix}` ].join(',')}` return this._makePublicRequest(url, cb, (data) => { const res = this._genCurrencyList(data) return this._doTransform(res, Currency) }) } /** * @param {object} params - parameters * @param {string} params.type - type * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-alert-list */ alertList (params, cb = null) { const { type } = params return this._makeAuthRequest('/auth/r/alerts', { type }, cb, Alert) } /** * @param {object} params - parameters * @param {string} params.type - type * @param {string} params.symbol - symbol * @param {number} params.price - price * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-alert-set */ alertSet (params, cb = null) { const { type, symbol, price } = params return this._makeAuthRequest('/auth/w/alert/set', { type, symbol, price }, cb, Alert) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {number} params.price - price * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-alert-delete */ alertDelete (params, cb = null) { const { symbol, price } = params return this._makeAuthRequest('/auth/w/alert/del', { symbol, price }, cb) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {number} [params.sort] - if 1, sorts results oldest first * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-trades */ trades (params, cb = null) { const { symbol, start, end, limit, sort } = params const query = {} Object.assign(query, _omitBy({ start, end, limit, sort }, _isNil)) let url = `/trades/${symbol}/hist` if (Object.keys(query).length > 0) { url += `?${new URLSearchParams(query).toString()}` } return this._makePublicRequest(url, cb, PublicTrade) } /** * @param {object} [params] - parameters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {number} [params.sort] - if 1, sorts results oldest first * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-public-liquidations */ liquidations (params = {}, cb = null) { const { start, end, limit, sort } = params const query = {} Object.assign(query, _omitBy({ start, end, limit, sort }, _isNil)) let url = '/liquidations/hist' if (Object.keys(query).length > 0) { url += `?${new URLSearchParams(query).toString()}` } return this._makePublicRequest(url, cb, Liquidations) } /** * @param {object} [params] - parameters * @param {string} [params.symbol] - optional, omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {number} [params.sort] - if 1, sorts results oldest first * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-trades-hist */ accountTrades (params = {}, cb = null) { const { symbol, start, end, limit, sort } = params const url = !_isEmpty(symbol) ? `/auth/r/trades/${symbol}/hist` : '/auth/r/trades/hist' return this._makeAuthRequest(url, { start, end, limit, sort }, cb, Trade) } /** * @param {object} [params] - parameters * @param {string} [params.symbol] - query symbol * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p */ getWeightedAverages (params = {}, cb = null) { const { symbol, start, end, limit } = params const url = '/auth/r/trades/calc' return this._makeAuthRequest(url, { symbol, start, end, limit }, cb, WeightedAverages) } /** * @param {object} [params] - parameters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-logins-hist */ logins (params = {}, cb = null) { const url = '/auth/r/logins/hist' const { start, end, limit } = params return this._makeAuthRequest(url, { start, end, limit }, cb, Login) } /** * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-wallets */ wallets (params = {}, cb = null) { return this._makeAuthRequest('/auth/r/wallets', params, cb, Wallet) } /** * @param {object} [params] - parameters * @param {number} [params.end] - query end * @param {string} [params.currency] - currency * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-wallets-hist */ walletsHistory (params = {}, cb = null) { return this._makeAuthRequest('/auth/r/wallets/hist', params, cb, WalletHist) } /** * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference#rest-auth-info-user */ userInfo (params = {}, cb = null) { return this._makeAuthRequest('/auth/r/info/user', params, cb, UserInfo) } /** * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-orders */ activeOrders (params = {}, cb = null) { return this._makeAuthRequest('/auth/r/orders', params, cb, Order) } /** * @param {object} params - parameters * @param {Array} params.ids - order ids * @param {Function} cb - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-orders */ activeOrdersWithIds (params, cb = null) { const { ids } = params const url = '/auth/r/orders' return this._makeAuthRequest(url, { id: ids }, cb, Order) } /** * @param {object} [params] - parameters * @param {string} [params.ccy] - i.e. ETH * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit, default 25 * @param {string} [params.address] - query address * @param {Array&lt;number>} [params.id] - Optional array of deposit/withdrawal ids * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#movements */ movements (params = {}, cb = null) { const { ccy, start, end, limit = 25, id, address } = params const url = ccy ? `/auth/r/movements/${ccy}/hist` : '/auth/r/movements/hist' return this._makeAuthRequest(url, { start, end, limit, id, address }, cb, Movement) } /** * @param {object} [params] - parameters * @param {number} [params.id] - movement id * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference/movement-info */ movementInfo (params, cb = null) { const { id } = params const url = '/auth/r/movements/info' return this._makeAuthRequest(url, { id }, cb, MovementInfo) } /** * @param {object} params - parameters * @param {object|string} params.filters - filters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - default 25 * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#ledgers */ ledgers (params, cb = null) { const { filters, start, end, limit = 25 } = params const parseFilters = (sent) => { if (_isString(sent)) return { ccy: sent } return sent || {} } const { ccy, category } = parseFilters(filters) const url = ccy ? `/auth/r/ledgers/${ccy}/hist` : '/auth/r/ledgers/hist' return this._makeAuthRequest(url, { start, end, limit, category }, cb, LedgerEntry) } /** * @param {object} [params] - parameters * @param {string} [params.symbol] - optional, omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference#rest-auth-orders-history */ orderHistory (params = {}, cb = null) { const { symbol, start, end, limit } = params const url = !_isEmpty(symbol) ? `/auth/r/orders/${symbol}/hist` : '/auth/r/orders/hist' return this._makeAuthRequest(url, { start, end, limit }, cb, Order) } /** * @param {object} params - parameters * @param {Array} params.ids - order ids * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference#rest-auth-orders-history */ orderHistoryWithIds (params, cb = null) { const { ids } = params const url = '/auth/r/orders/hist' return this._makeAuthRequest(url, { id: ids }, cb, Order) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {number} params.orderId - order ID * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-order-trades */ orderTrades (params, cb = null) { const { symbol, start, end, limit, orderId } = params return this._makeAuthRequest(`/auth/r/order/${symbol}:${orderId}/trades`, { start, end, limit }, cb, Trade) } /** * @param {object} [params] - parameters * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-positions */ positions (params = {}, cb = null) { return this._makeAuthRequest('/auth/r/positions', params, cb, Position) } /** * @param {object} [params] - parameters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-positions-history */ positionsHistory (params = {}, cb = null) { const { start, end, limit = 50 } = params return this._makeAuthRequest('/auth/r/positions/hist', { start, end, limit }, cb, Position) } /** * @param {object} [params] - parameters * @param {number[]} [params.id] - ids of positions to audit * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-positions-audit */ positionsAudit (params = {}, cb = null) { const { id, start, end, limit = 250 } = params return this._makeAuthRequest('/auth/r/positions/audit', { id, start, end, limit }, cb, Position) } /** * @param {object} [params] - parameters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-positions-snap */ positionsSnapshot (params = {}, cb = null) { const { start, end, limit = 50 } = params return this._makeAuthRequest('/auth/r/positions/snap', { start, end, limit }, cb, Position) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-offers */ fundingOffers (params, cb = null) { const { symbol } = params return this._makeAuthRequest(`/auth/r/funding/offers/${symbol}`, {}, cb, FundingOffer) } /** * @param {object} params - parameters * @param {string} [params.symbol] - omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-offers-hist */ fundingOfferHistory (params, cb = null) { const { symbol = '', start, end, limit } = params const url = !_isEmpty(symbol) ? `/auth/r/funding/offers/${symbol}/hist` : '/auth/r/funding/offers/hist' return this._makeAuthRequest(url, { start, end, limit }, cb, FundingOffer) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-loans */ fundingLoans (params, cb = null) { const { symbol } = params return this._makeAuthRequest(`/auth/r/funding/loans/${symbol}`, {}, cb, FundingLoan) } /** * @param {object} params - parameters * @param {string} [params.symbol] - omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-loans-hist */ fundingLoanHistory (params, cb = null) { const { symbol = '', start, end, limit } = params const url = !_isEmpty(symbol) ? `/auth/r/funding/loans/${symbol}/hist` : '/auth/r/funding/loans/hist' return this._makeAuthRequest(url, { start, end, limit }, cb, FundingLoan) } /** * @param {object} params - parameters * @param {string} params.symbol - symbol * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-credits */ fundingCredits (params, cb = null) { const { symbol } = params return this._makeAuthRequest(`/auth/r/funding/credits/${symbol}`, {}, cb, FundingCredit) } /** * @param {object} params - parameters * @param {string} [params.symbol] - omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-credits-hist */ fundingCreditHistory (params, cb = null) { const { symbol = '', start, end, limit } = params const url = !_isEmpty(symbol) ? `/auth/r/funding/credits/${symbol}/hist` : '/auth/r/funding/credits/hist' return this._makeAuthRequest(url, { start, end, limit }, cb, FundingCredit) } /** * @param {object} params - parameters * @param {string} [params.symbol] - optional, omit/leave empty for all * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-funding-trades-hist */ fundingTrades (params, cb = null) { const { symbol = '', start, end, limit } = params const url = !_isEmpty(symbol) ? `/auth/r/funding/trades/${symbol}/hist` : '/auth/r/funding/trades/hist' return this._makeAuthRequest(url, { start, end, limit }, cb, FundingTrade) } /** * @param {object} [params] - parameters * @param {string} [params.key] - key * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-info-margin */ marginInfo (params = {}, cb = null) { const { key = 'base' } = params return this._makeAuthRequest(`/auth/r/info/margin/${key}`, {}, cb, MarginInfo) } /** * @param {object} [params] - parameters * @param {number} [params.start] - query start * @param {number} [params.end] - query end * @param {number} [params.limit] - query limit * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-audit-hist */ changeLogs (params = {}, cb = null) { const { start, end, limit } = params return this._makeAuthRequest('/auth/r/audit/hist', { start, end, limit }, cb, ChangeLog) } /** * @param {object} params - parameters * @param {string} params.key - key * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/v2/reference#rest-auth-info-funding */ fundingInfo (params, cb = null) { const { key } = params return this._makeAuthRequest(`/auth/r/info/funding/${key}`, {}, cb) } /** * @param {object} params - parameters * @param {string} params.type - Specify the funding type ('credit' or 'loan') * @param {string} params.id - The loan or credit id * @param {Function} [cb] - legacy callback * @returns {Promise} p * @see https://docs.bitfinex.com/reference#rest-auth-keep-funding */ keepFunding (params, cb = null) { const { type, id } = params return this._makeAuthRequest('/auth/w/fundin