From 30c7cbba96f55f08118fbba30888632bc56d8d1a Mon Sep 17 00:00:00 2001 From: Andrew Camilleri Date: Tue, 9 Mar 2021 04:45:56 +0100 Subject: [PATCH] Fix issue around new bech uppercase + vault supported flag (#2337) --- .../BTCPayNetworkProvider.Groestlcoin.cs | 3 ++- BTCPayServer.Common/BTCPayNetwork.cs | 2 +- .../BTCPayNetworkProvider.Bitcoin.cs | 1 + .../Bitcoin/BitcoinLikePaymentHandler.cs | 20 +++++++++---------- .../Views/Stores/ImportWalletOptions.cshtml | 3 ++- .../Views/Wallets/WalletSigningMenu.cshtml | 3 ++- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/BTCPayServer.Common/Altcoins/BTCPayNetworkProvider.Groestlcoin.cs b/BTCPayServer.Common/Altcoins/BTCPayNetworkProvider.Groestlcoin.cs index 5a412dff2..a4bc12595 100644 --- a/BTCPayServer.Common/Altcoins/BTCPayNetworkProvider.Groestlcoin.cs +++ b/BTCPayServer.Common/Altcoins/BTCPayNetworkProvider.Groestlcoin.cs @@ -26,7 +26,8 @@ namespace BTCPayServer DefaultSettings = BTCPayDefaultSettings.GetDefaultSettings(NetworkType), CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("17'") : new KeyPath("1'"), SupportRBF = true, - SupportPayJoin = true + SupportPayJoin = true, + VaultSupported = true }); } } diff --git a/BTCPayServer.Common/BTCPayNetwork.cs b/BTCPayServer.Common/BTCPayNetwork.cs index c5a275fdf..d93ed015a 100644 --- a/BTCPayServer.Common/BTCPayNetwork.cs +++ b/BTCPayServer.Common/BTCPayNetwork.cs @@ -63,7 +63,7 @@ namespace BTCPayServer public virtual bool WalletSupported { get; set; } = true; public virtual bool ReadonlyWallet { get; set; } = false; - + public virtual bool VaultSupported { get; set; } = false; public int MaxTrackedConfirmation { get; internal set; } = 6; public string UriScheme { get; internal set; } public bool SupportPayJoin { get; set; } = false; diff --git a/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs b/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs index 4e16b106d..e6e6bdda2 100644 --- a/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs +++ b/BTCPayServer.Common/BTCPayNetworkProvider.Bitcoin.cs @@ -24,6 +24,7 @@ namespace BTCPayServer CoinType = NetworkType == ChainName.Mainnet ? new KeyPath("0'") : new KeyPath("1'"), SupportRBF = true, SupportPayJoin = true, + VaultSupported = true, //https://github.com/spesmilo/electrum/blob/11733d6bc271646a00b69ff07657119598874da4/electrum/constants.py ElectrumMapping = NetworkType == ChainName.Mainnet ? new Dictionary() diff --git a/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs b/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs index 7a324a855..f883ebcf0 100644 --- a/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs +++ b/BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs @@ -24,7 +24,7 @@ namespace BTCPayServer.Payments.Bitcoin private readonly IFeeProviderFactory _FeeRateProviderFactory; private readonly NBXplorerDashboard _dashboard; private readonly Services.Wallets.BTCPayWalletProvider _WalletProvider; - private readonly string _bech32Prefix; + private readonly Dictionary _bech32Prefix; public BitcoinLikePaymentHandler(ExplorerClientProvider provider, BTCPayNetworkProvider networkProvider, @@ -38,11 +38,12 @@ namespace BTCPayServer.Payments.Bitcoin _dashboard = dashboard; _WalletProvider = walletProvider; - - var currentNetwork = (BTCPayNetwork)networkProvider.GetNetwork("BTC"); - _bech32Prefix = Encoders.ASCII.EncodeData( - currentNetwork.NBitcoinNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false).HumanReadablePart - ); + _bech32Prefix = networkProvider.GetAll().OfType() + .Where(network => network.NBitcoinNetwork?.Consensus?.SupportSegwit is true).ToDictionary(network => network.CryptoCode, + network => Encoders.ASCII.EncodeData( + network.NBitcoinNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false) + .HumanReadablePart)); + } class Prepare @@ -62,9 +63,8 @@ namespace BTCPayServer.Payments.Bitcoin model.FeeRate = ((BitcoinLikeOnChainPaymentMethod) paymentMethod.GetPaymentMethodDetails()).GetFeeRate(); model.PaymentMethodName = GetPaymentMethodName(network); - var lightningFallback = ""; - if (storeBlob.OnChainWithLnInvoiceFallback) + if (network.SupportLightning && storeBlob.OnChainWithLnInvoiceFallback) { var lightningInfo = invoiceResponse.CryptoInfo.FirstOrDefault(a => a.GetpaymentMethodId() == new PaymentMethodId(model.CryptoCode, PaymentTypes.LightningLike)); @@ -82,10 +82,10 @@ namespace BTCPayServer.Payments.Bitcoin // + lightningFallback.ToUpperInvariant().Replace("LIGHTNING=", "lightning=", StringComparison.OrdinalIgnoreCase); // We're leading the way in Bitcoin community with adding UPPERCASE Bech32 addresses in QR Code - if (model.BtcAddress.StartsWith(_bech32Prefix, StringComparison.OrdinalIgnoreCase)) + if (_bech32Prefix.TryGetValue(model.CryptoCode, out var prefix) && model.BtcAddress.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { model.InvoiceBitcoinUrlQR = model.InvoiceBitcoinUrlQR.Replace( - $"bitcoin:{model.BtcAddress}", $"bitcoin:{model.BtcAddress.ToUpperInvariant()}", + $"{network.UriScheme}:{model.BtcAddress}", $"{network.UriScheme}:{model.BtcAddress.ToUpperInvariant()}", StringComparison.OrdinalIgnoreCase ); } diff --git a/BTCPayServer/Views/Stores/ImportWalletOptions.cshtml b/BTCPayServer/Views/Stores/ImportWalletOptions.cshtml index 85c8df49a..b4443584b 100644 --- a/BTCPayServer/Views/Stores/ImportWalletOptions.cshtml +++ b/BTCPayServer/Views/Stores/ImportWalletOptions.cshtml @@ -1,4 +1,5 @@ @model WalletSetupViewModel +@inject BTCPayNetworkProvider BTCPayNetworkProvider @addTagHelper *, BundlerMinifier.TagHelpers @{ Layout = "_LayoutWalletSetup"; @@ -16,7 +17,7 @@

The following methods assume that you already have an existing wallet created and backed up.

-@if (Model.CryptoCode == "BTC") +@if (BTCPayNetworkProvider.GetNetwork(Model.CryptoCode).VaultSupported) {
diff --git a/BTCPayServer/Views/Wallets/WalletSigningMenu.cshtml b/BTCPayServer/Views/Wallets/WalletSigningMenu.cshtml index 7c8ca78a1..a7e945dc8 100644 --- a/BTCPayServer/Views/Wallets/WalletSigningMenu.cshtml +++ b/BTCPayServer/Views/Wallets/WalletSigningMenu.cshtml @@ -1,3 +1,4 @@ +@inject BTCPayNetworkProvider BTCPayNetworkProvider @model (string CryptoCode, bool NBXSeedAvailable) @@ -6,7 +7,7 @@ Sign with...