From d5591189eb04b91a7642f72034b2751a071baae5 Mon Sep 17 00:00:00 2001 From: michielmulders Date: Thu, 2 Nov 2017 19:46:47 +0100 Subject: [PATCH 1/3] Added Utility method for topological sort --- package.json | 1 + src/transaction/utils/topologySorting.js | 26 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/transaction/utils/topologySorting.js diff --git a/package.json b/package.json index 20dfb87a..4bd1a804 100644 --- a/package.json +++ b/package.json @@ -75,6 +75,7 @@ "json-stable-stringify": "^1.0.1", "query-string": "^5.0.0", "sprintf-js": "^1.0.3", + "toposort": "^1.0.6", "tweetnacl": "^1.0.0" }, "keywords": [ diff --git a/src/transaction/utils/topologySorting.js b/src/transaction/utils/topologySorting.js new file mode 100644 index 00000000..b65b37aa --- /dev/null +++ b/src/transaction/utils/topologySorting.js @@ -0,0 +1,26 @@ +import toposort from 'toposort' + +function generateGraph(txs) { + const graph = [] + for (var tx of txs) { + for (var input of tx.inputs) { + if (!!input.fulfills) { + graph.push([tx.id, input.fulfills.transaction_id]) + } + } + } + return graph +} + + +/** + * @public + * Topological sort algorithm for transactions + * Used for endpoint: /transactions?assetId + * @param {object} txs Array of transactions + * @returns {object} Returns transactions in order of dependency + */ +export default function topsortTransactions(txs) { + const graph = generateGraph(txs) + return toposort(graph).reverse() +} From 7878c02e970c17d590d578d63aeb9562f40a9c88 Mon Sep 17 00:00:00 2001 From: michielmulders Date: Thu, 2 Nov 2017 19:57:29 +0100 Subject: [PATCH 2/3] small fix --- src/transaction/utils/topologySorting.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/transaction/utils/topologySorting.js b/src/transaction/utils/topologySorting.js index b65b37aa..c8f45153 100644 --- a/src/transaction/utils/topologySorting.js +++ b/src/transaction/utils/topologySorting.js @@ -2,8 +2,8 @@ import toposort from 'toposort' function generateGraph(txs) { const graph = [] - for (var tx of txs) { - for (var input of tx.inputs) { + for (const tx of txs) { + for (const input of tx.inputs) { if (!!input.fulfills) { graph.push([tx.id, input.fulfills.transaction_id]) } From c6cb3e82834e32a84526b7e11dd627d1ece1f44c Mon Sep 17 00:00:00 2001 From: michielmulders Date: Thu, 2 Nov 2017 20:09:33 +0100 Subject: [PATCH 3/3] ESLint fixes --- src/transaction/utils/topologySorting.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/transaction/utils/topologySorting.js b/src/transaction/utils/topologySorting.js index c8f45153..54085e97 100644 --- a/src/transaction/utils/topologySorting.js +++ b/src/transaction/utils/topologySorting.js @@ -2,13 +2,14 @@ import toposort from 'toposort' function generateGraph(txs) { const graph = [] - for (const tx of txs) { - for (const input of tx.inputs) { - if (!!input.fulfills) { + txs.forEach(tx => { + tx.inputs.forEach(input => { + if (input.fulfills) { graph.push([tx.id, input.fulfills.transaction_id]) } - } - } + }) + }) + return graph }