forked from bitcoinvault/explorer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
address.pug
407 lines (327 loc) · 17.2 KB
/
address.pug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
extends layout
block headContent
title Address #{address}
block content
if (result && result.validateaddress)
if (!result.validateaddress.isvalid)
h1(class="h3 text-danger") Invalid Address
br
small(class="monospace") #{address}
else
h1(class="h3") Address
br
small(class="monospace") #{address}
hr
if (payoutAddressForMiner)
div(class="alert alert-primary shadow-sm", style="padding-bottom: 0;")
div(class="float-left", style="width: 50px; height: 50px; font-size: 18px;")
i(class="fas fa-certificate fa-2x", style="margin-top: 10px;")
h4(class="alert-heading h6 font-weight-bold") #{coinConfig.name} Fun
p
span This looks like a miner payout address for
span(class="font-weight-bold") #{payoutAddressForMiner.name}
if (coinConfig.miningPoolsConfigUrls.length > 1)
span (see the configurations:
each item, index in coinConfig.miningPoolsConfigUrls
if (index > 0)
span ,
a(href=item) config ##{index + 1}
span )
else
span (see the configuration
a(href=coinConfig.miningPoolsConfigUrls[0]) here
span )
else if (global.specialAddresses[address] && global.specialAddresses[address].type == "donation")
div(class="alert alert-primary shadow-sm", style="padding-bottom: 0;")
div(class="float-left", style="width: 50px; height: 50px; font-size: 18px;")
i(class="fas fa-certificate fa-2x", style="margin-top: 10px;")
h4(class="alert-heading h6 font-weight-bold") #{coinConfig.name} Fun
p
span This is the #{coinConfig.ticker} donation address to support development of this tool. All support is appreciated!
else if (global.specialAddresses[address] && global.specialAddresses[address].type == "fun")
div(class="alert alert-primary shadow-sm", style="padding-bottom: 0;")
div(class="float-left", style="width: 50px; height: 50px; font-size: 18px;")
i(class="fas fa-certificate fa-2x", style="margin-top: 10px;")
h4(class="alert-heading h6 font-weight-bold") #{coinConfig.name} Fun
// special address info
- var saInfo = global.specialAddresses[address].addressInfo;
if (saInfo.alertBodyHtml)
p
span !{saInfo.alertBodyHtml}
if (saInfo.referenceUrl && saInfo.referenceUrl.trim().length > 0 && saInfo.alertBodyHtml.indexOf(saInfo.referenceUrl) == -1)
span
a(href=saInfo.referenceUrl) Read more
else
p
span #{saInfo.summary}
if (saInfo.referenceUrl && saInfo.referenceUrl.trim().length > 0)
span
a(href=saInfo.referenceUrl) Read more
if (false)
pre
code(class="json bg-light") #{JSON.stringify(addressObj, null, 4)}
ul(class='nav nav-tabs mb-3')
li(class="nav-item")
a(data-toggle="tab", href="#tab-details", class="nav-link active", role="tab") Details
li(class="nav-item")
a(data-toggle="tab", href="#tab-json", class="nav-link", role="tab") JSON
div(class="tab-content")
div(id="tab-details", class="tab-pane active", role="tabpanel")
if (false && config.electrumXServers && config.electrumXServers.length > 0)
if (session.hideElectrumTrustWarnings != "true")
div(class="alert alert-primary alert-dismissible clearfix shadow-sm", role="alert")
span this explorer is database-free, it doesn't natively support address balances and transaction histories. In order to provide this functionality, address balances and transaction history can be requested from a configurable set of ElectrumX servers. If multiple ElectrumX servers are configured, the results are cross-referenced and conflicts noted. For the transaction history displayed below, only the transaction identifiers from ElectrumX are used; the transaction details are requested via RPC from this app's primary node, as usual.
a(href="/changeSetting?name=hideElectrumTrustWarnings&value=true", class="close", aria-label="Close", style="text-decoration: none;")
span(aria-hidden="true") ×
div(class="card mb-3 shadow-sm")
div(class="card-header")
span(class="h6") Summary
if (config.addressApi)
small.text-muted.border-dotted.ml-2(title=`Some details for this address were queried from ${config.addressApi}` data-toggle="tooltip") Trust Note
div(class="card-body")
div(class="row")
div(class="col-md-6")
if (addressObj.hash)
div(class="row")
div(class="summary-split-table-label") Hash 160
div(class="summary-split-table-content monospace") #{addressObj.hash.toString("hex")}
if (result.validateaddress.scriptPubKey)
div(class="row")
div(class="summary-split-table-label") Script Public Key
div(class="summary-split-table-content monospace") #{result.validateaddress.scriptPubKey}
if (addressObj.hasOwnProperty("version"))
div(class="row")
div(class="summary-split-table-label") Version
div(class="summary-split-table-content monospace") #{addressObj.version}
if (result.validateaddress.hasOwnProperty("witness_version"))
div(class="row")
div(class="summary-split-table-label") Witness Version
div(class="summary-split-table-content monospace") #{result.validateaddress.witness_version}
if (result.validateaddress.witness_program)
div(class="row")
div(class="summary-split-table-label") Witness Program
div(class="summary-split-table-content monospace") #{result.validateaddress.witness_program}
if (firstSeenTransaction && firstSeenTransaction.confirmations > 0)
div(class="row")
div(class="summary-split-table-label") First Seen
div(class="summary-split-table-content monospace")
if (getblockchaininfo)
span Block ##{(getblockchaininfo.blocks - firstSeenTransaction.confirmations).toLocaleString()}
else
a(href=("/block/" + firstSeenTransaction.blockhash)) #{firstSeenTransaction.blockhash}
br
span #{moment.utc(new Date(firstSeenTransaction.time * 1000)).format("Y-MM-DD HH:mm:ss")} utc
- var timeAgoTime = firstSeenTransaction.time;
include includes/time-ago.pug
if (false)
pre
code(class="json bg-light") #{JSON.stringify(firstSeenTransaction)}
if (balance)
if (balance.conflictedResults)
div(class="row")
div(class="summary-split-table-label") Balance
div(class="summary-split-table-content monospace")
span(class="text-warning") Conflicted ElectrumX Results
each item in balance.conflictedResults
- var currencyValue = item.confirmed / coinConfig.baseCurrencyUnit.multiplier;
include includes/value-display.pug
else
div(class="row")
div(class="summary-split-table-label") Balance
div(class="summary-split-table-content monospace")
- var currencyValue = balance.result.confirmed / coinConfig.baseCurrencyUnit.multiplier;
include includes/value-display.pug
if (balance.unconfirmed)
div(class="row")
div(class="summary-split-table-label") Unconfirmed
div(class="summary-split-table-content monospace")
- var currencyValue = balance.unconfirmed / coinConfig.baseCurrencyUnit.multiplier;
include includes/value-display.pug
if (addressDetails && addressDetails.balanceSat)
div(class="row")
div(class="summary-split-table-label") Balance
div(class="summary-split-table-content monospace")
- var currencyValue = new Decimal(addressDetails.balanceSat).dividedBy(coinConfig.baseCurrencyUnit.multiplier);
include includes/value-display.pug
if (addressDetails && addressDetails.txCount)
div(class="row")
div(class="summary-split-table-label") Transactions
div(class="summary-split-table-content monospace") #{addressDetails.txCount.toLocaleString()}
div(class="row")
div(class="summary-split-table-label") QR Code
div(class="summary-split-table-content monospace")
img(src=addressQrCodeUrl, alt=address, style="border: solid 1px #ccc;")
div(class="col-md-6")
if (electrumScripthash)
div(class="row")
div(class="summary-split-table-label") Scripthash
div(class="summary-split-table-content monospace") #{electrumScripthash}
- var x = result.validateaddress;
- var flagNames = ["Is Valid?", "Is Script?", "Is Witness?", "Is Mine?", "Is Watch-Only?"];
- var flags = [x.isvalid, x.isscript, x.iswitness, x.ismine, x.iswatchonly];
each flagName, index in flagNames
div(class="row")
div(class="summary-split-table-label") #{flagName}
div(class="summary-split-table-content monospace")
if (flags[index])
i(class="fas fa-check text-success")
else
i(class="fas fa-times text-warning")
if (false)
div(class="card mb-3 shadow-sm")
div(class="card-header")
span(class="h6") Flags
div(class="card-body")
div(class="table-responsive")
table(class="table text-center")
thead
tr
th Is Valid?
th Is Script?
th Is Witness?
th Is Mine?
th Is Watch-Only?
tbody
tr
- var x = result.validateaddress;
- var flags = [x.isvalid, x.isscript, x.iswitness, x.ismine, x.iswatchonly];
each flag in flags
td
if (flag)
i(class="fas fa-check text-success")
else
i(class="fas fa-times text-warning")
div(class="card mb-3 shadow-sm")
div(class="card-header clearfix")
div(class="float-left")
span(class="h6")
if (addressDetails && addressDetails.txCount)
if (addressDetails.txCount == 1)
span 1 Transaction
else
span #{addressDetails.txCount.toLocaleString()} Transactions
else
span Transactions
if (config.addressApi)
if (config.addressApi == "electrumx")
small.text-muted.border-dotted.ml-2(title=`The list of transaction IDs for this address was queried from ElectrumX (using the configured server(s))` data-toggle="tooltip") Trust Note
else
small.text-muted.border-dotted.ml-2(title=`The list of transaction IDs for this address was queried from ${config.addressApi}` data-toggle="tooltip") Trust Note
if (!crawlerBot && txids && txids.length > 1 && addressApiSupport.sortDesc && addressApiSupport.sortAsc)
div(class="float-right")
a(href="#", class="pull-right dropdown-toggle", data-toggle="dropdown", aria-haspopup="true", aria-expanded="false")
if (sort == "desc")
span Newest First
else
span Oldest First
div(class="dropdown-menu dropdown-menu-right")
a(href=("/address/" + address), class="dropdown-item")
if (sort == "desc")
i(class="fa fa-check")
span Newest First
a(href=("/address/" + address + "?sort=asc"), class="dropdown-item")
if (sort != "desc")
i(class="fa fa-check")
span Oldest First
else if (txids && txids.length > 1 && addressApiSupport.sortDesc && !addressApiSupport.sortAsc)
div.float-right
span.text-muted Newest First
div(class="card-body")
if (conflictedTxidResults)
div(class="alert alert-warning", style="padding-bottom: 0;")
div(class="float-left", style="width: 55px; height: 50px; font-size: 18px;")
i(class="fas fa-exclamation-triangle fa-2x", style="margin-top: 10px;")
h4(class="alert-heading h6 font-weight-bold") Trust Warning
p
span The transaction history for this address was requested from mulitple ElectrumX servers and the results did not match. The results below were obtained only from
span(class="font-weight-bold") #{electrumHistory.server}
if (true)
if (addressApiError && addressApiError.error && addressApiError.error.code && addressApiError.error.code == -32600)
span Failed to retrieve transaction history from ElectrumX. See
a(href="https://github.com/janoside/btc-rpc-explorer/issues/67") Issue #67
span for more information.
else if (addressApiError && addressApiError.userText)
div.text-danger Error: #{addressApiError.userText}
else if (addressDetailsErrors && addressDetailsErrors.length > 0)
each err in addressDetailsErrors
if (err.e && err.e.error && err.e.error.message == "history too large")
span Failed to retrieve transaction history from ElectrumX. See
a(href="https://github.com/janoside/btc-rpc-explorer/issues/67") Issue #67
span for more information.
else if (err == "No address API configured")
span No address API is configured. See
a(href="https://github.com/bitcoinvault/explorer/blob/master/.env-sample") the example configuration file
span for help setting up an address API if desired.
else if (transactions.length == 0)
span No transactions found
each tx, txIndex in transactions
//pre
// code(class="json bg-light") #{JSON.stringify(tx, null, 4)}
div(class=("xcard bg-light rounded shadow-sm " + ((txIndex < (transactions.length - 1) || txids.length > limit) ? "mb-4" : "")))
div(class="card-header monospace clearfix")
div(class="float-left", style="margin-right: 0px;")
if (sort == "desc")
span ##{(addressDetails.txCount - offset - txIndex).toLocaleString()}
else
span ##{(offset + txIndex + 1).toLocaleString()}
span –
div(class="row")
div(class="col-md-6")
if (tx && tx.txid)
a(href=("/tx/" + tx.txid)) #{tx.txid}
if (global.specialTransactions && global.specialTransactions[tx.txid])
span
a(data-toggle="tooltip", title=(coinConfig.name + " Fun! See transaction for details"))
i(class="fas fa-certificate text-primary")
div(class="col-md-6")
div(class="text-md-right")
if (tx.time)
span #{moment.utc(new Date(tx["time"] * 1000)).format("Y-MM-DD HH:mm:ss")} utc
- var timeAgoTime = tx.time;
include includes/time-ago.pug
else
span(class="text-danger") Unconfirmed
div(class="col")
if (addrGainsByTx[tx.txid])
- var currencyValue = addrGainsByTx[tx.txid];
span(class="text-success") +
include includes/value-display.pug
if (addrLossesByTx[tx.txid])
span /
if (addrLossesByTx[tx.txid])
- var currencyValue = addrLossesByTx[tx.txid];
span(class="text-danger") -
include includes/value-display.pug
div(class="card-body")
if (true)
- var txInputs = txInputsByTransaction[tx.txid];
- var blockHeight = blockHeightsByTxid[tx.txid];
- var txIOHighlightAddress = address;
include includes/transaction-io-details.pug
else
p Since this explorer is database-free, it doesn't natively support address transaction history. However, you can configure it to communicate with one or more ElectrumX servers to build and display this data. In doing so, you should be aware that you'll be trusting those ElectrumX servers. If you configure multiple servers the results obtained from each will be cross-referenced against the others. Communicating with ElectrumX servers will also impact your privacy since the servers will know what addresses you're interested in. If these tradeoffs are acceptable, you can see a list of public ElectrumX servers here:
a(href="https://uasf.saltylemon.org/electrum") https://uasf.saltylemon.org/electrum
if (false)
pre
code(class="json bg-light") #{JSON.stringify(transactions, null, 4)}
if (!crawlerBot && addressDetails && addressDetails.txCount > limit)
- var txCount = addressDetails.txCount;
- var pageNumber = offset / limit + 1;
- var pageCount = Math.floor(txCount / limit);
- if (pageCount * limit < txCount) {
- pageCount++;
- }
- var paginationUrlFunction = function(x) {
- return paginationBaseUrl + "&limit=" + limit + "&offset=" + ((x - 1) * limit);
- }
hr.mt-3
include includes/pagination.pug
div(id="tab-json", class="tab-pane", role="tabpanel")
div(class="highlight")
h4 validateaddress
pre
code(class="json bg-light", data-lang="json") #{JSON.stringify(result.validateaddress, null, 4)}
if (addressDetails)
h4 addressDetails
pre
code.json.bg-light #{JSON.stringify(addressDetails, null, 4)}