diff --git a/api/types.go b/api/types.go index 33b94d39..279c073c 100644 --- a/api/types.go +++ b/api/types.go @@ -191,6 +191,7 @@ type Tx struct { ValueInSat *Amount `json:"valueIn,omitempty"` FeesSat *Amount `json:"fees,omitempty"` Hex string `json:"hex,omitempty"` + Rbf bool `json:"rbf,omitempty"` CoinSpecificData interface{} `json:"-"` CoinSpecificJSON json.RawMessage `json:"-"` TokenTransfers []TokenTransfer `json:"tokenTransfers,omitempty"` diff --git a/api/worker.go b/api/worker.go index 29f19e2b..b5302f67 100644 --- a/api/worker.go +++ b/api/worker.go @@ -142,6 +142,7 @@ func (w *Worker) GetTransactionFromBchainTx(bchainTx *bchain.Tx, height uint32, var valInSat, valOutSat, feesSat big.Int var pValInSat *big.Int vins := make([]Vin, len(bchainTx.Vin)) + rbf := false for i := range bchainTx.Vin { bchainVin := &bchainTx.Vin[i] vin := &vins[i] @@ -149,6 +150,10 @@ func (w *Worker) GetTransactionFromBchainTx(bchainTx *bchain.Tx, height uint32, vin.N = i vin.Vout = bchainVin.Vout vin.Sequence = int64(bchainVin.Sequence) + // detect explicit Replace-by-Fee transactions as defined by BIP125 + if bchainTx.Confirmations == 0 && bchainVin.Sequence < 0xffffffff-1 { + rbf = true + } vin.Hex = bchainVin.ScriptSig.Hex vin.Coinbase = bchainVin.Coinbase if w.chainType == bchain.ChainBitcoinType { @@ -317,6 +322,7 @@ func (w *Worker) GetTransactionFromBchainTx(bchainTx *bchain.Tx, height uint32, ValueOutSat: (*Amount)(&valOutSat), Version: bchainTx.Version, Hex: bchainTx.Hex, + Rbf: rbf, Vin: vins, Vout: vouts, CoinSpecificData: bchainTx.CoinSpecificData, diff --git a/static/templates/txdetail.html b/static/templates/txdetail.html index 07ca9189..08989a25 100644 --- a/static/templates/txdetail.html +++ b/static/templates/txdetail.html @@ -3,6 +3,7 @@
{{$tx.Txid}} + {{- if $tx.Rbf}} ⚠️{{end -}}
{{- if $tx.Blocktime}}
{{if $tx.Confirmations}}mined{{else}}first seen{{end}} {{formatUnixTime $tx.Blocktime}}
{{end -}}