Show first seen date of mempool transaction in explorer
parent
47f798dbaa
commit
b64d76d8f9
|
@ -294,6 +294,10 @@ func (w *Worker) GetTransactionFromBchainTx(bchainTx *bchain.Tx, height uint32,
|
|||
return nil, err
|
||||
}
|
||||
}
|
||||
// for mempool transaction get first seen time
|
||||
if bchainTx.Confirmations == 0 {
|
||||
bchainTx.Blocktime = int64(w.mempool.GetTransactionTime(bchainTx.Txid))
|
||||
}
|
||||
r := &Tx{
|
||||
Blockhash: blockhash,
|
||||
Blockheight: int(height),
|
||||
|
|
26
api/xpub.go
26
api/xpub.go
|
@ -383,13 +383,13 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||
return nil, err
|
||||
}
|
||||
// setup filtering of txids
|
||||
var useTxids func(txid *xpubTxid, ad *xpubAddress) bool
|
||||
var txidFilter func(txid *xpubTxid, ad *xpubAddress) bool
|
||||
if !(filter.FromHeight == 0 && filter.ToHeight == 0 && filter.Vout == AddressFilterVoutOff) {
|
||||
toHeight := maxUint32
|
||||
if filter.ToHeight != 0 {
|
||||
toHeight = filter.ToHeight
|
||||
}
|
||||
useTxids = func(txid *xpubTxid, ad *xpubAddress) bool {
|
||||
txidFilter = func(txid *xpubTxid, ad *xpubAddress) bool {
|
||||
if txid.height < filter.FromHeight || txid.height > toHeight {
|
||||
return false
|
||||
}
|
||||
|
@ -406,6 +406,7 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||
// process mempool, only if ToHeight is not specified
|
||||
if filter.ToHeight == 0 && !filter.OnlyConfirmed {
|
||||
txmMap = make(map[string]*Tx)
|
||||
mempoolEntries := make(bchain.MempoolTxidEntries, 0)
|
||||
for _, da := range [][]xpubAddress{data.addresses, data.changeAddresses} {
|
||||
for i := range da {
|
||||
ad := &da[i]
|
||||
|
@ -432,18 +433,23 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||
}
|
||||
uBalSat.Add(&uBalSat, tx.getAddrVoutValue(ad.addrDesc))
|
||||
uBalSat.Sub(&uBalSat, tx.getAddrVinValue(ad.addrDesc))
|
||||
if page == 0 && !foundTx && (useTxids == nil || useTxids(&txid, ad)) {
|
||||
if option == AccountDetailsTxidHistory {
|
||||
txids = append(txids, tx.Txid)
|
||||
} else if option >= AccountDetailsTxHistoryLight {
|
||||
txs = append(txs, tx)
|
||||
}
|
||||
// mempool txs are returned only on the first page, uniquely and filtered
|
||||
if page == 0 && !foundTx && (txidFilter == nil || txidFilter(&txid, ad)) {
|
||||
mempoolEntries = append(mempoolEntries, bchain.MempoolTxidEntry{Txid: txid.txid, Time: uint32(tx.Blocktime)})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
// sort the entries by time descending
|
||||
sort.Sort(mempoolEntries)
|
||||
for _, entry := range mempoolEntries {
|
||||
if option == AccountDetailsTxidHistory {
|
||||
txids = append(txids, entry.Txid)
|
||||
} else if option >= AccountDetailsTxHistoryLight {
|
||||
txs = append(txs, txmMap[entry.Txid])
|
||||
}
|
||||
}
|
||||
}
|
||||
if option >= AccountDetailsTxidHistory {
|
||||
txcMap := make(map[string]bool)
|
||||
|
@ -459,7 +465,7 @@ func (w *Worker) GetXpubAddress(xpub string, page int, txsOnPage int, option Acc
|
|||
}
|
||||
// add tx only once
|
||||
if !added {
|
||||
add := useTxids == nil || useTxids(&txid, ad)
|
||||
add := txidFilter == nil || txidFilter(&txid, ad)
|
||||
txcMap[txid.txid] = add
|
||||
if add {
|
||||
txc = append(txc, txid)
|
||||
|
|
|
@ -316,3 +316,7 @@ func (c *mempoolWithMetrics) GetAllEntries() (v bchain.MempoolTxidEntries) {
|
|||
defer func(s time.Time) { c.observeRPCLatency("GetAllEntries", s, nil) }(time.Now())
|
||||
return c.mempool.GetAllEntries()
|
||||
}
|
||||
|
||||
func (c *mempoolWithMetrics) GetTransactionTime(txid string) uint32 {
|
||||
return c.mempool.GetTransactionTime(txid)
|
||||
}
|
||||
|
|
|
@ -291,4 +291,5 @@ type Mempool interface {
|
|||
GetTransactions(address string) ([]Outpoint, error)
|
||||
GetAddrDescTransactions(addrDesc AddressDescriptor) ([]Outpoint, error)
|
||||
GetAllEntries() MempoolTxidEntries
|
||||
GetTransactionTime(txid string) uint32
|
||||
}
|
||||
|
|
|
@ -4,9 +4,7 @@
|
|||
<div class="col-xs-7 col-md-8 ellipsis">
|
||||
<a href="/tx/{{$tx.Txid}}">{{$tx.Txid}}</a>
|
||||
</div>
|
||||
{{- if $tx.Confirmations -}}
|
||||
<div class="col-xs-5 col-md-4 text-muted text-right">mined {{formatUnixTime $tx.Blocktime}}</div>
|
||||
{{- end -}}
|
||||
<div class="col-xs-5 col-md-4 text-muted text-right">{{if $tx.Confirmations}}mined{{else}}first seen{{end}} {{formatUnixTime $tx.Blocktime}}</div>
|
||||
</div>
|
||||
<div class="row line-mid">
|
||||
<div class="col-md-5">
|
||||
|
|
|
@ -5,9 +5,7 @@
|
|||
<a href="/tx/{{$tx.Txid}}">{{$tx.Txid}}</a>
|
||||
{{if eq $tx.EthereumSpecific.Status 1}}<span class="text-success"> ✔</span>{{end}}{{if eq $tx.EthereumSpecific.Status 0}}<span class="text-danger"> ✘</span>{{end}}
|
||||
</div>
|
||||
{{- if $tx.Confirmations -}}
|
||||
<div class="col-xs-5 col-md-4 text-muted text-right">mined {{formatUnixTime $tx.Blocktime}}</div>
|
||||
{{- end -}}
|
||||
<div class="col-xs-5 col-md-4 text-muted text-right">{{if $tx.Confirmations}}mined{{else}}first seen{{end}} {{formatUnixTime $tx.Blocktime}}</div>
|
||||
</div>
|
||||
<div class="row line-mid">
|
||||
<div class="col-md-4">
|
||||
|
|
Loading…
Reference in New Issue