UNPKG

coinex.com

Version:

API Interface for coinex.com Bitcoin Cash exchange.

347 lines (312 loc) 9.5 kB
// Generated by CoffeeScript 2.6.1 (function() { var Bent, CError, Coinex, HOST, MD5, Path, Property, URLSearchParams, V1, arrayFloat, dataFloat, sleep, util, splice = [].splice; Bent = require('bent'); ({URLSearchParams} = require('url')); Path = require('path'); util = require('util'); MD5 = require('md5.js'); Property = require('./Property'); CError = require('./CoinexError'); HOST = 'https://api.coinex.com'; V1 = 'v1'; sleep = (secs = 10) => { return new Promise((resolve, reject) => { return setTimeout(() => { return resolve(); }, secs * 1000); }); }; arrayFloat = function(arr) { if (typeof arr === 'string') { return parseFloat(arr); } return arr.map(function(element) { if (typeof element === 'string') { return arrayFloat(element); } else { return element; } }); }; dataFloat = function(obj) { var i, k, keys, len; keys = ['amount', 'avg_price', 'deal_amount', 'deal_fee', 'deal_money', 'left', 'maker_fee_rate', 'price', 'taker_fee_rate']; for (i = 0, len = keys.length; i < len; i++) { k = keys[i]; obj[k] = parseFloat(obj[k]); } obj.create_time = new Date(obj.create_time * 1000); return obj; }; Coinex = class Coinex extends Property { constructor(key, secret) { super(); this.key = key; this.secret = secret; this.GET = Bent(`${HOST}/${V1}/`, 'json', 'GET'); this.POST = Bent(`${HOST}/${V1}/`, 'json', 'POST'); this.PUT = Bent(`${HOST}/${V1}/`, 'json', 'PUT'); this.DELETE = Bent(`${HOST}/${V1}/`, 'json', 'DELETE'); } get(...path) { var ref, search, url; ref = path, [...path] = ref, [search] = splice.call(path, -1); if (typeof search === 'object') { search = new URLSearchParams(search); } else { path.push(search); } url = Path.join(...path); if (search != null) { url += '?' + search.toString(); } return this.GET(url).then(function(result) { if (result.code !== 0) { throw new CError(result.code, result.message); } return result.data; }); } delete(...path) { var md5, ref, search; ref = path, [...path] = ref, [search] = splice.call(path, -1); search = new URLSearchParams(search); search.set('access_id', this.key); search.set('tonce', new Date().valueOf()); search.sort(); search.set('secret_key', this.secret); md5 = new MD5(); md5.update(search.toString()); // .substr(1) # Lose the leading '?' search.delete('secret_key'); path = Path.join(...path) + '?' + search.toString(); return this.DELETE(path, null, { authorization: md5.digest('hex').toUpperCase() }).then(function(result) { if (result.code !== 0) { throw new CError(result.code, result.message); } return result.data; }); } getAuth(...path) { var md5, ref, search; ref = path, [...path] = ref, [search] = splice.call(path, -1); search = new URLSearchParams(search); search.set('access_id', this.key); search.set('tonce', new Date().valueOf()); search.sort(); search.set('secret_key', this.secret); md5 = new MD5(); md5.update(search.toString()); // .substr(1) # Lose the leading '?' search.delete('secret_key'); path = Path.join(...path) + '?' + search.toString(); return this.GET(path, null, { authorization: md5.digest('hex').toUpperCase() }).then(function(result) { if (result.code !== 0) { throw new CError(result.code, result.message); } return result.data; }); } post(...path) { var md5, params, ref, search; ref = path, [...path] = ref, [params] = splice.call(path, -1); params.access_id = this.key; params.tonce = new Date().valueOf(); search = new URLSearchParams(params); search.sort(); search.set('secret_key', this.secret); md5 = new MD5(); md5.update(search.toString()); path = Path.join(...path); return this.POST(path, params, { authorization: md5.digest('hex').toUpperCase() }).then(function(result) { if (result.code !== 0) { throw new CError(result.code, result.message); } return result.data; }); } //################################################################# //# Market API //################################################################# list() { return this.get('market', 'list'); } ticker(pair) { return this.get('market', 'ticker', { market: pair }).then((data) => { return data.ticker; }); } tickerAll() { return this.get('market', 'ticker', 'all').then((data) => { return data.ticker; }); } depth(pair, limit = 100, dp = 8) { var merge; merge = dp ? `0.${'0'.repeat(dp - 1)}1` : 0; return this.get('market', 'depth', { market: pair, merge: merge, limit: limit }).then(function(data) { data.asks = arrayFloat(data.asks); data.bids = arrayFloat(data.bids); return data; }); } transactions(pair, lastID) { var params; params = { market: pair }; if (lastID != null) { params.last_id = lastID; } return this.get('market', 'deals', params).then((data) => { var i, item, len, results; results = []; for (i = 0, len = data.length; i < len; i++) { item = data[i]; results.push({ amount: parseFloat(item.amount), date: new Date(item.date_ms), price: parseFloat(item.price), type: item.type, id: item.id }); } return results; }); } kline(pair, type = '1hour') { return this.get('market', 'kline', { market: pair, type: type }).then(function(data) { var i, item, len, results; results = []; for (i = 0, len = data.length; i < len; i++) { item = data[i]; item[0] = new Date(item[0] * 1000); results.push(arrayFloat(item)); } return results; }); } //################################################################# //# Account API //################################################################# balance() { return this.getAuth('balance', {}).then((data) => { var k, v; for (k in data) { v = data[k]; v.available = parseFloat(v.available); v.frozen = parseFloat(v.frozen); } return data; }); } //################################################################# //# Trading API //################################################################# placeLimitOrder(pair, type, amount, price, sourceID) { var params; params = { market: pair, type: type, amount: amount.toString(), price: price.toString() }; if (sourceID) { params.source_id = sourceID; } return this.post('order', 'limit', params).then(function(data) { return dataFloat(data); }); } placeMarketOrder(pair, type, amount) { return this.post('order', 'market', { market: pair, type: type, amount: amount }).then(function(data) { return dataFloat(data); }); } cancelOrder(pair, id) { return this.delete('order', 'pending', { market: pair, id: id }).then(function(data) { return dataFloat(data); }); } pending(pair, page = 1, limit = 100) { return this.getAuth('order', 'pending', { market: pair, page: page, limit: limit }).then(function(data) { var i, len, order, ref; ref = data.data; for (i = 0, len = ref.length; i < len; i++) { order = ref[i]; dataFloat(order); } return data; }); } completed(pair, page = 1, limit = 100) { return this.getAuth('order', 'finished', { market: pair, page: page, limit: limit }).then(function(data) { var i, len, order, ref; ref = data.data; for (i = 0, len = ref.length; i < len; i++) { order = ref[i]; dataFloat(order); } return data; }); } orderStatus(pair, id) { return this.getAuth('order', { market: pair, id: id }).then(function(data) { return dataFloat(data); }); } history(pair, page = 1, limit = 100) { return this.getAuth('order', 'user', 'deals', { market: pair, page: page, limit: limit }).then(function(data) { var i, item, len, ref; ref = data.data; for (i = 0, len = ref.length; i < len; i++) { item = ref[i]; item.amount = parseFloat(item.amount); item.deal_money = parseFloat(item.deal_money); item.fee = parseFloat(item.fee); item.price = parseFloat(item.price); item.create_time = new Date(item.create_time * 1000); } return data; }); } }; module.exports = Coinex; }).call(this);