From f97f60bf3d7e9174db7c78211428856e8c852822 Mon Sep 17 00:00:00 2001 From: ziggie Date: Sun, 18 Aug 2024 11:46:44 +0200 Subject: [PATCH] api: check for an output to be unspent. --- btc/explorer_api.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/btc/explorer_api.go b/btc/explorer_api.go index c36b902..cd6cf04 100644 --- a/btc/explorer_api.go +++ b/btc/explorer_api.go @@ -156,10 +156,27 @@ func (a *ExplorerAPI) Unspent(addr string) ([]*Vout, error) { for _, tx := range txs { for voutIdx, vout := range tx.Vout { if vout.ScriptPubkeyAddr == addr { - vout.Outspend = &Outspend{ - Txid: tx.TXID, - Vin: voutIdx, + // We need to also make sure that the tx is not + // already spent before including it as unspent. + // + // NOTE: Somehow LND sometimes contructs + // channels with the same keyfamily base hence + // the same pubkey. Nees to be investigated on + // the LND side. + url := fmt.Sprintf( + "%s/tx/%s/outspend/%d", a.BaseURL, + tx.TXID, voutIdx, + ) + outspend := Outspend{} + err := fetchJSON(url, &outspend) + if err != nil { + return nil, err } + + if outspend.Spent { + continue + } + outputs = append(outputs, vout) } }