Multi-asset price.js

This commit is contained in:
sairajzero 2022-02-03 05:46:26 +05:30
parent 67c31d79a9
commit dbad25044a
3 changed files with 50 additions and 46 deletions

View File

@ -444,8 +444,8 @@ function blockchainReCheck() {
} }
module.exports = { module.exports = {
get rate() { get rates() {
return coupling.price.currentRate; return coupling.price.currentRates;
}, },
addBuyOrder, addBuyOrder,
addSellOrder, addSellOrder,

View File

@ -10,37 +10,41 @@ const MIN_TIME = 10 * 1000, // 1 * 60 * 60 * 1000,
var DB; //container for database var DB; //container for database
var cur_rate, //container for FLO price (from API or by model) var cur_rate = {}, //container for FLO price (from API or by model)
lastTime = Date.now(), //container for timestamp of the last tx lastTime = {}, //container for timestamp of the last tx
noBuyOrder, noBuyOrder = {},
noSellOrder; noSellOrder = {};
const updateLastTime = () => lastTime = Date.now(); const updateLastTime = asset => lastTime[asset] = Date.now();
//store FLO price in DB every 1 hr //store FLO price in DB every 1 hr
function storeRate(rate = cur_rate) { function storeRate(asset, rate) {
DB.query("INSERT INTO priceHistory (rate) VALUE (?)", rate) DB.query("INSERT INTO priceHistory (asset, rate) VALUE (?, ?)", [asset, rate])
.then(_ => null).catch(error => console.error(error)) .then(_ => null).catch(error => console.error(error))
} }
setInterval(storeRate, REC_HISTORY_INTERVAL) setInterval(() => {
for (let asset in cur_rate)
storeRate(asset, cur_rate[asset]);
}, REC_HISTORY_INTERVAL)
function getPastRate(hrs = 24) { function getPastRate(asset, hrs = 24) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
DB.query("SELECT rate FROM priceHistory WHERE rec_time >= NOW() - INTERVAL ? hour ORDER BY rec_time LIMIT 1", [hrs]) DB.query("SELECT rate FROM priceHistory WHERE asset=? AND rec_time >= NOW() - INTERVAL ? hour ORDER BY rec_time LIMIT 1", [asset, hrs])
.then(result => result.length ? resolve(result[0].rate) : reject('No records found in past 24hrs')) .then(result => result.length ? resolve(result[0].rate) : reject('No records found in past 24hrs'))
.catch(error => reject(error)) .catch(error => reject(error))
}); });
} }
function loadRate() { function loadRate(asset) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (typeof cur_rate !== "undefined") if (typeof cur_rate[asset] !== "undefined")
return resolve(cur_rate); return resolve(cur_rate[asset]);
DB.query("SELECT rate FROM priceHistory ORDER BY rec_time DESC LIMIT 1").then(result => { updateLastTime(asset);
DB.query("SELECT rate FROM priceHistory WHERE asset=? ORDER BY rec_time DESC LIMIT 1", [asset]).then(result => {
if (result.length) if (result.length)
resolve(cur_rate = result[0].rate); resolve(cur_rate[asset] = result[0].rate);
else else
fetchRates().then(rate => resolve(cur_rate = rate)).catch(error => reject(error)); fetchRates().then(rate => resolve(cur_rate[asset] = rate)).catch(error => reject(error));
}).catch(error => reject(error)); }).catch(error => reject(error));
}) })
} }
@ -84,50 +88,50 @@ fetchRates.USD_INR = function() {
}); });
} }
function getRates() { function getRates(asset) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
loadRate().then(_ => { loadRate(asset).then(_ => {
console.debug(cur_rate); console.debug(cur_rate[asset]);
let cur_time = Date.now(); let cur_time = Date.now();
if (cur_time - lastTime < MIN_TIME) //Minimum time to update not crossed: No update required if (cur_time - lastTime[asset] < MIN_TIME) //Minimum time to update not crossed: No update required
resolve(cur_rate); resolve(cur_rate[asset]);
else if (noBuyOrder && noSellOrder) //Both are not available: No update required else if (noBuyOrder[asset] && noSellOrder[asset]) //Both are not available: No update required
resolve(cur_rate); resolve(cur_rate[asset]);
else if (noBuyOrder === null || noSellOrder === null) //An error has occured during last process: No update (might cause price to crash/jump) else if (noBuyOrder[asset] === null || noSellOrder[asset] === null) //An error has occured during last process: No update (might cause price to crash/jump)
resolve(cur_rate); resolve(cur_rate[asset]);
else else
getPastRate().then(ratePast24hr => { getPastRate(asset).then(ratePast24hr => {
if (noBuyOrder) { if (noBuyOrder[asset]) {
//No Buy, But Sell available: Decrease the price //No Buy, But Sell available: Decrease the price
let tmp_val = cur_rate * (1 - DOWN_RATE); let tmp_val = cur_rate[asset] * (1 - DOWN_RATE);
if (tmp_val >= ratePast24hr * (1 - MAX_DOWN_PER_DAY)) { if (tmp_val >= ratePast24hr * (1 - MAX_DOWN_PER_DAY)) {
cur_rate = tmp_val; cur_rate[asset] = tmp_val;
updateLastTime(); updateLastTime(asset);
} else } else
console.debug("Max Price down for the day has reached"); console.debug("Max Price down for the day has reached");
resolve(cur_rate); resolve(cur_rate[asset]);
} else if (noSellOrder) { } else if (noSellOrder[asset]) {
//No Sell, But Buy available: Increase the price //No Sell, But Buy available: Increase the price
checkForRatedSellers().then(result => { checkForRatedSellers().then(result => {
if (result) { if (result) {
let tmp_val = cur_rate * (1 + UP_RATE); let tmp_val = cur_rate[asset] * (1 + UP_RATE);
if (tmp_val <= ratePast24hr * (1 + MAX_UP_PER_DAY)) { if (tmp_val <= ratePast24hr * (1 + MAX_UP_PER_DAY)) {
cur_rate = tmp_val; cur_rate[asset] = tmp_val;
updateLastTime(); updateLastTime(asset);
} else } else
console.debug("Max Price up for the day has reached"); console.debug("Max Price up for the day has reached");
} }
}).catch(error => console.error(error)).finally(_ => resolve(cur_rate)); }).catch(error => console.error(error)).finally(_ => resolve(cur_rate[asset]));
} }
}).catch(error => { }).catch(error => {
console.error(error); console.error(error);
resolve(cur_rate); resolve(cur_rate[asset]);
}); });
}).catch(error => reject(error)); }).catch(error => reject(error));
}) })
} }
function checkForRatedSellers() { function checkForRatedSellers(asset) {
//Check if there are best rated sellers? //Check if there are best rated sellers?
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
DB.query("SELECT MAX(sellPriority) as max_p FROM TagList").then(result => { DB.query("SELECT MAX(sellPriority) as max_p FROM TagList").then(result => {
@ -144,14 +148,14 @@ function checkForRatedSellers() {
module.exports = { module.exports = {
getRates, getRates,
updateLastTime, updateLastTime,
noOrder(buy, sell) { noOrder(asset, buy, sell) {
noBuyOrder = buy; noBuyOrder[asset] = buy;
noSellOrder = sell; noSellOrder[asset] = sell;
}, },
set DB(db) { set DB(db) {
DB = db; DB = db;
}, },
get currentRate() { get currentRates() {
return cur_rate return Object.assign({}, cur_rate);
} }
} }

View File

@ -272,7 +272,7 @@ function getRate(req, res) {
if (!serving) if (!serving)
res.status(INVALID.e_code).send(INVALID_SERVER_MSG); res.status(INVALID.e_code).send(INVALID_SERVER_MSG);
else else
res.send(`${market.rate}`); res.send(`${market.rates}`);
} }
function Account(req, res) { function Account(req, res) {