From ea2b712dbb644863af461a7bd72e105df698b6e5 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Thu, 22 Jul 2021 16:44:07 +0200 Subject: [PATCH 1/6] add outpoint display with electrum 1.5 --- app/api/electrumAddressApi.js | 19 +++++++++++++++++++ btc-rpc-explorer-node-details.png | Bin 0 -> 113484 bytes views/includes/transaction-io-details.pug | 18 +++++++++++++++--- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 btc-rpc-explorer-node-details.png diff --git a/app/api/electrumAddressApi.js b/app/api/electrumAddressApi.js index 56381d81a..3a2a6f3d9 100644 --- a/app/api/electrumAddressApi.js +++ b/app/api/electrumAddressApi.js @@ -353,6 +353,25 @@ function lookupTxBlockHash(txid) { }); } +// Lookup the spending transaction and height of a given transaction output. Only works with Electrum 1.5 protocol + +function lookupOutpointTx(txid, txout_idx) { + if (electrumClients.length == 0) { + return Promise.reject({ error: "No Electrum Server Connection", userText: noConnectionsErrorText }); + } + + return runOnAllServers(function(electrumClient) { + return electrumClient.request('blockchain.outpoint.subscribe', [txid, txout_idx]); + }).then(function(results) { + if (results.length <= 2) { + return electrumClient.request('blockchain.outpoint.unsubscribe', [txid, txout_idx]); + } else { + return results[1].slice(1) + } + }); +} + + function logStats(cmd, dt, success) { if (!global.electrumStats.rpc[cmd]) { global.electrumStats.rpc[cmd] = {count:0, time:0, successes:0, failures:0}; diff --git a/btc-rpc-explorer-node-details.png b/btc-rpc-explorer-node-details.png new file mode 100644 index 0000000000000000000000000000000000000000..2fff416b1b76e60e89e7bb2b542287f35b3d01cf GIT binary patch literal 113484 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 F{{vQd@|XYs literal 0 HcmV?d00001 diff --git a/views/includes/transaction-io-details.pug b/views/includes/transaction-io-details.pug index 891c54fd1..1e43f18c3 100644 --- a/views/includes/transaction-io-details.pug +++ b/views/includes/transaction-io-details.pug @@ -101,7 +101,7 @@ mixin asciiHexDataDisplay(dataName, uniqueId, hex) a(href=`./tx/${txInput.txid}#output-${txVin.vout}`) #{utils.ellipsize(txInput.txid, 20)}[#{txVin.vout}] else - + 0 .tx-io-value.mt-3.mt-md-0 @@ -195,6 +195,10 @@ mixin asciiHexDataDisplay(dataName, uniqueId, hex) - hiddenRow = true; - hiddenRowCount++; + - var spent = false; + if (false && config.electrumServers && config.electrumServers.length > 0) + - spent = electrumAddressApi.lookupOutpointTx(vout, voutIndex) + div(data-txid=tx.txid, class=(hiddenRow ? "d-none" : "")) .clearfix .tx-io-label @@ -220,9 +224,17 @@ mixin asciiHexDataDisplay(dataName, uniqueId, hex) +darkBadge span(title=`Output Type: ${utils.outputTypeName(vout.scriptPubKey.type)}`, data-bs-toggle="tooltip") #{utils.outputTypeAbbreviation(vout.scriptPubKey.type)} + if (spent) + .word-wrap + a(href=`./tx/${spent[0]}#output-${voutIndex}`) #{utils.ellipsizeMiddle(spent[0], 22)} + span ##{voutIndex} each addr in vout.scriptPubKey.addresses - a(id=`output-${voutIndex}`, href=`./address/${addr}`) - span.font-monospace.word-wrap(class=(highlightRow ? "text-info" : null)) #{addr} + if (spent) + span.me-1 (addr: + a(id=`output-${voutIndex}`, href=`./address/${addr}`) #{addr}) + else + a(id=`output-${voutIndex}`, href=`./address/${addr}`) + span.font-monospace.word-wrap(class=(highlightRow ? "text-info" : null)) #{addr} if (highlightRow) span(title="Current address", data-bs-toggle="tooltip") From 07ef92f39eef745d2544c64267b451873a9b4639 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Fri, 30 Jul 2021 01:05:22 +0200 Subject: [PATCH 2/6] Show the spending tx of outpoints with electrum 1.5 --- app/api/electrumAddressApi.js | 29 +++++++++++++++++++++++ routes/baseRouter.js | 20 ++++++++++++++++ views/includes/transaction-io-details.pug | 14 ++++++++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/app/api/electrumAddressApi.js b/app/api/electrumAddressApi.js index fd9c9818f..cb3042e22 100644 --- a/app/api/electrumAddressApi.js +++ b/app/api/electrumAddressApi.js @@ -353,6 +353,34 @@ function lookupTxBlockHash(txid) { }); } +// Lookup the spending transaction and height of a given transaction output. Only works with Electrum 1.5 protocol, ElectRS 0.9.0 does not implement subscriptions +// but can return the transaction spending the given outpoint + +function lookupOutpointTx(txid, vout) { + if (electrumClients.length == 0) { + return Promise.reject({ error: "Not supported by Electrum 1.4", userText: noConnectionsErrorText }); + } + + return runOnAllServers(function(electrumClient) { + return electrumClient.request('blockchain.outpoint.subscribe', [txid, vout]); + }).then(function(results) { + var spend_infos = results[0].result; + runOnAllServers(function(electrumClient) { + return electrumClient.request('blockchain.outpoint.unsubscribe', [txid, vout]) //will fail until subscriptions for outpoint are implemented in ElectRS + }); + if (results.slice(1).every(({ result }) => result == spend_infos)) { + if (spend_infos.length < 2) { + return false; + } else { + return spend_infos; + } + } else { + return Promise.reject({conflictedResults:results}); + } + }); +} + + function logStats(cmd, dt, success) { if (!global.electrumStats.rpc[cmd]) { global.electrumStats.rpc[cmd] = {count:0, time:0, successes:0, failures:0}; @@ -380,5 +408,6 @@ module.exports = { connectToServers: connectToServers, getAddressDetails: getAddressDetails, lookupTxBlockHash: lookupTxBlockHash, + lookupOutpointTx: lookupOutpointTx, }; diff --git a/routes/baseRouter.js b/routes/baseRouter.js index a64038e1e..9be7fbaae 100644 --- a/routes/baseRouter.js +++ b/routes/baseRouter.js @@ -26,6 +26,7 @@ const coins = require("./../app/coins.js"); const config = require("./../app/config.js"); const coreApi = require("./../app/api/coreApi.js"); const addressApi = require("./../app/api/addressApi.js"); +const electrumAddressApi = require("./../app/api/electrumAddressApi.js"); const rpcApi = require("./../app/api/rpcApi.js"); const btcQuotes = require("./../app/coins/btcQuotes.js"); @@ -1423,6 +1424,25 @@ router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { await Promise.all(promises); + // Electrs 0.9.0 support spending transaction lookup for an outpoint + if ((config.addressApi == "electrum" || config.addressApi == "electrumx") && config.electrumTxIndex) { + let spending_promises = []; + for (const vout in tx.vout) { + spending_promises.push(new Promise(async (resolve, reject) => { + if (res.locals.utxos[vout] == null) { + const spent = await electrumAddressApi.lookupOutpointTx(txid, parseInt(vout)); + resolve(spent); + } else { + resolve(false); + } + })); + } + + await Promise.all(spending_promises).then((outpoint_results) => { + res.locals.spendings = outpoint_results; + }); + } + if (global.specialTransactions && global.specialTransactions[txid]) { let funInfo = global.specialTransactions[txid]; diff --git a/views/includes/transaction-io-details.pug b/views/includes/transaction-io-details.pug index 07552cd56..3e3174d43 100644 --- a/views/includes/transaction-io-details.pug +++ b/views/includes/transaction-io-details.pug @@ -46,7 +46,7 @@ mixin outputValueDisplay(vout, voutIndex) if (utxos[voutIndex]) span(title="This output remains unspent (a valid UTXO)." data-bs-toggle="tooltip") i.far.fa-check-circle.fa-sm.text-success.ms-2 - + else if (utxos[voutIndex] == null) span(title="This output has been spent (destroyed)." data-bs-toggle="tooltip") i.far.fa-times-circle.fa-sm.text-danger.ms-2 @@ -290,10 +290,22 @@ mixin outputValueDisplay(vout, voutIndex) +darkBadge span(title=`Output Type: ${utils.outputTypeName(vout.scriptPubKey.type)}`, data-bs-toggle="tooltip") #{utils.outputTypeAbbreviation(vout.scriptPubKey.type)} + if (spendings) + - var spending_txid = spendings[voutIndex].spender_txhash; + if (spending_txid) + span.mt-1 spent by + a(href=`./tx/${spending_txid}`) #{utils.ellipsizeMiddle(spendings[voutIndex].spender_txhash,9)} + if (spendings[voutIndex].spender_height > 0 && spendings[voutIndex].spender_height > spendings[voutIndex].height) + span #{spendings[voutIndex].spender_height - spendings[voutIndex].height} blocks later + else if (spendings[voutIndex].spender_height <= 0) + span in the mempool + else if (spendings[voutIndex].spender_height == spendings[voutIndex].height) + span in the same block span.ms-2.float-end +outputValueDisplay(vout, voutIndex) + if (vout && vout.scriptPubKey.asm && !vout.scriptPubKey.asm.startsWith("OP_RETURN ")) if (voutAddresses.length == 0) .my-2.d-none.d-sm-block From 7f690910bdb8a1dba30b04c01fbd7345b4dfe550 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Mon, 9 Aug 2021 22:15:26 +0200 Subject: [PATCH 3/6] Fix space --- app/api/electrumAddressApi.js | 2 -- views/includes/transaction-io-details.pug | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/api/electrumAddressApi.js b/app/api/electrumAddressApi.js index cb3042e22..878534f82 100644 --- a/app/api/electrumAddressApi.js +++ b/app/api/electrumAddressApi.js @@ -355,7 +355,6 @@ function lookupTxBlockHash(txid) { // Lookup the spending transaction and height of a given transaction output. Only works with Electrum 1.5 protocol, ElectRS 0.9.0 does not implement subscriptions // but can return the transaction spending the given outpoint - function lookupOutpointTx(txid, vout) { if (electrumClients.length == 0) { return Promise.reject({ error: "Not supported by Electrum 1.4", userText: noConnectionsErrorText }); @@ -380,7 +379,6 @@ function lookupOutpointTx(txid, vout) { }); } - function logStats(cmd, dt, success) { if (!global.electrumStats.rpc[cmd]) { global.electrumStats.rpc[cmd] = {count:0, time:0, successes:0, failures:0}; diff --git a/views/includes/transaction-io-details.pug b/views/includes/transaction-io-details.pug index 3e3174d43..fed4a6e38 100644 --- a/views/includes/transaction-io-details.pug +++ b/views/includes/transaction-io-details.pug @@ -46,7 +46,7 @@ mixin outputValueDisplay(vout, voutIndex) if (utxos[voutIndex]) span(title="This output remains unspent (a valid UTXO)." data-bs-toggle="tooltip") i.far.fa-check-circle.fa-sm.text-success.ms-2 - + else if (utxos[voutIndex] == null) span(title="This output has been spent (destroyed)." data-bs-toggle="tooltip") i.far.fa-times-circle.fa-sm.text-danger.ms-2 @@ -293,7 +293,7 @@ mixin outputValueDisplay(vout, voutIndex) if (spendings) - var spending_txid = spendings[voutIndex].spender_txhash; if (spending_txid) - span.mt-1 spent by + span.mt-1 spent by a(href=`./tx/${spending_txid}`) #{utils.ellipsizeMiddle(spendings[voutIndex].spender_txhash,9)} if (spendings[voutIndex].spender_height > 0 && spendings[voutIndex].spender_height > spendings[voutIndex].height) span #{spendings[voutIndex].spender_height - spendings[voutIndex].height} blocks later @@ -305,7 +305,6 @@ mixin outputValueDisplay(vout, voutIndex) span.ms-2.float-end +outputValueDisplay(vout, voutIndex) - if (vout && vout.scriptPubKey.asm && !vout.scriptPubKey.asm.startsWith("OP_RETURN ")) if (voutAddresses.length == 0) .my-2.d-none.d-sm-block From 0499abe33abc8d94563579db527248ea871fc194 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Tue, 17 Aug 2021 12:56:01 +0200 Subject: [PATCH 4/6] Batch JSON for STXO --- app/api/electrumAddressApi.js | 51 +++++++++++++++++------ app/utils.js | 26 +++++++++++- routes/baseRouter.js | 39 +++++++++++------ views/includes/transaction-io-details.pug | 14 +++---- 4 files changed, 97 insertions(+), 33 deletions(-) diff --git a/app/api/electrumAddressApi.js b/app/api/electrumAddressApi.js index 878534f82..3d6bf3bc9 100644 --- a/app/api/electrumAddressApi.js +++ b/app/api/electrumAddressApi.js @@ -355,27 +355,52 @@ function lookupTxBlockHash(txid) { // Lookup the spending transaction and height of a given transaction output. Only works with Electrum 1.5 protocol, ElectRS 0.9.0 does not implement subscriptions // but can return the transaction spending the given outpoint -function lookupOutpointTx(txid, vout) { +function lookupOutpointsTx(outpoints) { if (electrumClients.length == 0) { return Promise.reject({ error: "Not supported by Electrum 1.4", userText: noConnectionsErrorText }); } + if (outpoints.length == 0) { + return Promise.resolve(null); + } return runOnAllServers(function(electrumClient) { - return electrumClient.request('blockchain.outpoint.subscribe', [txid, vout]); + return new Promise((resolve, reject) => { + let contents = []; + let arguments_far_calls = {}; + for (let outpoint of outpoints) { + const id = ++electrumClient.id; + const request = utils.makeRequest('blockchain.outpoint.subscribe', outpoint, id); + contents.push(request); + arguments_far_calls[id] = outpoint; + } + const content = '[' + contents.join(',') + ']'; + const promise = utils.createPromiseResultBatch(resolve, reject, arguments_far_calls); + electrumClient.callback_message_queue[electrumClient.id] = promise; + electrumClient.conn.write(content + '\n'); + }); }).then(function(results) { - var spend_infos = results[0].result; runOnAllServers(function(electrumClient) { - return electrumClient.request('blockchain.outpoint.unsubscribe', [txid, vout]) //will fail until subscriptions for outpoint are implemented in ElectRS + return new Promise((resolve, reject) => { + let contents = []; + let arguments_far_calls = {}; + for (let outpoint of outpoints) { + const id = ++electrumClient.id; + const request = utils.makeRequest('blockchain.outpoint.unsubscribe', outpoint, id); + contents.push(request); + arguments_far_calls[id] = outpoint; + } + const content = '[' + contents.join(',') + ']'; + const promise = utils.createPromiseResultBatch(resolve, reject, arguments_far_calls); + electrumClient.callback_message_queue[electrumClient.id] = promise; + electrumClient.conn.write(content + '\n'); + }); }); + const spend_infos = results[0].result; if (results.slice(1).every(({ result }) => result == spend_infos)) { - if (spend_infos.length < 2) { - return false; - } else { - return spend_infos; - } - } else { - return Promise.reject({conflictedResults:results}); - } + return spend_infos; + } else { + return Promise.reject({conflictedResults:results}); + } }); } @@ -406,6 +431,6 @@ module.exports = { connectToServers: connectToServers, getAddressDetails: getAddressDetails, lookupTxBlockHash: lookupTxBlockHash, - lookupOutpointTx: lookupOutpointTx, + lookupOutpointsTx: lookupOutpointsTx, }; diff --git a/app/utils.js b/app/utils.js index 1f8252d6e..a84ea98bc 100644 --- a/app/utils.js +++ b/app/utils.js @@ -1167,6 +1167,28 @@ function bip32Addresses(extPubkey, addressType, account, limit=10, offset=0) { return addresses; } +function createPromiseResultBatch(resolve, reject, argz) { + return (err, result) => { + if (result && result[0] && result[0].id) { + // this is a batch request response + for (let r of result) { + r.param = argz[r.id]; + } + } + if (err) reject(err); + else resolve(result); + }; +}; + +function makeRequest(method, params, id) { + return JSON.stringify({ + jsonrpc: '2.0', + method: method, + params: params, + id: id, + }); +}; + module.exports = { reflectPromise: reflectPromise, redirectToConnectPageIfNeeded: redirectToConnectPageIfNeeded, @@ -1220,5 +1242,7 @@ module.exports = { getVoutAddress: getVoutAddress, getVoutAddresses: getVoutAddresses, xpubChangeVersionBytes: xpubChangeVersionBytes, - bip32Addresses: bip32Addresses + bip32Addresses: bip32Addresses, + createPromiseResultBatch: createPromiseResultBatch, + makeRequest: makeRequest, }; diff --git a/routes/baseRouter.js b/routes/baseRouter.js index 717af7a3d..ebf20897e 100644 --- a/routes/baseRouter.js +++ b/routes/baseRouter.js @@ -1436,21 +1436,36 @@ router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { // Electrs 0.9.0 support spending transaction lookup for an outpoint if ((config.addressApi == "electrum" || config.addressApi == "electrumx") && config.electrumTxIndex) { - let spending_promises = []; + let outpoints = []; for (const vout in tx.vout) { - spending_promises.push(new Promise(async (resolve, reject) => { - if (res.locals.utxos[vout] == null) { - const spent = await electrumAddressApi.lookupOutpointTx(txid, parseInt(vout)); - resolve(spent); - } else { - resolve(false); - } - })); + if (res.locals.utxos[vout] == null) { + outpoints.push([txid, parseInt(vout)]); + } + //spending_promises.push(new Promise(async (resolve, reject) => { + // if (res.locals.utxos[vout] == null) { + // const spent = await electrumAddressApi.lookupOutpointTx(txid, parseInt(vout)); + // resolve(spent); + // } else { + // resolve(false); + // } + //})); } - await Promise.all(spending_promises).then((outpoint_results) => { - res.locals.spendings = outpoint_results; - }); + const spent_outpoints = await electrumAddressApi.lookupOutpointsTx(outpoints); + let spendings_status = []; + let spent_idx = 0; + for (const vout in tx.vout) { + if (res.locals.utxos[vout] == null) { + spendings_status.push(spent_outpoints[spent_idx].result); + ++spent_idx; + } else { + spendings_status.push(false) + } + } + res.locals.spendings = spendings_status + //await Promise.all(spending_promises).then((outpoint_results) => { + // res.locals.spendings = outpoint_results; + //}); } if (global.specialTransactions && global.specialTransactions[txid]) { diff --git a/views/includes/transaction-io-details.pug b/views/includes/transaction-io-details.pug index 56649fd6c..f69aab648 100644 --- a/views/includes/transaction-io-details.pug +++ b/views/includes/transaction-io-details.pug @@ -295,15 +295,15 @@ mixin outputValueDisplay(vout, voutIndex) span(title=`Output Type: ${utils.outputTypeName(vout.scriptPubKey.type)}`, data-bs-toggle="tooltip") #{utils.outputTypeAbbreviation(vout.scriptPubKey.type)} if (spendings) - - var spending_txid = spendings[voutIndex].spender_txhash; - if (spending_txid) + - var spending_vout = spendings[voutIndex]; + if (spending_vout) span.mt-1 spent by - a(href=`./tx/${spending_txid}`) #{utils.ellipsizeMiddle(spendings[voutIndex].spender_txhash,9)} - if (spendings[voutIndex].spender_height > 0 && spendings[voutIndex].spender_height > spendings[voutIndex].height) - span #{spendings[voutIndex].spender_height - spendings[voutIndex].height} blocks later - else if (spendings[voutIndex].spender_height <= 0) + a(href=`./tx/${spending_vout.spender_txhash}`) #{utils.ellipsizeMiddle(spending_vout.spender_txhash,9)} + if (spending_vout.spender_height > 0 && spending_vout.spender_height > spending_vout.height) + span #{spending_vout.spender_height - spending_vout.height} blocks later + else if (spending_vout.spender_height <= 0) span in the mempool - else if (spendings[voutIndex].spender_height == spendings[voutIndex].height) + else if (spending_vout.spender_height == spending_vout.height) span in the same block span.ms-2.float-end From 3dff1499b153e44e63089f9a94ef6947e3e62656 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Tue, 17 Aug 2021 13:19:31 +0200 Subject: [PATCH 5/6] cleanup some comments --- routes/baseRouter.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/routes/baseRouter.js b/routes/baseRouter.js index ebf20897e..b5b8226e4 100644 --- a/routes/baseRouter.js +++ b/routes/baseRouter.js @@ -1441,14 +1441,6 @@ router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { if (res.locals.utxos[vout] == null) { outpoints.push([txid, parseInt(vout)]); } - //spending_promises.push(new Promise(async (resolve, reject) => { - // if (res.locals.utxos[vout] == null) { - // const spent = await electrumAddressApi.lookupOutpointTx(txid, parseInt(vout)); - // resolve(spent); - // } else { - // resolve(false); - // } - //})); } const spent_outpoints = await electrumAddressApi.lookupOutpointsTx(outpoints); @@ -1463,9 +1455,6 @@ router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { } } res.locals.spendings = spendings_status - //await Promise.all(spending_promises).then((outpoint_results) => { - // res.locals.spendings = outpoint_results; - //}); } if (global.specialTransactions && global.specialTransactions[txid]) { From b75ac4ece9c57ed172d0926e931a851d0ebe85d7 Mon Sep 17 00:00:00 2001 From: Pantamis Date: Sat, 2 Oct 2021 11:38:37 +0200 Subject: [PATCH 6/6] add pages for outpoint link to outpoint page if too many Outpoint status in others tx display --- routes/baseRouter.js | 90 +++++++++++++++++++---- views/includes/transaction-io-details.pug | 30 ++++---- 2 files changed, 91 insertions(+), 29 deletions(-) diff --git a/routes/baseRouter.js b/routes/baseRouter.js index b5b8226e4..a5a9abd8e 100644 --- a/routes/baseRouter.js +++ b/routes/baseRouter.js @@ -1363,6 +1363,61 @@ router.get("/tx/:transactionId@:blockHeight", asyncHandler(async (req, res, next next(); })); +router.get("/outpoint/:transactionId-:vout", asyncHandler(async (req, res, next) => { + if ((config.addressApi == "electrum" || config.addressApi == "electrumx") && config.electrumTxIndex) { + try { + var txid = utils.asHash(req.params.transactionId); + var vout = parseInt(req.params.vout); + var outpoint = [txid, vout]; + + const spent_outpoints = await electrumAddressApi.lookupOutpointsTx([outpoint]); + const spending_tx = spent_outpoints[0].result; + + if (spending_tx.spender_txhash == undefined) { + res.locals.userMessageMarkdown = `Outpoint **${txid}:${vout}** unspent`; + req.url = "/tx/" + req.params.transactionId + `#output-${vout}`; + next(); + } else { + var diff_height = "in the mempool"; + if (spending_tx.spender_height > 0) { + diff_height = `after ${spending_tx.spender_height - spending_tx.height} block` + if (spending_tx.spender_height - spending_tx.height > 1) { + diff_height += `s` + } + } + res.locals.userMessageMarkdown = `Outpoint **${txid}:${vout}** spent by this transaction ` + diff_height; + req.url = "/tx/" + spending_tx.spender_txhash; + next(); + } + } catch (err) { + if (global.prunedBlockchain && res.locals.blockHeight && res.locals.blockHeight < global.pruneHeight) { + // Failure to load tx here is expected and a full description of the situation is given to the user + // in the UI. No need to also show an error userMessage here. + + } else if (!global.txindexAvailable) { + res.locals.noTxIndexMsg = noTxIndexMsg; + + // As above, failure to load the tx is expected here and good user feedback is given in the UI. + // No need for error userMessage. + + } else { + res.locals.userMessageMarkdown = `Outpoint not found: txid=**${txid}**, vout=**${vout}**`; + } + + + + utils.logError("1237y4ewssgt", err); + + res.render("transaction"); + + next(); + } + } else { + req.url = "/tx/" + req.params.transactionId; + + next(); + } +})); router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { try { @@ -1436,25 +1491,28 @@ router.get("/tx/:transactionId", asyncHandler(async (req, res, next) => { // Electrs 0.9.0 support spending transaction lookup for an outpoint if ((config.addressApi == "electrum" || config.addressApi == "electrumx") && config.electrumTxIndex) { - let outpoints = []; - for (const vout in tx.vout) { - if (res.locals.utxos[vout] == null) { - outpoints.push([txid, parseInt(vout)]); + if (res.locals.utxos.length > 200) { + res.locals.spendings = null; + } else { + let outpoints = []; + for (const vout in tx.vout) { + if (res.locals.utxos[vout] == null) { + outpoints.push([txid, parseInt(vout)]); + } } - } - - const spent_outpoints = await electrumAddressApi.lookupOutpointsTx(outpoints); - let spendings_status = []; - let spent_idx = 0; - for (const vout in tx.vout) { - if (res.locals.utxos[vout] == null) { - spendings_status.push(spent_outpoints[spent_idx].result); - ++spent_idx; - } else { - spendings_status.push(false) + const spent_outpoints = await electrumAddressApi.lookupOutpointsTx(outpoints); + let spendings_status = []; + let spent_idx = 0; + for (const vout in tx.vout) { + if (res.locals.utxos[vout] == null) { + spendings_status.push(spent_outpoints[spent_idx].result); + ++spent_idx; + } else { + spendings_status.push(false) + } } + res.locals.spendings = spendings_status } - res.locals.spendings = spendings_status } if (global.specialTransactions && global.specialTransactions[txid]) { diff --git a/views/includes/transaction-io-details.pug b/views/includes/transaction-io-details.pug index f69aab648..b1fd6c75d 100644 --- a/views/includes/transaction-io-details.pug +++ b/views/includes/transaction-io-details.pug @@ -275,7 +275,23 @@ mixin outputValueDisplay(vout, voutIndex) span.d-none.d-sm-inline +darkBadge span(title=`Output Type: ${utils.outputTypeName(vout.scriptPubKey.type)}`, data-bs-toggle="tooltip") #{utils.outputTypeAbbreviation(vout.scriptPubKey.type)} - + if (spendings === undefined) + span.mt-1 + a(href=`./outpoint/${tx.txid}-${voutIndex}`) Outpoint Status + else if (spendings) + - var spending_vout = spendings[voutIndex]; + if (spending_vout && spending_vout.spender_txhash) + span.mt-1 spent by + a(href=`./tx/${spending_vout.spender_txhash}`) #{utils.ellipsizeMiddle(spending_vout.spender_txhash,9)} + if (spending_vout.spender_height > 0 && spending_vout.spender_height > spending_vout.height) + span #{spending_vout.spender_height - spending_vout.height} blocks later + else if (spending_vout.spender_height <= 0) + span in the mempool + else + span in the same block + else if (spendings === null && utxos[voutIndex] == null) + span.mt-1 spent by + a(href=`./outpoint/${txid}-${voutIndex}`) this transaction if (voutAddresses.length == 0) @@ -294,18 +310,6 @@ mixin outputValueDisplay(vout, voutIndex) +darkBadge span(title=`Output Type: ${utils.outputTypeName(vout.scriptPubKey.type)}`, data-bs-toggle="tooltip") #{utils.outputTypeAbbreviation(vout.scriptPubKey.type)} - if (spendings) - - var spending_vout = spendings[voutIndex]; - if (spending_vout) - span.mt-1 spent by - a(href=`./tx/${spending_vout.spender_txhash}`) #{utils.ellipsizeMiddle(spending_vout.spender_txhash,9)} - if (spending_vout.spender_height > 0 && spending_vout.spender_height > spending_vout.height) - span #{spending_vout.spender_height - spending_vout.height} blocks later - else if (spending_vout.spender_height <= 0) - span in the mempool - else if (spending_vout.spender_height == spending_vout.height) - span in the same block - span.ms-2.float-end +outputValueDisplay(vout, voutIndex)