diff --git a/BTCPayServer/Controllers/StoresController.Onchain.cs b/BTCPayServer/Controllers/StoresController.Onchain.cs index f1ddd597a..c31c8b294 100644 --- a/BTCPayServer/Controllers/StoresController.Onchain.cs +++ b/BTCPayServer/Controllers/StoresController.Onchain.cs @@ -55,7 +55,9 @@ namespace BTCPayServer.Controllers vm.RootKeyPath = network.GetRootKeyPath(); vm.CanUseHotWallet = hotWallet; vm.CanUseRPCImport = rpcImport; - vm.CanUseTaproot = TaprootSupported(vm.CryptoCode); + vm.SupportTaproot = network.NBitcoinNetwork.Consensus.SupportTaproot; + vm.SupportSegwit = network.NBitcoinNetwork.Consensus.SupportSegwit; + vm.IsTaprootActivated = TaprootActivated(vm.CryptoCode); if (vm.Method == null) { @@ -110,11 +112,6 @@ namespace BTCPayServer.Controllers try { strategy = ParseDerivationStrategy(vm.DerivationScheme, network); - if(strategy.AccountDerivation is TaprootDerivationStrategy && !TaprootSupported(vm.CryptoCode)) - { - ModelState.AddModelError(nameof(vm.DerivationScheme), "Taproot is not supported"); - return View(vm.ViewName, vm); - } strategy.Source = "ManualDerivationScheme"; if (!string.IsNullOrEmpty(vm.AccountKey)) { @@ -214,7 +211,9 @@ namespace BTCPayServer.Controllers vm.CanUseHotWallet = hotWallet; vm.CanUseRPCImport = rpcImport; - vm.CanUseTaproot = TaprootSupported(vm.CryptoCode); + vm.SupportTaproot = network.NBitcoinNetwork.Consensus.SupportTaproot; + vm.SupportSegwit = network.NBitcoinNetwork.Consensus.SupportSegwit; + vm.IsTaprootActivated = TaprootActivated(vm.CryptoCode); vm.RootKeyPath = network.GetRootKeyPath(); vm.Network = network; @@ -266,14 +265,11 @@ namespace BTCPayServer.Controllers IsHotWallet = isImport ? request.SavePrivateKeys : method == WalletSetupMethod.HotWallet, DerivationSchemeFormat = "BTCPay", CanUseHotWallet = hotWallet, - CanUseRPCImport = rpcImport + CanUseRPCImport = rpcImport, + IsTaprootActivated = TaprootActivated(cryptoCode), + SupportTaproot = network.NBitcoinNetwork.Consensus.SupportTaproot, + SupportSegwit = network.NBitcoinNetwork.Consensus.SupportSegwit }; - - if (request.ScriptPubKeyType == ScriptPubKeyType.TaprootBIP86 && !TaprootSupported(cryptoCode) ) - { - ModelState.AddModelError(nameof(request.ScriptPubKeyType), $"Taproot not supported"); - return View(vm.ViewName, vm); - } if (isImport && string.IsNullOrEmpty(request.ExistingMnemonic)) { diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index e2f00163d..5539af5a6 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -146,11 +146,16 @@ namespace BTCPayServer.Controllers } } - public bool TaprootSupported(string crytoCode) + public bool TaprootActivated(string crytoCode) { - var networkSupport = ((BTCPayNetwork)_NetworkProvider.GetNetwork(crytoCode))?.NBitcoinNetwork?.Consensus?.SupportTaproot is true; + var network = (BTCPayNetwork)_NetworkProvider.GetNetwork(crytoCode); +#pragma warning disable CS0618 + if (!(network.IsBTC && network.NBitcoinNetwork.ChainName == ChainName.Mainnet)) + // Consider it activated for everything that is not mainnet bitcoin + return true; +#pragma warning restore CS0618 var status = _Dashboard.Get(crytoCode).Status; - return networkSupport && !(status.NetworkType == ChainName.Mainnet && status.ChainHeight < 709632); + return status.ChainHeight >= 709632; } diff --git a/BTCPayServer/Models/StoreViewModels/DerivationSchemeViewModel.cs b/BTCPayServer/Models/StoreViewModels/DerivationSchemeViewModel.cs index eaf2f2baf..6f6846217 100644 --- a/BTCPayServer/Models/StoreViewModels/DerivationSchemeViewModel.cs +++ b/BTCPayServer/Models/StoreViewModels/DerivationSchemeViewModel.cs @@ -39,8 +39,10 @@ namespace BTCPayServer.Models.StoreViewModels public bool CanUseHotWallet { get; set; } [Display(Name = "Can use RPC import")] public bool CanUseRPCImport { get; set; } - [Display(Name = "Can use Taproot")] - public bool CanUseTaproot { get; set; } + public bool SupportSegwit { get; set; } + public bool SupportTaproot { get; set; } + [Display(Name = "Is taproot activated")] + public bool IsTaprootActivated { get; set; } public RootedKeyPath GetAccountKeypath() { if (KeyPath != null && RootFingerprint != null && diff --git a/BTCPayServer/Views/Stores/GenerateWallet.cshtml b/BTCPayServer/Views/Stores/GenerateWallet.cshtml index e5d99c66b..e87dd8863 100644 --- a/BTCPayServer/Views/Stores/GenerateWallet.cshtml +++ b/BTCPayServer/Views/Stores/GenerateWallet.cshtml @@ -7,7 +7,9 @@ ViewData.SetActivePageAndTitle(StoreNavPages.Wallet, $"Create {Model.CryptoCode} {type} Wallet", Context.GetStoreData().StoreName); ViewData.Add(nameof(Model.CanUseHotWallet), Model.CanUseHotWallet); ViewData.Add(nameof(Model.CanUseRPCImport), Model.CanUseRPCImport); - ViewData.Add(nameof(Model.CanUseTaproot), Model.CanUseTaproot); + ViewData.Add(nameof(Model.IsTaprootActivated), Model.IsTaprootActivated); + ViewData.Add(nameof(Model.SupportSegwit), Model.SupportSegwit); + ViewData.Add(nameof(Model.SupportTaproot), Model.SupportTaproot); ViewData.Add(nameof(Model.Method), Model.Method); } diff --git a/BTCPayServer/Views/Stores/ImportWallet/Seed.cshtml b/BTCPayServer/Views/Stores/ImportWallet/Seed.cshtml index c82b6cb40..aaf66a053 100644 --- a/BTCPayServer/Views/Stores/ImportWallet/Seed.cshtml +++ b/BTCPayServer/Views/Stores/ImportWallet/Seed.cshtml @@ -21,7 +21,9 @@ { ViewData.Add(nameof(Model.CanUseHotWallet), Model.CanUseHotWallet); ViewData.Add(nameof(Model.CanUseRPCImport), Model.CanUseRPCImport); - ViewData.Add(nameof(Model.CanUseTaproot), Model.CanUseTaproot); + ViewData.Add(nameof(Model.IsTaprootActivated), Model.IsTaprootActivated); + ViewData.Add(nameof(Model.SupportSegwit), Model.SupportSegwit); + ViewData.Add(nameof(Model.SupportTaproot), Model.SupportTaproot); ViewData.Add(nameof(Model.Method), Model.Method); diff --git a/BTCPayServer/Views/Stores/ImportWallet/Xpub.cshtml b/BTCPayServer/Views/Stores/ImportWallet/Xpub.cshtml index ea7f1e94b..3a3d35546 100644 --- a/BTCPayServer/Views/Stores/ImportWallet/Xpub.cshtml +++ b/BTCPayServer/Views/Stores/ImportWallet/Xpub.cshtml @@ -47,32 +47,35 @@ - - P2WPKH - xpub… - - - zpub… - - - wpkh(xpub…/0/*) - - - wpkh([…/84'/0'/0']xpub…/0/*) - - - P2SH-P2WPKH - xpub…-[p2sh] - - - ypub… - - - sh(wpkh(xpub…/0/*) - - - sh(wpkh([…/49'/0'/0']xpub…/0/*) - + @if (Model.SupportSegwit) + { + + P2WPKH + xpub… + + + zpub… + + + wpkh(xpub…/0/*) + + + wpkh([…/84'/0'/0']xpub…/0/*) + + + P2SH-P2WPKH + xpub…-[p2sh] + + + ypub… + + + sh(wpkh(xpub…/0/*) + + + sh(wpkh([…/49'/0'/0']xpub…/0/*) + + } P2PKH xpub…-[legacy] @@ -83,7 +86,7 @@ pkh(xpub…/0/*) - @if (Model.CanUseTaproot) + @if (Model.SupportTaproot && Model.IsTaprootActivated) { P2TR diff --git a/BTCPayServer/Views/Stores/_GenerateWalletForm.cshtml b/BTCPayServer/Views/Stores/_GenerateWalletForm.cshtml index bdc2eea21..c0b94d650 100644 --- a/BTCPayServer/Views/Stores/_GenerateWalletForm.cshtml +++ b/BTCPayServer/Views/Stores/_GenerateWalletForm.cshtml @@ -7,7 +7,7 @@ var isHotWallet = method is WalletSetupMethod.HotWallet; var canUseHotWallet = ViewData["CanUseHotWallet"] is true; var canUseRpcImport = ViewData["CanUseRPCImport"] is true; - var canUseTaproot = ViewData["CanUseTaproot"] is true; + var isTaprootActivated = ViewData["IsTaprootActivated"] is true; } @if (!User.IsInRole(Roles.ServerAdmin)) @@ -34,12 +34,27 @@