105 lines
3.2 KiB
JavaScript
105 lines
3.2 KiB
JavaScript
const _ = require('lodash');
|
|
const fs = require('fs');
|
|
const moment = require('moment');
|
|
const errors = require('./exchangeErrors');
|
|
|
|
const Checker = function() {
|
|
_.bindAll(this);
|
|
}
|
|
|
|
Checker.prototype.getExchangeCapabilities = function(slug) {
|
|
if(!fs.existsSync(__dirname + '/wrappers/' + slug + '.js'))
|
|
throw new errors.ExchangeError(`Gekko does not know the exchange "${slug}"`);
|
|
|
|
return require('./wrappers/' + slug).getCapabilities();
|
|
}
|
|
|
|
// check if the exchange is configured correctly for monitoring
|
|
Checker.prototype.cantMonitor = function(conf) {
|
|
var slug = conf.exchange.toLowerCase();
|
|
var exchange = this.getExchangeCapabilities(slug);
|
|
|
|
if(!exchange)
|
|
return 'Gekko does not support the exchange ' + slug;
|
|
|
|
var name = exchange.name;
|
|
|
|
if('monitorError' in exchange)
|
|
return 'At this moment Gekko can\'t monitor ' + name + ', find out more info here:\n\n' + exchange.monitorError;
|
|
|
|
var name = exchange.name;
|
|
|
|
if(!_.includes(exchange.currencies, conf.currency))
|
|
return 'Gekko only supports the currencies [ ' + exchange.currencies.join(', ') + ' ] at ' + name + ' (not ' + conf.currency + ')';
|
|
|
|
if(!_.includes(exchange.assets, conf.asset))
|
|
return 'Gekko only supports the assets [ ' + exchange.assets.join(', ') + ' ] at ' + name + ' (not ' + conf.asset + ')';
|
|
|
|
var pair = _.find(exchange.markets, function(p) {
|
|
return p.pair[0] === conf.currency && p.pair[1] === conf.asset;
|
|
});
|
|
|
|
if(!pair)
|
|
return 'Gekko does not support this currency/assets pair at ' + name;
|
|
|
|
// everything is okay
|
|
return false;
|
|
}
|
|
|
|
// check if the exchange is configured correctly for fetching
|
|
// full history
|
|
Checker.prototype.cantFetchFullHistory = function(conf) {
|
|
var slug = conf.exchange.toLowerCase();
|
|
var exchange = this.getExchangeCapabilities(slug);
|
|
|
|
if(this.cantMonitor(conf))
|
|
return this.cantMonitor(conf);
|
|
|
|
var name = exchange.name;
|
|
|
|
if(!exchange.providesFullHistory)
|
|
return 'The exchange ' + name + ' does not provide full history (or Gekko doesn\'t support importing it)';
|
|
|
|
if ("exchangeMaxHistoryAge" in exchange) {
|
|
if (moment(config.importer.daterange.from) < moment().subtract(exchange.exchangeMaxHistoryAge, "days")) {
|
|
return 'Unsupported date from! ' + exchange.name + ' supports history of max ' + exchange.exchangeMaxHistoryAge + ' days..';
|
|
}
|
|
}
|
|
}
|
|
|
|
// check if the exchange if configured correctly for real trading
|
|
Checker.prototype.cantTrade = function(conf) {
|
|
var cantMonitor = this.cantMonitor(conf);
|
|
if(cantMonitor)
|
|
return cantMonitor;
|
|
|
|
var slug = conf.exchange.toLowerCase();
|
|
var exchange = this.getExchangeCapabilities(slug);
|
|
var name = exchange.name;
|
|
|
|
if(!exchange.tradable)
|
|
return 'At this moment Gekko can\'t trade at ' + name + '.';
|
|
|
|
if(conf.key === 'your-key')
|
|
return '"your-key" is not a valid API key';
|
|
|
|
if(conf.secret === 'your-secret')
|
|
return '"your-secret" is not a valid API secret';
|
|
|
|
var error = false;
|
|
_.each(exchange.requires, function(req) {
|
|
if(!conf[req])
|
|
error = name + ' requires "' + req + '" to be set in the config';
|
|
}, this);
|
|
|
|
return error;
|
|
}
|
|
|
|
Checker.prototype.settings = function(conf) {
|
|
var slug = conf.exchange.toLowerCase();
|
|
return this.getExchangeCapabilities(slug);
|
|
|
|
}
|
|
|
|
module.exports = new Checker();
|