From 506087e85651c71bd3191d51a4b1e807381648d9 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Wed, 16 Nov 2022 21:57:10 +0530 Subject: [PATCH] Bug fixes - Fixed: get-sink, generate-sink, reshare-sink, discard-sink API not working - Fixed: API not working - Fixed: SQL syntax in to_refund_sql in verifyConvert for timeout requests - Fixed: key management init not invoked - Fixed: Minor bug in getConvertValues. Also, have null value if not available. - Added console.debug to rejected promise (SQL write) on readDataFromBlockchain in Blockchain bonds and Bob's fund --- docs/scripts/floExchangeAPI.js | 171 +++++++++++++++++---------------- src/app.js | 2 +- src/background.js | 2 +- src/main.js | 15 +-- src/request.js | 17 ++-- src/services/bobs-fund.js | 5 +- src/services/bonds.js | 5 +- src/services/conversion.js | 10 +- 8 files changed, 120 insertions(+), 107 deletions(-) diff --git a/docs/scripts/floExchangeAPI.js b/docs/scripts/floExchangeAPI.js index 5730ba1..06028e8 100644 --- a/docs/scripts/floExchangeAPI.js +++ b/docs/scripts/floExchangeAPI.js @@ -610,7 +610,7 @@ exchangeAPI.getSink = function (service = serviceList.EXCHANGE) { return new Promise((resolve, reject) => { - if (!(service in serviceList)) + if (!(Object.values(serviceList).includes(service))) return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, 'service required', errorCode.INVALID_VALUE)); fetch_api('/get-sink?service=' + service) .then(result => { @@ -1559,96 +1559,103 @@ } exchangeAPI.generateSink = function (group, floID, privKey) { - if (!floCrypto.verifyPrivKey(privKey, floID)) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); - if (floID !== DEFAULT.marketID) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); - let request = { - floID: floID, - group: group, - timestamp: Date.now() - }; - request.pubKey = floCrypto.getPubKeyHex(privKey); - request.sign = signRequest({ - type: "generate_sink", - group: group, - timestamp: request.timestamp - }, privKey); - console.debug(request); + return new Promise((resolve, reject) => { + if (!floCrypto.verifyPrivKey(privKey, floID)) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); + if (floID !== DEFAULT.marketID) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); + let request = { + floID: floID, + group: group, + timestamp: Date.now() + }; + request.pubKey = floCrypto.getPubKeyHex(privKey); + request.sign = signRequest({ + type: "generate_sink", + group: group, + timestamp: request.timestamp + }, privKey); + console.debug(request); - fetch_api('/generate-sink', { - method: "POST", - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(request) - }).then(result => { - responseParse(result, false) - .then(result => resolve(result)) - .catch(error => reject(error)) - }).catch(error => reject(error)) + fetch_api('/generate-sink', { + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(request) + }).then(result => { + responseParse(result, false) + .then(result => resolve(result)) + .catch(error => reject(error)) + }).catch(error => reject(error)) + }) } exchangeAPI.reshareSink = function (sinkID, floID, privKey) { - if (!floCrypto.verifyPrivKey(privKey, floID)) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); - if (floID !== DEFAULT.marketID) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); - let request = { - floID: floID, - id: sinkID, - timestamp: Date.now() - }; - request.pubKey = floCrypto.getPubKeyHex(privKey); - request.sign = signRequest({ - type: "reshare_sink", - id: sinkID, - timestamp: request.timestamp - }, privKey); - console.debug(request); + return new Promise((resolve, reject) => { + if (!floCrypto.verifyPrivKey(privKey, floID)) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); + if (floID !== DEFAULT.marketID) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); + let request = { + floID: floID, + id: sinkID, + timestamp: Date.now() + }; + request.pubKey = floCrypto.getPubKeyHex(privKey); + request.sign = signRequest({ + type: "reshare_sink", + id: sinkID, + timestamp: request.timestamp + }, privKey); + console.debug(request); - fetch_api('/reshare-sink', { - method: "POST", - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(request) - }).then(result => { - responseParse(result, false) - .then(result => resolve(result)) - .catch(error => reject(error)) - }).catch(error => reject(error)) + fetch_api('/reshare-sink', { + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(request) + }).then(result => { + responseParse(result, false) + .then(result => resolve(result)) + .catch(error => reject(error)) + }).catch(error => reject(error)) + }) } exchangeAPI.discardSink = function (sinkID, floID, privKey) { - if (!floCrypto.verifyPrivKey(privKey, floID)) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); - if (floID !== DEFAULT.marketID) - return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); - let request = { - floID: floID, - id: sinkID, - timestamp: Date.now() - }; - request.pubKey = floCrypto.getPubKeyHex(privKey); - request.sign = signRequest({ - type: "discard_sink", - id: sinkID, - timestamp: request.timestamp - }, privKey); - console.debug(request); + return new Promise((resolve, reject) => { + if (!floCrypto.verifyPrivKey(privKey, floID)) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Invalid Private Key", errorCode.INVALID_PRIVATE_KEY)); + if (floID !== DEFAULT.marketID) + return reject(ExchangeError(ExchangeError.BAD_REQUEST_CODE, "Access Denied", errorCode.ACCESS_DENIED)); + let request = { + floID: floID, + id: sinkID, + timestamp: Date.now() + }; + request.pubKey = floCrypto.getPubKeyHex(privKey); + request.sign = signRequest({ + type: "discard_sink", + id: sinkID, + timestamp: request.timestamp + }, privKey); + console.debug(request); + + fetch_api('/discard-sink', { + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(request) + }).then(result => { + responseParse(result, false) + .then(result => resolve(result)) + .catch(error => reject(error)) + }).catch(error => reject(error)) + }) - fetch_api('/discard-sink', { - method: "POST", - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(request) - }).then(result => { - responseParse(result, false) - .then(result => resolve(result)) - .catch(error => reject(error)) - }).catch(error => reject(error)) } exchangeAPI.init = function refreshDataFromBlockchain() { diff --git a/src/app.js b/src/app.js index 7b6b948..c844164 100644 --- a/src/app.js +++ b/src/app.js @@ -90,7 +90,7 @@ module.exports = function App(secret) { //generate or discard sinks (admin only) app.post('/generate-sink', Request.GenerateSink); - app.post('/reshare-sink', Request.DiscardSink); + app.post('/reshare-sink', Request.ReshareSink); app.post('/discard-sink', Request.DiscardSink); //convert from or to coin diff --git a/src/background.js b/src/background.js index 8b264ca..cd26f53 100644 --- a/src/background.js +++ b/src/background.js @@ -221,7 +221,7 @@ function verifyConvert() { //Set all timeout convert request to refund mode (thus, asset will be refund if tx gets confirmed later) let req_timeout = new Date(Date.now() - REQUEST_TIMEOUT), to_refund_sql = "INSERT INTO RefundConvert (floID, in_txid, asset_type, asset, r_status)" + - " SELECT floID, in_txid, ? AS asset_type, ? AS asset, r_status" + + " SELECT floID, in_txid, ? AS asset_type, ? AS asset, r_status FROM DirectConvert" + " WHERE r_status=? AND locktime { - app = new App(config['secret']); - refreshData(true).then(_ => { - app.start(config['port']).then(result => { - console.log(result); - backup.init(app); - setInterval(refreshData, BLOCKCHAIN_REFRESH_INTERVAL) + keys.init().then(result => { + console.log(result); + app = new App(config['secret']); + refreshData(true).then(_ => { + app.start(config['port']).then(result => { + console.log(result); + backup.init(app); + setInterval(refreshData, BLOCKCHAIN_REFRESH_INTERVAL) + }).catch(error => console.error(error)) }).catch(error => console.error(error)) }).catch(error => console.error(error)) }).catch(error => console.error(error)); diff --git a/src/request.js b/src/request.js index 9b72d7c..9ed2316 100644 --- a/src/request.js +++ b/src/request.js @@ -318,11 +318,12 @@ function GenerateSink(req, res) { type: "generate_sink", group: data.group, timestamp: data.timestamp - }, () => sink.generate(group)); + }, () => sink.generate(data.group)); } function ReshareSink(req, res) { let data = req.body; + console.debug(data) if (data.floID !== floGlobals.adminID) res.status(INVALID.e_code).send(INVALID.str(eCode.ACCESS_DENIED, "Access Denied")); else if (!data.pubKey) @@ -333,7 +334,7 @@ function ReshareSink(req, res) { type: "reshare_sink", id: data.id, timestamp: data.timestamp - }, () => sink.reshare(id)); + }, () => sink.reshare(data.id)); } function DiscardSink(req, res) { @@ -346,7 +347,7 @@ function DiscardSink(req, res) { type: "discard_sink", id: data.id, timestamp: data.timestamp - }, () => sink.discard(id)); + }, () => sink.discard(data.id)); } function ConvertTo(req, res) { @@ -559,15 +560,15 @@ function GetSink(req, res) { let service = req.query.service; if (!service) res.status(INVALID.e_code).send(INVALID.str(eCode.MISSING_PARAMETER, "Missing service parameter")); - else if (!(service in serviceList)) + else if (!(Object.values(serviceList).includes(service))) res.status(INVALID.e_code).send(INVALID.str(eCode.INVALID_VALUE, "Invalid service parameter")); else { let group; switch (service) { - case serviceList[EXCHANGE]: group = keys.sink_groups.EXCHANGE; break; - case serviceList[CONVERT]: group = keys.sink_groups.CONVERT; break; - case serviceList[BLOCKCHAIN_BOND]: group = keys.sink_groups.BLOCKCHAIN_BONDS; break; - case serviceList[BOBS_FUND]: group = keys.sink_groups.BOBS_FUND; break; + case serviceList.EXCHANGE: group = keys.sink_groups.EXCHANGE; break; + case serviceList.CONVERT: group = keys.sink_groups.CONVERT; break; + case serviceList.BLOCKCHAIN_BOND: group = keys.sink_groups.BLOCKCHAIN_BONDS; break; + case serviceList.BOBS_FUND: group = keys.sink_groups.BOBS_FUND; break; } res.send(keys.sink_chest.active_pick(group)); } diff --git a/src/services/bobs-fund.js b/src/services/bobs-fund.js index 23f4eb9..85ed663 100644 --- a/src/services/bobs-fund.js +++ b/src/services/bobs-fund.js @@ -237,9 +237,10 @@ function refreshBlockchainData(nodeList = []) { } }); Promise.allSettled(promises).then(results => { - //console.debug(results.filter(r => r.status === "rejected")); - if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) + if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) { + console.debug(results.filter(r => r.status === "rejected")); reject("Some fund data might not have been saved in database correctly"); + } else DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[bobsFund.config.adminID, result.totalTxs], result.totalTxs]) .then(_ => resolve(result.totalTxs)) diff --git a/src/services/bonds.js b/src/services/bonds.js index 5d41041..c5a8e28 100644 --- a/src/services/bonds.js +++ b/src/services/bonds.js @@ -206,9 +206,10 @@ function refreshBlockchainData(nodeList = []) { } }); Promise.allSettled(promises).then(results => { - //console.debug(results.filter(r => r.status === "rejected")); - if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) + if (results.reduce((a, r) => r.status === "rejected" ? ++a : a, 0)) { reject("Some bond data might not have been saved in database correctly"); + console.debug(results.filter(r => r.status === "rejected")); + } else DB.query("INSERT INTO LastTx (floID, num) VALUE (?) ON DUPLICATE KEY UPDATE num=?", [[blockchainBond.config.adminID, result.totalTxs], result.totalTxs]) .then(_ => resolve(result.totalTxs)) diff --git a/src/services/conversion.js b/src/services/conversion.js index 41c8605..bbc3538 100644 --- a/src/services/conversion.js +++ b/src/services/conversion.js @@ -114,16 +114,16 @@ function getConvertValues() { result[pCode.CONVERT_MODE_GET] = { min: 0 }; result[pCode.CONVERT_MODE_GET].max = (!TO_MAX_VALUE || TO_MIN_VALUE >= coin_availability) ? coin_availability : TO_MAX_VALUE; } - } + } else result[pCode.CONVERT_MODE_GET] = null; if (avail.cash > 0) { let cash_availability = avail.cash / avail.rate; //convert to coin value if (Array.isArray(FROM_FIXED_VALUES) && FROM_FIXED_VALUES.length) - result[pCode.CONVERT_MODE_GET] = FROM_FIXED_VALUES.filter(a => a < cash_availability); + result[pCode.CONVERT_MODE_PUT] = FROM_FIXED_VALUES.filter(a => a < cash_availability); else if (!FROM_MIN_VALUE || FROM_MIN_VALUE <= cash_availability) { - result[pCode.CONVERT_MODE_GET] = { min: 0 }; - result[pCode.CONVERT_MODE_GET].max = (!FROM_MAX_VALUE || FROM_MIN_VALUE >= cash_availability) ? cash_availability : FROM_MAX_VALUE; + result[pCode.CONVERT_MODE_PUT] = { min: 0 }; + result[pCode.CONVERT_MODE_PUT].max = (!FROM_MAX_VALUE || FROM_MIN_VALUE >= cash_availability) ? cash_availability : FROM_MAX_VALUE; } - } + } else result[pCode.CONVERT_MODE_PUT] = null; resolve(result) }).catch(error => reject(error)) })