diff --git a/src/group.js b/src/group.js index f1ea62b..859007e 100644 --- a/src/group.js +++ b/src/group.js @@ -17,14 +17,19 @@ function getBestPairs(currentRate) { return new Promise((resolve, reject) => { DB.query("SELECT tag, sellPriority, buyPriority FROM TagList").then(result => { //Sorted in Ascending (ie, stack; pop for highest) - let tags_buy = result.sort((a, b) => a.buyPriority > b.buyPriority).map(r => r.tag); - let tags_sell = result.sort((a, b) => a.sellPriority > b.sellPriority).map(r => r.tag); + let tags_buy = result.sort((a, b) => a.buyPriority > b.buyPriority ? 1 : -1).map(r => r.tag); + let tags_sell = result.sort((a, b) => a.sellPriority > b.sellPriority ? 1 : -1).map(r => r.tag); resolve(new bestPair(currentRate, tags_buy, tags_sell)); }).catch(error => reject(error)) }) } -const bestPair = function(currentRate, tags_buy, tags_sell) { +const bestPair = function(cur_rate, tags_buy, tags_sell) { + const currentRate = cur_rate; + + Object.defineProperty(this, 'cur_rate', { + get: () => currentRate + }); this.get = () => new Promise((resolve, reject) => { Promise.all([getBuyOrder(), getSellOrder()]).then(results => { @@ -92,6 +97,7 @@ const bestPair = function(currentRate, tags_buy, tags_sell) { } else if (!cache.end) { //Un-tagged floID's orders (do only once) getUntaggedSellOrders(currentRate).then(orders => { cache.orders = orders; + cache.cur_tag = null; cache.end = true; getSellOrder() .then(result => resolve(result)) @@ -100,7 +106,7 @@ const bestPair = function(currentRate, tags_buy, tags_sell) { } else reject(false); }); - getSeller.cache = { + getSellOrder.cache = { tags: tags_sell }; @@ -143,6 +149,7 @@ const bestPair = function(currentRate, tags_buy, tags_sell) { } else if (!cache.end) { //Un-tagged floID's orders (do only once) getUntaggedBuyOrders(currentRate).then(orders => { cache.orders = orders; + cache.cur_tag = null; cache.end = true; getBuyOrder() .then(result => resolve(result)) @@ -160,7 +167,7 @@ function getUntaggedSellOrders(cur_price) { return new Promise((resolve, reject) => { DB.query("SELECT SellOrder.id, SellOrder.floID, SellOrder.quantity FROM SellOrder" + " LEFT JOIN Tags ON Tags.floID = SellOrder.floID" + - " WHERE Tags.floID IS NULL AND SellOrder.minPrice <=? ORDER BY SellOrder.time_placed", [cur_price]) + " WHERE Tags.floID IS NULL AND SellOrder.minPrice <=? ORDER BY SellOrder.time_placed DESC", [cur_price]) .then(orders => resolve(orders)) .catch(error => reject(error)) }) @@ -170,7 +177,7 @@ function getUntaggedBuyOrders(cur_price) { return new Promise((resolve, reject) => { DB.query("SELECT BuyOrder.id, BuyOrder.floID, BuyOrder.quantity FROM BuyOrder" + " LEFT JOIN Tags ON Tags.floID = BuyOrder.floID" + - " WHERE Tags.floID IS NULL AND BuyOrder.maxPrice >=? ORDER BY BuyOrder.time_placed", [cur_price]) + " WHERE Tags.floID IS NULL AND BuyOrder.maxPrice >=? ORDER BY BuyOrder.time_placed DESC", [cur_price]) .then(orders => resolve(orders)) .catch(error => reject(error)) }) @@ -180,13 +187,13 @@ function getSellOrdersInTag(tag, cur_price) { return new Promise((resolve, reject) => { DB.query("SELECT SellOrder.id, SellOrder.floID, SellOrder.quantity FROM SellOrder" + " INNER JOIN Tags ON Tags.floID = SellOrder.floID" + - " WHERE Tags.tag = ? AND SellOrder.minPrice <=? ORDER BY SellOrder.time_placed", [tag, cur_price]).then(orders => { + " WHERE Tags.tag = ? AND SellOrder.minPrice <=? ORDER BY SellOrder.time_placed DESC", [tag, cur_price]).then(orders => { if (orders.length <= 1) // No (or) Only-one order, hence priority sort not required. resolve(orders); else - getPointsFromAPI(orders.map(o => o.floID)).then(points => { + getPointsFromAPI(tag, orders.map(o => o.floID)).then(points => { let orders_sorted = orders.map(o => [o, points[o.floID]]) - .sort((a, b) => a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0) //sort by points (ascending) + .sort((a, b) => a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0) //sort by points (ascending) .map(x => x[0]); resolve(orders_sorted); }).catch(error => reject(error)) @@ -198,13 +205,13 @@ function getBuyOrdersInTag(tag, cur_price) { return new Promise((resolve, reject) => { DB.query("SELECT BuyOrder.id, BuyOrder.floID, BuyOrder.quantity FROM BuyOrder" + " INNER JOIN Tags ON Tags.floID = BuyOrder.floID" + - " WHERE Tags.tag = ? AND BuyOrder.maxPrice >=? ORDER BY BuyOrder.time_placed", [tag, cur_price]).then(orders => { + " WHERE Tags.tag = ? AND BuyOrder.maxPrice >=? ORDER BY BuyOrder.time_placed DESC", [tag, cur_price]).then(orders => { if (orders.length <= 1) // No (or) Only-one order, hence priority sort not required. resolve(orders); else - getPointsFromAPI(orders.map(o => o.floID)).then(points => { + getPointsFromAPI(tag, orders.map(o => o.floID)).then(points => { let orders_sorted = orders.map(o => [o, points[o.floID]]) - .sort((a, b) => a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0) //sort by points (ascending) + .sort((a, b) => a[1] > b[1] ? -1 : a[1] < b[1] ? 1 : 0) //sort by points (ascending) .map(x => x[0]); resolve(orders_sorted); }).catch(error => reject(error)) @@ -212,7 +219,7 @@ function getBuyOrdersInTag(tag, cur_price) { }); } -function getPointsFromAPI(floIDs) { +function getPointsFromAPI(tag, floIDs) { floIDs = Array.from(new Set(floIDs)); return new Promise((resolve, reject) => { DB.query("SELECT api FROM TagList WHERE tag=?", [tag]).then(result => { @@ -221,7 +228,7 @@ function getPointsFromAPI(floIDs) { let points = {}; for (let i in result) if (result[i].status === "fulfilled") - points[floIDs[i]] = result[i]; + points[floIDs[i]] = result[i].value; resolve(points); }).catch(error => reject(error)) }).catch(error => reject(error)) @@ -231,6 +238,15 @@ function getPointsFromAPI(floIDs) { function fetch_api(api, id) { return new Promise((resolve, reject) => { //TODO: fetch data from API + let url = api.replace('', id); + global.fetch(url).then(response => { + if (response.ok) + response.text() + .then(result => resolve(result)) + .catch(error => reject(error)) + else + reject(response); + }).catch(error => reject(error)) }) } @@ -282,7 +298,6 @@ function verifySellOrder(sellOrder, cur_price) { resolve(sellOrder); }).catch(error => reject(error)); }) - } function getTopValidBuyOrder(orders, cur_price) { diff --git a/src/market.js b/src/market.js index 70150d8..ffcbf97 100644 --- a/src/market.js +++ b/src/market.js @@ -171,16 +171,17 @@ function cancelOrder(type, id, floID) { } function initiateCoupling() { - group.getBestPairs() + group.getBestPairs(net_FLO_price) .then(bestPairQueue => processCoupling(bestPairQueue)) - .catch(error => reject(error)) + .catch(error => console.error("initiateCoupling", error)) } function processCoupling(bestPairQueue) { bestPairQueue.get().then(result => { let buyer_best = result.buyOrder, seller_best = result.sellOrder; - console.debug("Sell:", seller_best.id, "Buy:", buyer_best.id); + console.debug("Sell:", seller_best); + console.debug("Buy:", buyer_best); spendFLO(buyer_best, seller_best).then(txQueries => { //process the Txn var tx_quantity; @@ -190,7 +191,7 @@ function processCoupling(bestPairQueue) { tx_quantity = processSellOrder(seller_best, buyer_best, txQueries); else tx_quantity = processBuyAndSellOrder(seller_best, buyer_best, txQueries); - updateBalance(seller_best, buyer_best, txQueries, cur_price, tx_quantity); + updateBalance(seller_best, buyer_best, txQueries, bestPairQueue.cur_rate, tx_quantity); //process txn query in SQL DB.transaction(txQueries).then(results => { bestPairQueue.next(); @@ -199,7 +200,12 @@ function processCoupling(bestPairQueue) { processCoupling(bestPairQueue); }).catch(error => console.error(error)); }).catch(error => console.error(error)); - }).catch(error => console.error(error)); + }).catch(error => { + if (error !== false) + console.error(error); + else + console.log("No valid orders."); + }); } function spendFLO(buyOrder, sellOrder) {