UNPKG

crypto-client

Version:

An unified client for all cryptocurrency exchanges.

156 lines (155 loc) 5.71 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.queryAllBalances = exports.queryOrder = exports.cancelOrder = exports.placeOrder = exports.checkTradable = exports.SUPPORTED_PAIRS = void 0; const assert_1 = require("assert"); const axios_1 = __importDefault(require("axios")); const crypto_1 = __importDefault(require("crypto")); const config_1 = require("../config"); const util_1 = require("../util"); const debug_1 = __importDefault(require("../util/debug")); const whaleex_sign_1 = require("../util/whaleex_sign"); const API_BASE_URL = 'https://www.mxc.com'; // Only the following pairs are tradable via API, see https://www.mxc.com/ucenter/api exports.SUPPORTED_PAIRS = [ 'ADA_USDT', 'AE_USDT', 'ALGO_USDT', 'ARPA_USDT', 'BCH_USDT', 'BNB_USDT', 'BSV_USDT', 'BTC_USDT', 'DASH_USDT', 'DOGE_USDT', 'EOS_USDT', 'ETH_USDT', 'GRIN_USDT', 'HT_USDT', 'IRIS_USDT', 'LTC_USDT', 'NAS_USDT', 'OMG_USDT', 'ONT_USDT', 'SERO_USDT', 'TRX_USDT', 'VSYS_USDT', 'XLM_USDT', 'XRP_USDT', 'ZEC_USDT', 'ZIL_USDT', ]; function checkTradable(pair) { const tradable = exports.SUPPORTED_PAIRS.includes(pair); assert_1.strict.ok(tradable, `The pair ${pair} is not tradable through API`); return tradable; } exports.checkTradable = checkTradable; function sign(params, secretKey) { const paramsText = whaleex_sign_1.sort(params); const signature = crypto_1.default .createHash('md5') .update(`${paramsText}&api_secret=${secretKey}`) .digest('hex'); return [paramsText, signature]; } async function placeOrder(market, price, quantity, sell) { try { assert_1.strict.ok(market); assert_1.strict.ok(config_1.USER_CONFIG.MXC_ACCESS_KEY); assert_1.strict.ok(config_1.USER_CONFIG.MXC_SECRET_KEY); const [priceStr, quantityStr] = util_1.convertPriceAndQuantityToStrings(market, price, quantity, sell); const path = '/open/api/v1/private/order'; const params = { api_key: config_1.USER_CONFIG.MXC_ACCESS_KEY, req_time: Date.now(), market: market.id, price: priceStr, quantity: quantityStr, trade_type: sell ? 2 : 1, }; const [paramsText, signature] = sign(params, config_1.USER_CONFIG.MXC_SECRET_KEY); const requestUrl = `${API_BASE_URL}${path}?${paramsText}&sign=${signature}`; debug_1.default(requestUrl); const response = await axios_1.default.post(requestUrl).catch((e) => { return e; }); if (response instanceof Error) return response; assert_1.strict.equal(response.status, 200); assert_1.strict.equal(response.data.code, 200); return response.data.data; } catch (e) { debug_1.default(e); throw e; } } exports.placeOrder = placeOrder; async function cancelOrder(market, orderId) { assert_1.strict.ok(market); const path = '/open/api/v1/private/order'; const params = { api_key: config_1.USER_CONFIG.MXC_ACCESS_KEY, req_time: Date.now(), market: market.id, trade_no: orderId, }; const [paramsText, signature] = sign(params, config_1.USER_CONFIG.MXC_SECRET_KEY); const requestUrl = `${API_BASE_URL}${path}?${paramsText}&sign=${signature}`; debug_1.default(requestUrl); const response = await axios_1.default.delete(requestUrl); assert_1.strict.equal(response.status, 200); return response.status === 200 && response.data.code === 200; } exports.cancelOrder = cancelOrder; async function queryOrder(market, orderId) { assert_1.strict.ok(market); const path = '/open/api/v1/private/order'; const params = { api_key: config_1.USER_CONFIG.MXC_ACCESS_KEY, req_time: Date.now(), market: market.id, trade_no: orderId, }; const [paramsText, signature] = sign(params, config_1.USER_CONFIG.MXC_SECRET_KEY); const requestUrl = `${API_BASE_URL}${path}?${paramsText}&sign=${signature}`; debug_1.default(requestUrl); const response = await axios_1.default.get(requestUrl); assert_1.strict.equal(response.status, 200); assert_1.strict.equal(response.data.code, 200); return response.data.data; } exports.queryOrder = queryOrder; async function getAccountInfo() { assert_1.strict.ok(config_1.USER_CONFIG.MXC_ACCESS_KEY); assert_1.strict.ok(config_1.USER_CONFIG.MXC_SECRET_KEY); const path = '/open/api/v1/private/account/info'; const params = { api_key: config_1.USER_CONFIG.MXC_ACCESS_KEY, req_time: Date.now(), }; const [paramsText, signature] = sign(params, config_1.USER_CONFIG.MXC_SECRET_KEY); const requestUrl = `${API_BASE_URL}${path}?${paramsText}&sign=${signature}`; debug_1.default(requestUrl); const response = await axios_1.default.get(requestUrl); assert_1.strict.equal(response.status, 200); return response.data; } async function queryAllBalances(all = false) { const accountInfo = await getAccountInfo().catch((e) => { return e; }); if (accountInfo instanceof Error) return accountInfo; const result = {}; Object.keys(accountInfo).forEach((symbol) => { result[symbol] = all ? parseFloat(accountInfo[symbol].available) + parseFloat(accountInfo[symbol].frozen) : parseFloat(accountInfo[symbol].available); }); return result; } exports.queryAllBalances = queryAllBalances;