Error codes

- Added error codes for floExchangeAPI
This commit is contained in:
sairajzero 2022-05-12 01:40:31 +05:30
parent 0baa6925dc
commit a77f7d77d6
4 changed files with 175 additions and 115 deletions

View File

@ -468,7 +468,7 @@
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let curPos = fetch_api.curPos || 0; let curPos = fetch_api.curPos || 0;
if (curPos >= nodeList.length) if (curPos >= nodeList.length)
return reject(ExchangeError(ExchangeError.NODES_OFFLINE_CODE, 'No Node online! Try again later')); return reject(ExchangeError(ExchangeError.NODES_OFFLINE_CODE, 'No Node online! Try again later', errorCode.NODES_OFFLINE));
let url = "https://" + nodeURL[nodeList[curPos]]; let url = "https://" + nodeURL[nodeList[curPos]];
(options ? fetch(url + api, options) : fetch(url + api)) (options ? fetch(url + api, options) : fetch(url + api))
.then(result => resolve(result)).catch(error => { .then(result => resolve(result)).catch(error => {
@ -482,17 +482,62 @@
}) })
} }
function ExchangeError(status, message) { const errorCode = exchangeAPI.errorCode = {
if (message === ExchangeError.INVALID_SERVER_MSG) INCORRECT_SERVER: '000',
location.reload();
else if (this instanceof ExchangeError) { //INVALID INPUTS: 0XX
this.message = message; INVALID_REQUEST_FORMAT: '001',
this.status = status; ACCESS_DENIED: '002',
} else INVALID_FLO_ID: '011',
return new ExchangeError(status, message); INVALID_LOGIN_CODE: '012',
INVALID_PRIVATE_KEY: '013',
INVALID_PUBLIC_KEY: '014',
INVALID_SIGNATURE: '015',
EXPIRED_SIGNATURE: '016',
DUPLICATE_SIGNATURE: '017',
SESSION_INVALID: '018',
SESSION_EXPIRED: '019',
INVALID_TOKEN_NAME: '021',
INVALID_NUMBER: '022',
INVALID_TYPE: '023',
INVALID_TX_ID: '024',
INVALID_TAG: '025',
MISSING_PARAMETER: '099',
//INCORRECT DATA: 1XX
NOT_FOUND: '101',
NOT_OWNER: '102',
DUPLICATE_ENTRY: '103',
//INSUFFICIENT: 2XX
INSUFFICIENT_BALANCE: '201',
INSUFFICIENT_SELLCHIP: '203',
GREATER_SELLCHIP_BASE: '204',
//OTHERS
NODES_OFFLINE: '404',
INTERNAL_ERROR: '500'
};
const parseErrorCode = exchangeAPI.parseErrorCode = function(message) {
let code = message.match(/^E\d{3}:/g);
if (!code || !code.length)
return null;
else
return code[0].substring(1, 4);
}
function ExchangeError(status, message, code = null) {
if (parseErrorCode(message) === errorCode.INCORRECT_SERVER)
location.reload();
else if (this instanceof ExchangeError) {
this.code = code || parseErrorCode(message);
this.message = message.replace(/^E\d{3}:/g, '').trim();
this.status = status;
} else
return new ExchangeError(status, message, code);
} }
ExchangeError.INVALID_SERVER_MSG = "INCORRECT_SERVER_ERROR";
ExchangeError.BAD_REQUEST_CODE = 400; ExchangeError.BAD_REQUEST_CODE = 400;
ExchangeError.BAD_RESPONSE_CODE = 500; ExchangeError.BAD_RESPONSE_CODE = 500;
ExchangeError.NODES_OFFLINE_CODE = 404; ExchangeError.NODES_OFFLINE_CODE = 404;
@ -594,7 +639,7 @@
exchangeAPI.getBalance = function(floID = null, token = null) { exchangeAPI.getBalance = function(floID = null, token = null) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floID && !token) if (!floID && !token)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Need atleast one argument")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Need atleast one argument", errorCode.MISSING_PARAMETER));
let queryStr = (floID ? "floID=" + floID : "") + let queryStr = (floID ? "floID=" + floID : "") +
(floID && token ? "&" : "") + (floID && token ? "&" : "") +
(token ? "token=" + token : ""); (token ? "token=" + token : "");
@ -609,7 +654,7 @@
exchangeAPI.getTx = function(txid) { exchangeAPI.getTx = function(txid) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!txid) if (!txid)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, 'txid required')); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, 'txid required', errorCode.MISSING_PARAMETER));
fetch_api('/get-transaction?txid=' + txid) fetch_api('/get-transaction?txid=' + txid)
.then(result => responseParse(result) .then(result => responseParse(result)
.then(result => resolve(result)) .then(result => resolve(result))
@ -639,7 +684,7 @@
exchangeAPI.signUp = function (privKey, code, hash) { exchangeAPI.signUp = function (privKey, code, hash) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!code || !hash) if (!code || !hash)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Login Code missing")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Login Code missing", errorCode.MISSING_PARAMETER));
let request = { let request = {
pubKey: floCrypto.getPubKeyHex(privKey), pubKey: floCrypto.getPubKeyHex(privKey),
floID: floCrypto.getFloID(privKey), floID: floCrypto.getFloID(privKey),
@ -671,7 +716,7 @@
exchangeAPI.login = function(privKey, proxyKey, code, hash) { exchangeAPI.login = function(privKey, proxyKey, code, hash) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!code || !hash) if (!code || !hash)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Login Code missing")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Login Code missing", errorCode.MISSING_PARAMETER));
let request = { let request = {
proxyKey: proxyKey, proxyKey: proxyKey,
floID: floCrypto.getFloID(privKey), floID: floCrypto.getFloID(privKey),
@ -681,7 +726,7 @@
hash: hash hash: hash
}; };
if (!privKey || !request.floID) if (!privKey || !request.floID)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private key")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private key", errorCode.INVALID_PRIVATE_KEY));
request.sign = signRequest({ request.sign = signRequest({
type: "login", type: "login",
random: code, random: code,
@ -733,9 +778,9 @@
exchangeAPI.buy = function(asset, quantity, max_price, floID, proxySecret) { exchangeAPI.buy = function(asset, quantity, max_price, floID, proxySecret) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (typeof quantity !== "number" || quantity <= 0) if (typeof quantity !== "number" || quantity <= 0)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`, errorCode.INVALID_NUMBER));
else if (typeof max_price !== "number" || max_price <= 0) else if (typeof max_price !== "number" || max_price <= 0)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid max_price (${max_price})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid max_price (${max_price})`, errorCode.INVALID_NUMBER));
let request = { let request = {
floID: floID, floID: floID,
asset: asset, asset: asset,
@ -771,9 +816,9 @@
exchangeAPI.sell = function(asset, quantity, min_price, floID, proxySecret) { exchangeAPI.sell = function(asset, quantity, min_price, floID, proxySecret) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (typeof quantity !== "number" || quantity <= 0) if (typeof quantity !== "number" || quantity <= 0)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`, errorCode.INVALID_NUMBER));
else if (typeof min_price !== "number" || min_price <= 0) else if (typeof min_price !== "number" || min_price <= 0)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid min_price (${min_price})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid min_price (${min_price})`, errorCode.INVALID_NUMBER));
let request = { let request = {
floID: floID, floID: floID,
asset: asset, asset: asset,
@ -809,7 +854,7 @@
exchangeAPI.cancelOrder = function(type, id, floID, proxySecret) { exchangeAPI.cancelOrder = function(type, id, floID, proxySecret) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (type !== "buy" && type !== "sell") if (type !== "buy" && type !== "sell")
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid type (${type}): type should be sell (or) buy`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid type (${type}): type should be sell (or) buy`, errorCode.INVALID_TYPE));
let request = { let request = {
floID: floID, floID: floID,
orderType: type, orderType: type,
@ -843,7 +888,7 @@
exchangeAPI.transferToken = function(receiver, token, floID, proxySecret) { exchangeAPI.transferToken = function(receiver, token, floID, proxySecret) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (typeof receiver !== 'object' || receiver === null) if (typeof receiver !== 'object' || receiver === null)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid receiver: parameter is not an object")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid receiver: parameter is not an object", errorCode.INVALID_FLO_ID));
let invalidIDs = [], let invalidIDs = [],
invalidAmt = []; invalidAmt = [];
for (let f in receiver) { for (let f in receiver) {
@ -853,9 +898,9 @@
invalidAmt.push(receiver[f]) invalidAmt.push(receiver[f])
} }
if (invalidIDs.length) if (invalidIDs.length)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid receiver (${invalidIDs})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid receiver (${invalidIDs})`, errorCode.INVALID_FLO_ID));
else if (invalidAmt.length) else if (invalidAmt.length)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid amount (${invalidAmt})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid amount (${invalidAmt})`, errorCode.INVALID_NUMBER));
let request = { let request = {
floID: floID, floID: floID,
token: token, token: token,
@ -888,7 +933,9 @@
exchangeAPI.depositFLO = function(quantity, floID, sinkID, privKey, proxySecret = null) { exchangeAPI.depositFLO = function(quantity, floID, sinkID, privKey, proxySecret = null) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (typeof quantity !== "number" || quantity <= floGlobals.fee) if (typeof quantity !== "number" || quantity <= floGlobals.fee)
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`)); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, `Invalid quantity (${quantity})`, errorCode.INVALID_NUMBER));
else if (!floCrypto.verifyPrivKey(privKey, floID))
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY));
floBlockchainAPI.sendTx(floID, sinkID, quantity, privKey, '(deposit in market)').then(txid => { floBlockchainAPI.sendTx(floID, sinkID, quantity, privKey, '(deposit in market)').then(txid => {
let request = { let request = {
floID: floID, floID: floID,
@ -950,7 +997,7 @@
exchangeAPI.depositToken = function(token, quantity, floID, sinkID, privKey, proxySecret = null) { exchangeAPI.depositToken = function(token, quantity, floID, sinkID, privKey, proxySecret = null) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.verifyPrivKey(privKey, floID)) if (!floCrypto.verifyPrivKey(privKey, floID))
return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key")); return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY));
floTokenAPI.sendToken(privKey, quantity, sinkID, '(deposit in market)', token).then(txid => { floTokenAPI.sendToken(privKey, quantity, sinkID, '(deposit in market)', token).then(txid => {
let request = { let request = {
floID: floID, floID: floID,

View File

@ -5,7 +5,6 @@ module.exports = {
request: { request: {
SIGN_EXPIRE_TIME: 5 * 60 * 1000, //5 mins SIGN_EXPIRE_TIME: 5 * 60 * 1000, //5 mins
MAX_SESSION_TIMEOUT: 30 * 24 * 60 * 60 * 1000, //30 days MAX_SESSION_TIMEOUT: 30 * 24 * 60 * 60 * 1000, //30 days
INVALID_SERVER_MSG: "INCORRECT_SERVER_ERROR" //Should be reflected in public backend script
}, },
market: { market: {
PERIOD_INTERVAL: 5 * 60 * 1000, //5 min, PERIOD_INTERVAL: 5 * 60 * 1000, //5 min,

View File

@ -11,6 +11,8 @@ const {
TRANSFER_HASH_PREFIX TRANSFER_HASH_PREFIX
} = require('./_constants')["market"]; } = require('./_constants')["market"];
const eCode = require('../docs/scripts/floExchangeAPI').errorCode;
const updateBalance = coupling.updateBalance; const updateBalance = coupling.updateBalance;
var DB, assetList; //container for database and allowed assets var DB, assetList; //container for database and allowed assets
@ -36,7 +38,7 @@ function logout(floID) {
function getRateHistory(asset, duration) { function getRateHistory(asset, duration) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!asset || !assetList.includes(asset)) if (!asset || !assetList.includes(asset))
reject(INVALID(`Invalid asset(${asset})`)); reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset(${asset})`));
else else
coupling.price.getHistory(asset, duration) coupling.price.getHistory(asset, duration)
.then(result => resolve(result)) .then(result => resolve(result))
@ -47,11 +49,11 @@ function getRateHistory(asset, duration) {
function getBalance(floID, token) { function getBalance(floID, token) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (floID && !floCrypto.validateAddr(floID)) if (floID && !floCrypto.validateAddr(floID))
reject(INVALID(`Invalid floID(${floID})`)); reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID(${floID})`));
else if (token && token !== floGlobals.currency && !assetList.includes(token)) else if (token && token !== floGlobals.currency && !assetList.includes(token))
reject(INVALID(`Invalid token(${token})`)); reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid token(${token})`));
else if (!floID && !token) else if (!floID && !token)
reject(INVALID('Missing parameters: requires atleast one (floID, token)')); reject(INVALID(eCode.MISSING_PARAMETER, 'Missing parameters: requires atleast one (floID, token)'));
else { else {
var promise; var promise;
if (floID && token) if (floID && token)
@ -114,9 +116,9 @@ const getAssetBalance = (floID, asset) => new Promise((resolve, reject) => {
getAssetBalance.check = (floID, asset, amount) => new Promise((resolve, reject) => { getAssetBalance.check = (floID, asset, amount) => new Promise((resolve, reject) => {
getAssetBalance(floID, asset).then(balance => { getAssetBalance(floID, asset).then(balance => {
if (balance.total < amount) if (balance.total < amount)
reject(INVALID(`Insufficient ${asset}`)); reject(INVALID(eCode.INSUFFICIENT_BALANCE, `Insufficient ${asset}`));
else if (balance.net < amount) else if (balance.net < amount)
reject(INVALID(`Insufficient ${asset} (Some are locked in orders)`)); reject(INVALID(eCode.INSUFFICIENT_BALANCE, `Insufficient ${asset} (Some are locked in orders)`));
else else
resolve(true); resolve(true);
}).catch(error => reject(error)) }).catch(error => reject(error))
@ -125,13 +127,13 @@ getAssetBalance.check = (floID, asset, amount) => new Promise((resolve, reject)
function addSellOrder(floID, asset, quantity, min_price) { function addSellOrder(floID, asset, quantity, min_price) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject(INVALID(`Invalid floID (${floID})`)); return reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID (${floID})`));
else if (typeof quantity !== "number" || quantity <= 0) else if (typeof quantity !== "number" || quantity <= 0)
return reject(INVALID(`Invalid quantity (${quantity})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid quantity (${quantity})`));
else if (typeof min_price !== "number" || min_price <= 0) else if (typeof min_price !== "number" || min_price <= 0)
return reject(INVALID(`Invalid min_price (${min_price})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid min_price (${min_price})`));
else if (!assetList.includes(asset)) else if (!assetList.includes(asset))
return reject(INVALID(`Invalid asset (${asset})`)); return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`));
getAssetBalance.check(floID, asset, quantity).then(_ => { getAssetBalance.check(floID, asset, quantity).then(_ => {
checkSellRequirement(floID, asset, quantity, min_price).then(_ => { checkSellRequirement(floID, asset, quantity, min_price).then(_ => {
DB.query("INSERT INTO SellOrder(floID, asset, quantity, minPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, min_price]).then(result => { DB.query("INSERT INTO SellOrder(floID, asset, quantity, minPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, min_price]).then(result => {
@ -151,7 +153,7 @@ const checkSellRequirement = (floID, asset, quantity, min_price) => new Promise(
let total = result[0][0].total_chips, let total = result[0][0].total_chips,
locked = result[1][0].locked; locked = result[1][0].locked;
if (total < locked + quantity) if (total < locked + quantity)
reject(INVALID(`Insufficient sell-chips for ${asset}`)); reject(INVALID(eCode.INSUFFICIENT_SELLCHIP, `Insufficient sell-chips for ${asset}`));
else Promise.all([ else Promise.all([
DB.query("SELECT IFNULL(SUM(quantity), 0) AS total_chips FROM SellChips WHERE floID=? AND asset=? AND base<=?", [floID, asset, min_price]), DB.query("SELECT IFNULL(SUM(quantity), 0) AS total_chips FROM SellChips WHERE floID=? AND asset=? AND base<=?", [floID, asset, min_price]),
DB.query("SELECT IFNULL(SUM(quantity), 0) AS locked FROM SellOrder WHERE floID=? AND asset=? AND minPrice<=?", [floID, asset, min_price]) DB.query("SELECT IFNULL(SUM(quantity), 0) AS locked FROM SellOrder WHERE floID=? AND asset=? AND minPrice<=?", [floID, asset, min_price])
@ -164,7 +166,7 @@ const checkSellRequirement = (floID, asset, quantity, min_price) => new Promise(
if (l_locked > l_total) if (l_locked > l_total)
rem -= l_locked - l_total; rem -= l_locked - l_total;
if (rem < quantity) if (rem < quantity)
reject(INVALID(`Cannot sell below purchased price`)); reject(INVALID(eCode.GREATER_SELLCHIP_BASE, `Cannot sell below purchased price`));
else else
resolve(true); resolve(true);
}).catch(error => reject(error)) }).catch(error => reject(error))
@ -174,13 +176,13 @@ const checkSellRequirement = (floID, asset, quantity, min_price) => new Promise(
function addBuyOrder(floID, asset, quantity, max_price) { function addBuyOrder(floID, asset, quantity, max_price) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject(INVALID(`Invalid floID (${floID})`)); return reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID (${floID})`));
else if (typeof quantity !== "number" || quantity <= 0) else if (typeof quantity !== "number" || quantity <= 0)
return reject(INVALID(`Invalid quantity (${quantity})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid quantity (${quantity})`));
else if (typeof max_price !== "number" || max_price <= 0) else if (typeof max_price !== "number" || max_price <= 0)
return reject(INVALID(`Invalid max_price (${max_price})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid max_price (${max_price})`));
else if (!assetList.includes(asset)) else if (!assetList.includes(asset))
return reject(INVALID(`Invalid asset (${asset})`)); return reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid asset (${asset})`));
getAssetBalance.check(floID, floGlobals.currency, quantity * max_price).then(_ => { getAssetBalance.check(floID, floGlobals.currency, quantity * max_price).then(_ => {
DB.query("INSERT INTO BuyOrder(floID, asset, quantity, maxPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, max_price]).then(result => { DB.query("INSERT INTO BuyOrder(floID, asset, quantity, maxPrice) VALUES (?, ?, ?, ?)", [floID, asset, quantity, max_price]).then(result => {
resolve('Buy Order placed successfully'); resolve('Buy Order placed successfully');
@ -193,19 +195,19 @@ function addBuyOrder(floID, asset, quantity, max_price) {
function cancelOrder(type, id, floID) { function cancelOrder(type, id, floID) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject(INVALID(`Invalid floID (${floID})`)); return reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID (${floID})`));
let tableName; let tableName;
if (type === "buy") if (type === "buy")
tableName = "BuyOrder"; tableName = "BuyOrder";
else if (type === "sell") else if (type === "sell")
tableName = "SellOrder"; tableName = "SellOrder";
else else
return reject(INVALID("Invalid Order type! Order type must be buy (or) sell")); return reject(INVALID(eCode.INVALID_TYPE, "Invalid Order type! Order type must be buy (or) sell"));
DB.query(`SELECT floID, asset FROM ${tableName} WHERE id=?`, [id]).then(result => { DB.query(`SELECT floID, asset FROM ${tableName} WHERE id=?`, [id]).then(result => {
if (result.length < 1) if (result.length < 1)
return reject(INVALID("Order not found!")); return reject(INVALID(eCode.NOT_FOUND, "Order not found!"));
else if (result[0].floID !== floID) else if (result[0].floID !== floID)
return reject(INVALID("Order doesnt belong to the current user")); return reject(INVALID(eCode.NOT_OWNER, "Order doesnt belong to the current user"));
let asset = result[0].asset; let asset = result[0].asset;
//Delete the order //Delete the order
DB.query(`DELETE FROM ${tableName} WHERE id=?`, [id]).then(result => { DB.query(`DELETE FROM ${tableName} WHERE id=?`, [id]).then(result => {
@ -262,7 +264,7 @@ function getTransactionDetails(txid) {
tableName = 'TradeTransactions'; tableName = 'TradeTransactions';
type = 'trade'; type = 'trade';
} else } else
return reject(INVALID("Invalid TransactionID")); return reject(INVALID(eCode.INVALID_TX_ID, "Invalid TransactionID"));
DB.query(`SELECT * FROM ${tableName} WHERE txid=?`, [txid]).then(result => { DB.query(`SELECT * FROM ${tableName} WHERE txid=?`, [txid]).then(result => {
if (result.length) { if (result.length) {
let details = result[0]; let details = result[0];
@ -271,7 +273,7 @@ function getTransactionDetails(txid) {
details.receiver = JSON.parse(details.receiver); details.receiver = JSON.parse(details.receiver);
resolve(details); resolve(details);
} else } else
reject(INVALID("Transaction not found")); reject(INVALID(eCode.NOT_FOUND, "Transaction not found"));
}).catch(error => reject(error)) }).catch(error => reject(error))
}) })
} }
@ -279,9 +281,9 @@ function getTransactionDetails(txid) {
function transferToken(sender, receivers, token) { function transferToken(sender, receivers, token) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(sender)) if (!floCrypto.validateAddr(sender))
reject(INVALID(`Invalid sender (${sender})`)); reject(INVALID(eCode.INVALID_FLO_ID, `Invalid sender (${sender})`));
else if (token !== floGlobals.currency && !assetList.includes(token)) else if (token !== floGlobals.currency && !assetList.includes(token))
reject(INVALID(`Invalid token (${token})`)); reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid token (${token})`));
else { else {
let invalidIDs = [], let invalidIDs = [],
totalAmount = 0; totalAmount = 0;
@ -291,7 +293,7 @@ function transferToken(sender, receivers, token) {
else else
totalAmount += receivers[floID]; totalAmount += receivers[floID];
if (invalidIDs.length) if (invalidIDs.length)
reject(INVALID(`Invalid receiver (${invalidIDs})`)); reject(INVALID(eCode.INVALID_FLO_ID, `Invalid receiver (${invalidIDs})`));
else getAssetBalance.check(sender, token, totalAmount).then(_ => { else getAssetBalance.check(sender, token, totalAmount).then(_ => {
let txQueries = []; let txQueries = [];
txQueries.push(updateBalance.consume(sender, token, totalAmount)); txQueries.push(updateBalance.consume(sender, token, totalAmount));
@ -328,11 +330,11 @@ function depositFLO(floID, txid) {
if (result.length) { if (result.length) {
switch (result[0].status) { switch (result[0].status) {
case "PENDING": case "PENDING":
return reject(INVALID("Transaction already in process")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
case "REJECTED": case "REJECTED":
return reject(INVALID("Transaction already rejected")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already rejected"));
case "SUCCESS": case "SUCCESS":
return reject(INVALID("Transaction already used to add coins")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add coins"));
} }
} else } else
DB.query("INSERT INTO InputFLO(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"]) DB.query("INSERT INTO InputFLO(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"])
@ -417,9 +419,9 @@ confirmDepositFLO.addSellChipsIfLaunchSeller = function(floID, quantity) {
function withdrawFLO(floID, amount) { function withdrawFLO(floID, amount) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject(INVALID(`Invalid floID (${floID})`)); return reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID (${floID})`));
else if (typeof amount !== "number" || amount <= 0) else if (typeof amount !== "number" || amount <= 0)
return reject(INVALID(`Invalid amount (${amount})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid amount (${amount})`));
getAssetBalance.check(floID, "FLO", amount).then(_ => { getAssetBalance.check(floID, "FLO", amount).then(_ => {
let txQueries = []; let txQueries = [];
txQueries.push(updateBalance.consume(floID, "FLO", amount)); txQueries.push(updateBalance.consume(floID, "FLO", amount));
@ -477,11 +479,11 @@ function depositToken(floID, txid) {
if (result.length) { if (result.length) {
switch (result[0].status) { switch (result[0].status) {
case "PENDING": case "PENDING":
return reject(INVALID("Transaction already in process")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already in process"));
case "REJECTED": case "REJECTED":
return reject(INVALID("Transaction already rejected")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already rejected"));
case "SUCCESS": case "SUCCESS":
return reject(INVALID("Transaction already used to add tokens")); return reject(INVALID(eCode.DUPLICATE_ENTRY, "Transaction already used to add tokens"));
} }
} else } else
DB.query("INSERT INTO InputToken(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"]) DB.query("INSERT INTO InputToken(txid, floID, status) VALUES (?, ?, ?)", [txid, floID, "PENDING"])
@ -550,11 +552,11 @@ confirmDepositToken.checkTx = function(sender, txid) {
function withdrawToken(floID, token, amount) { function withdrawToken(floID, token, amount) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(floID)) if (!floCrypto.validateAddr(floID))
return reject(INVALID(`Invalid floID (${floID})`)); return reject(INVALID(eCode.INVALID_FLO_ID, `Invalid floID (${floID})`));
else if (typeof amount !== "number" || amount <= 0) else if (typeof amount !== "number" || amount <= 0)
return reject(INVALID(`Invalid amount (${amount})`)); return reject(INVALID(eCode.INVALID_NUMBER, `Invalid amount (${amount})`));
else if ((!assetList.includes(token) && token !== floGlobals.currency) || token === "FLO") else if ((!assetList.includes(token) && token !== floGlobals.currency) || token === "FLO")
return reject(INVALID("Invalid Token")); return reject(INVALID(eCode.INVALID_TOKEN_NAME, "Invalid Token"));
//Check for FLO balance (transaction fee) //Check for FLO balance (transaction fee)
let required_flo = floGlobals.sendAmt + floGlobals.fee; let required_flo = floGlobals.sendAmt + floGlobals.fee;
getAssetBalance.check(floID, "FLO", required_flo).then(_ => { getAssetBalance.check(floID, "FLO", required_flo).then(_ => {
@ -614,9 +616,9 @@ function addTag(floID, tag) {
.then(result => resolve(`Added ${floID} to ${tag}`)) .then(result => resolve(`Added ${floID} to ${tag}`))
.catch(error => { .catch(error => {
if (error.code === "ER_DUP_ENTRY") if (error.code === "ER_DUP_ENTRY")
reject(INVALID(`${floID} already in ${tag}`)); reject(INVALID(eCode.DUPLICATE_ENTRY, `${floID} already in ${tag}`));
else if (error.code === "ER_NO_REFERENCED_ROW") else if (error.code === "ER_NO_REFERENCED_ROW")
reject(INVALID(`Invalid Tag`)); reject(INVALID(eCode.INVALID_TAG, `Invalid Tag`));
else else
reject(error); reject(error);
}); });
@ -645,9 +647,9 @@ function addDistributor(floID, asset) {
.then(result => resolve(`Added ${asset} distributor: ${floID}`)) .then(result => resolve(`Added ${asset} distributor: ${floID}`))
.catch(error => { .catch(error => {
if (error.code === "ER_DUP_ENTRY") if (error.code === "ER_DUP_ENTRY")
reject(INVALID(`${floID} is already ${asset} disributor`)); reject(INVALID(eCode.DUPLICATE_ENTRY, `${floID} is already ${asset} disributor`));
else if (error.code === "ER_NO_REFERENCED_ROW") else if (error.code === "ER_NO_REFERENCED_ROW")
reject(INVALID(`Invalid Asset`)); reject(INVALID(eCode.INVALID_TOKEN_NAME, `Invalid Asset`));
else else
reject(error); reject(error);
}); });

View File

@ -4,18 +4,24 @@ const market = require("./market");
const { const {
SIGN_EXPIRE_TIME, SIGN_EXPIRE_TIME,
MAX_SESSION_TIMEOUT, MAX_SESSION_TIMEOUT
INVALID_SERVER_MSG
} = require("./_constants")["request"]; } = require("./_constants")["request"];
const eCode = require('../docs/scripts/floExchangeAPI').errorCode;
var DB, trustedIDs, secret; //container for database var DB, trustedIDs, secret; //container for database
global.INVALID = function(message) { global.INVALID = function(ecode, message) {
if (!(this instanceof INVALID)) if (!(this instanceof INVALID))
return new INVALID(message); return new INVALID(ecode, message);
this.message = message; this.message = message;
this.ecode = ecode;
} }
INVALID.e_code = 400; INVALID.e_code = 400;
INVALID.prototype.toString = function() {
return "E" + this.ecode + ": " + this.message;
}
INVALID.str = (ecode, message) => INVALID(ecode, message).toString();
global.INTERNAL = function INTERNAL(message) { global.INTERNAL = function INTERNAL(message) {
if (!(this instanceof INTERNAL)) if (!(this instanceof INTERNAL))
@ -23,31 +29,37 @@ global.INTERNAL = function INTERNAL(message) {
this.message = message; this.message = message;
} }
INTERNAL.e_code = 500; INTERNAL.e_code = 500;
INTERNAL.prototype.toString = function() {
return "E" + eCode.INTERNAL_ERROR + ": " + this.message;
}
INTERNAL.str = (ecode, message) => INTERNAL(ecode, message).toString();
const INCORRECT_SERVER_ERROR = INVALID(eCode.INCORRECT_SERVER, "Incorrect server");
var serving; var serving;
function validateRequest(request, sign, floID, pubKey) { function validateRequest(request, sign, floID, pubKey) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!serving) if (!serving)
reject(INVALID(INVALID_SERVER_MSG)); reject(INCORRECT_SERVER_ERROR);
else if (!request.timestamp) else if (!request.timestamp)
reject(INVALID("Timestamp parameter missing")); reject(INVALID(eCode.MISSING_PARAMETER, "Timestamp parameter missing"));
else if (Date.now() - SIGN_EXPIRE_TIME > request.timestamp) else if (Date.now() - SIGN_EXPIRE_TIME > request.timestamp)
reject(INVALID("Signature Expired")); reject(INVALID(eCode.EXPIRED_SIGNATURE, "Signature Expired"));
else if (!floCrypto.validateAddr(floID)) else if (!floCrypto.validateAddr(floID))
reject(INVALID("Invalid floID")); reject(INVALID(eCode.INVALID_FLO_ID, "Invalid floID"));
else if (typeof request !== "object") else if (typeof request !== "object")
reject(INVALID("Request is not an object")); reject(INVALID(eCode.INVALID_REQUEST_FORMAT, "Request is not an object"));
else validateRequest.getSignKey(floID, pubKey).then(signKey => { else validateRequest.getSignKey(floID, pubKey).then(signKey => {
let req_str = Object.keys(request).sort().map(r => r + ":" + request[r]).join("|"); let req_str = Object.keys(request).sort().map(r => r + ":" + request[r]).join("|");
try { try {
if (!floCrypto.verifySign(req_str, sign, signKey)) if (!floCrypto.verifySign(req_str, sign, signKey))
reject(INVALID("Invalid request signature! Re-login if this error occurs frequently")); reject(INVALID(eCode.INVALID_SIGNATURE, "Invalid request signature"));
else validateRequest.checkIfSignUsed(sign) else validateRequest.checkIfSignUsed(sign)
.then(result => resolve(req_str)) .then(result => resolve(req_str))
.catch(error => reject(error)) .catch(error => reject(error))
} catch { } catch {
reject(INVALID("Corrupted sign/key")); reject(INVALID(eCode.INVALID_SIGNATURE, "Corrupted sign/key"));
} }
}).catch(error => reject(error)); }).catch(error => reject(error));
}); });
@ -57,22 +69,22 @@ validateRequest.getSignKey = (floID, pubKey) => new Promise((resolve, reject) =>
if (!pubKey) if (!pubKey)
DB.query("SELECT session_time, proxyKey FROM UserSession WHERE floID=?", [floID]).then(result => { DB.query("SELECT session_time, proxyKey FROM UserSession WHERE floID=?", [floID]).then(result => {
if (result.length < 1) if (result.length < 1)
reject(INVALID("Session not active")); reject(INVALID(eCode.SESSION_INVALID, "Session not active"));
else if (result[0].session_time + MAX_SESSION_TIMEOUT < Date.now()) else if (result[0].session_time + MAX_SESSION_TIMEOUT < Date.now())
reject(INVALID("Session Expired! Re-login required")); reject(INVALID(eCode.SESSION_EXPIRED, "Session Expired! Re-login required"));
else else
resolve(result[0].proxyKey); resolve(result[0].proxyKey);
}).catch(error => reject(error)); }).catch(error => reject(error));
else if (floCrypto.getFloID(pubKey) === floID) else if (floCrypto.getFloID(pubKey) === floID)
resolve(pubKey); resolve(pubKey);
else else
reject(INVALID("Invalid pubKey")); reject(INVALID(eCode.INVALID_PUBLIC_KEY, "Invalid pubKey"));
}); });
validateRequest.checkIfSignUsed = sign => new Promise((resolve, reject) => { validateRequest.checkIfSignUsed = sign => new Promise((resolve, reject) => {
DB.query("SELECT id FROM RequestLog WHERE sign=?", [sign]).then(result => { DB.query("SELECT id FROM RequestLog WHERE sign=?", [sign]).then(result => {
if (result.length) if (result.length)
reject(INVALID("Duplicate signature")); reject(INVALID(eCode.DUPLICATE_SIGNATURE, "Duplicate signature"));
else else
resolve(true); resolve(true);
}).catch(error => reject(error)) }).catch(error => reject(error))
@ -91,18 +103,18 @@ function processRequest(res, rText, validateObj, sign, floID, pubKey, marketFn)
res.send(result); res.send(result);
}).catch(error => { }).catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send(rText + " failed! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str(rText + " failed! Try again later!"));
} }
}) })
}).catch(error => { }).catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str("Request processing failed! Try again later!"));
} }
}) })
} }
@ -123,10 +135,10 @@ function Account(req, res) {
}); });
}).catch(error => { }).catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Request processing failed! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str("Request processing failed! Try again later!"));
} }
}); });
} }
@ -134,9 +146,9 @@ function Account(req, res) {
function Login(req, res) { function Login(req, res) {
let data = req.body; let data = req.body;
if (!data.code || data.hash != Crypto.SHA1(data.code + secret)) if (!data.code || data.hash != Crypto.SHA1(data.code + secret))
res.status(INVALID.e_code).send("Invalid Code"); res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_LOGIN_CODE, "Invalid Code"));
else if (!data.pubKey) else if (!data.pubKey)
res.status(INVALID.e_code).send("Public key missing"); res.status(INVALID.e_code).send(INVALID.str(eCode.MISSING_PARAMETER, "Public key missing"));
else else
processRequest(res, "Login", { processRequest(res, "Login", {
type: "login", type: "login",
@ -256,7 +268,7 @@ function WithdrawToken(req, res) {
function AddUserTag(req, res) { function AddUserTag(req, res) {
let data = req.body; let data = req.body;
if (!trustedIDs.includes(data.floID)) if (!trustedIDs.includes(data.floID))
res.status(INVALID.e_code).send("Access Denied"); res.status(INVALID.e_code).send(INVALID.str(eCode.ACCESS_DENIED, "Access Denied"));
else processRequest(res, "Add user-tag", { else processRequest(res, "Add user-tag", {
type: "add_tag", type: "add_tag",
user: data.user, user: data.user,
@ -270,7 +282,7 @@ function AddUserTag(req, res) {
function RemoveUserTag(req, res) { function RemoveUserTag(req, res) {
let data = req.body; let data = req.body;
if (!trustedIDs.includes(data.floID)) if (!trustedIDs.includes(data.floID))
res.status(INVALID.e_code).send("Access Denied"); res.status(INVALID.e_code).send(INVALID.str(eCode.ACCESS_DENIED, "Access Denied"));
else processRequest(res, "Remove user-tag", { else processRequest(res, "Remove user-tag", {
type: "remove_tag", type: "remove_tag",
user: data.user, user: data.user,
@ -284,7 +296,7 @@ function RemoveUserTag(req, res) {
function AddDistributor(req, res) { function AddDistributor(req, res) {
let data = req.body; let data = req.body;
if (!trustedIDs.includes(data.floID)) if (!trustedIDs.includes(data.floID))
res.status(INVALID.e_code).send("Access Denied"); res.status(INVALID.e_code).send(INVALID.str(eCode.ACCESS_DENIED, "Access Denied"));
else processRequest(res, "Add distributor", { else processRequest(res, "Add distributor", {
type: "add_distributor", type: "add_distributor",
distributor: data.distributor, distributor: data.distributor,
@ -298,7 +310,7 @@ function AddDistributor(req, res) {
function RemoveDistributor(req, res) { function RemoveDistributor(req, res) {
let data = req.body; let data = req.body;
if (!trustedIDs.includes(data.floID)) if (!trustedIDs.includes(data.floID))
res.status(INVALID.e_code).send("Access Denied"); res.status(INVALID.e_code).send(INVALID.str(eCode.ACCESS_DENIED, "Access Denied"));
else processRequest(res, "Remove distributor", { else processRequest(res, "Remove distributor", {
type: "remove_distributor", type: "remove_distributor",
distributor: data.distributor, distributor: data.distributor,
@ -313,7 +325,7 @@ function RemoveDistributor(req, res) {
function GetLoginCode(req, res) { function GetLoginCode(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let randID = floCrypto.randString(8, true) + Math.round(Date.now() / 1000); let randID = floCrypto.randString(8, true) + Math.round(Date.now() / 1000);
let hash = Crypto.SHA1(randID + secret); let hash = Crypto.SHA1(randID + secret);
@ -326,11 +338,11 @@ function GetLoginCode(req, res) {
function ListSellOrders(req, res) { function ListSellOrders(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let asset = req.query.asset; let asset = req.query.asset;
if (asset && !market.assetList.includes(asset)) if (asset && !market.assetList.includes(asset))
res.status(INVALID.e_code).send("Invalid asset parameter"); res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_TOKEN_NAME, "Invalid asset parameter"));
else else
DB.query("SELECT SellOrder.floID, SellOrder.asset, SellOrder.minPrice, SellOrder.quantity, SellOrder.time_placed FROM SellOrder" + DB.query("SELECT SellOrder.floID, SellOrder.asset, SellOrder.minPrice, SellOrder.quantity, SellOrder.time_placed FROM SellOrder" +
" INNER JOIN UserBalance ON UserBalance.floID = SellOrder.floID AND UserBalance.token = SellOrder.asset" + " INNER JOIN UserBalance ON UserBalance.floID = SellOrder.floID AND UserBalance.token = SellOrder.asset" +
@ -345,7 +357,7 @@ function ListSellOrders(req, res) {
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Try again later!") res.status(INTERNAL.e_code).send(INTERNAL.str("Try again later!"));
}); });
} }
@ -353,11 +365,11 @@ function ListSellOrders(req, res) {
function ListBuyOrders(req, res) { function ListBuyOrders(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let asset = req.query.asset; let asset = req.query.asset;
if (asset && !market.assetList.includes(asset)) if (asset && !market.assetList.includes(asset))
res.status(INVALID.e_code).send("Invalid asset parameter"); res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_TOKEN_NAME, "Invalid asset parameter"));
else else
DB.query("SELECT BuyOrder.floID, BuyOrder.asset, BuyOrder.maxPrice, BuyOrder.quantity, BuyOrder.time_placed FROM BuyOrder" + DB.query("SELECT BuyOrder.floID, BuyOrder.asset, BuyOrder.maxPrice, BuyOrder.quantity, BuyOrder.time_placed FROM BuyOrder" +
" INNER JOIN UserBalance ON UserBalance.floID = BuyOrder.floID AND UserBalance.token = ?" + " INNER JOIN UserBalance ON UserBalance.floID = BuyOrder.floID AND UserBalance.token = ?" +
@ -371,18 +383,18 @@ function ListBuyOrders(req, res) {
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Try again later!") res.status(INTERNAL.e_code).send(INTERNAL.str("Try again later!"));
}); });
} }
} }
function ListTradeTransactions(req, res) { function ListTradeTransactions(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let asset = req.query.asset; let asset = req.query.asset;
if (asset && !market.assetList.includes(asset)) if (asset && !market.assetList.includes(asset))
res.status(INVALID.e_code).send("Invalid asset parameter"); res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_TOKEN_NAME, "Invalid asset parameter"));
else else
DB.query("SELECT * FROM TradeTransactions" + DB.query("SELECT * FROM TradeTransactions" +
(asset ? " WHERE asset = ?" : "") + (asset ? " WHERE asset = ?" : "") +
@ -390,14 +402,14 @@ function ListTradeTransactions(req, res) {
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Try again later!") res.status(INTERNAL.e_code).send(INTERNAL.str("Try again later!"));
}); });
} }
} }
function GetRates(req, res) { function GetRates(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let asset = req.query.asset, let asset = req.query.asset,
rates = market.rates, rates = market.rates,
@ -410,7 +422,7 @@ function GetRates(req, res) {
countDown: countDown[asset] countDown: countDown[asset]
}); });
else else
res.status(INVALID.e_code).send("Invalid asset parameter"); res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_TOKEN_NAME, "Invalid asset parameter"));
} else } else
res.send({ res.send({
rates, rates,
@ -421,7 +433,7 @@ function GetRates(req, res) {
function GetRateHistory(req, res) { function GetRateHistory(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let asset = req.query.asset, let asset = req.query.asset,
duration = req.query.duration || ""; duration = req.query.duration || "";
@ -429,10 +441,10 @@ function GetRateHistory(req, res) {
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Unable to process! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str("Unable to process! Try again later!"));
} }
}); });
} }
@ -440,19 +452,19 @@ function GetRateHistory(req, res) {
function GetTransaction(req, res) { function GetTransaction(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let txid = req.query.txid; let txid = req.query.txid;
if (!txid) if (!txid)
res.status(INVALID.e_code).send("txid (transactionID) parameter missing"); res.status(INVALID.e_code).send(INVALID.str(eCode.MISSING_PARAMETER, "txid (transactionID) parameter missing"));
else market.getTransactionDetails(txid) else market.getTransactionDetails(txid)
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Unable to process! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str("Unable to process! Try again later!"));
} }
}); });
} }
@ -460,7 +472,7 @@ function GetTransaction(req, res) {
function GetBalance(req, res) { function GetBalance(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INCORRECT_SERVER_ERROR.toString());
else { else {
let floID = req.query.floID || req.query.addr, let floID = req.query.floID || req.query.addr,
token = req.query.token || req.query.asset; token = req.query.token || req.query.asset;
@ -468,10 +480,10 @@ function GetBalance(req, res) {
.then(result => res.send(result)) .then(result => res.send(result))
.catch(error => { .catch(error => {
if (error instanceof INVALID) if (error instanceof INVALID)
res.status(INVALID.e_code).send(error.message); res.status(INVALID.e_code).send(error.toString());
else { else {
console.error(error); console.error(error);
res.status(INTERNAL.e_code).send("Unable to process! Try again later!"); res.status(INTERNAL.e_code).send(INTERNAL.str("Unable to process! Try again later!"));
} }
}); });
} }