From 14b99c2e455974d32ee72ccfd9c4dec574858da2 Mon Sep 17 00:00:00 2001 From: vwinee21 Date: Wed, 13 May 2026 08:00:46 +0700 Subject: [PATCH] fix: use btcutil.DecodeAddress for Bitcoin address validation Replace fragile prefix matching with proper btcutil.DecodeAddress validation which includes checksum verification. Resolves TODO in IsBitcoinAddressForNetwork. --- spark/so/utils/btc_address_network.go | 31 ++++++--------------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/spark/so/utils/btc_address_network.go b/spark/so/utils/btc_address_network.go index 51897d400..3a5cdd071 100644 --- a/spark/so/utils/btc_address_network.go +++ b/spark/so/utils/btc_address_network.go @@ -1,34 +1,17 @@ package utils import ( - "strings" - + "github.com/btcsuite/btcd/btcutil" "github.com/lightsparkdev/spark/common/btcnetwork" ) -// IsBitcoinAddressForNetwork checks if the given Bitcoin address matches the expected prefix for the specified network. -// It uses simple prefix matching for common address types (legacy, P2SH, SegWit, Taproot) for each Bitcoin network. -// TODO: Investigate using btcutil for this instead of using our own. +// IsBitcoinAddressForNetwork checks if the given Bitcoin address is valid for the specified network. +// It uses btcutil.DecodeAddress for proper address validation including checksum verification. func IsBitcoinAddressForNetwork(address string, network btcnetwork.Network) bool { - switch network { - case btcnetwork.Mainnet: - return hasAnyPrefix(address, "bc1", "3", "1") - case btcnetwork.Regtest: - return hasAnyPrefix(address, "bcrt", "2", "m", "n") - case btcnetwork.Testnet: - return hasAnyPrefix(address, "tb1", "2", "m", "n") - case btcnetwork.Signet: - return hasAnyPrefix(address, "tb1", "sb1", "2", "m", "n") - default: + params, err := network.Params() + if err != nil { return false } -} - -func hasAnyPrefix(address string, prefixes ...string) bool { - for _, prefix := range prefixes { - if strings.HasPrefix(address, prefix) { - return true - } - } - return false + _, err = btcutil.DecodeAddress(address, params) + return err == nil }