coinex.com
Version:
API Interface for coinex.com Bitcoin Cash exchange.
347 lines (312 loc) • 9.5 kB
JavaScript
// 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);