crypto-client
Version:
An unified client for all cryptocurrency exchanges.
156 lines (155 loc) • 5.71 kB
JavaScript
;
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;