mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
Do not allow rescan of wallet which are not segwit
This commit is contained in:
@@ -73,16 +73,16 @@ namespace BTCPayServer.Tests
|
|||||||
|
|
||||||
public BTCPayNetwork SupportedNetwork { get; set; }
|
public BTCPayNetwork SupportedNetwork { get; set; }
|
||||||
|
|
||||||
public WalletId RegisterDerivationScheme(string crytoCode)
|
public WalletId RegisterDerivationScheme(string crytoCode, bool segwit = false)
|
||||||
{
|
{
|
||||||
return RegisterDerivationSchemeAsync(crytoCode).GetAwaiter().GetResult();
|
return RegisterDerivationSchemeAsync(crytoCode, segwit).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
public async Task<WalletId> RegisterDerivationSchemeAsync(string cryptoCode)
|
public async Task<WalletId> RegisterDerivationSchemeAsync(string cryptoCode, bool segwit = false)
|
||||||
{
|
{
|
||||||
SupportedNetwork = parent.NetworkProvider.GetNetwork(cryptoCode);
|
SupportedNetwork = parent.NetworkProvider.GetNetwork(cryptoCode);
|
||||||
var store = parent.PayTester.GetController<StoresController>(UserId, StoreId);
|
var store = parent.PayTester.GetController<StoresController>(UserId, StoreId);
|
||||||
ExtKey = new ExtKey().GetWif(SupportedNetwork.NBitcoinNetwork);
|
ExtKey = new ExtKey().GetWif(SupportedNetwork.NBitcoinNetwork);
|
||||||
DerivationScheme = new DerivationStrategyFactory(SupportedNetwork.NBitcoinNetwork).Parse(ExtKey.Neuter().ToString() + "-[legacy]");
|
DerivationScheme = new DerivationStrategyFactory(SupportedNetwork.NBitcoinNetwork).Parse(ExtKey.Neuter().ToString() + (segwit ? "" : "-[legacy]"));
|
||||||
var vm = (StoreViewModel)((ViewResult)store.UpdateStore()).Model;
|
var vm = (StoreViewModel)((ViewResult)store.UpdateStore()).Model;
|
||||||
vm.SpeedPolicy = SpeedPolicy.MediumSpeed;
|
vm.SpeedPolicy = SpeedPolicy.MediumSpeed;
|
||||||
await store.UpdateStore(vm);
|
await store.UpdateStore(vm);
|
||||||
|
|||||||
@@ -593,15 +593,16 @@ namespace BTCPayServer.Tests
|
|||||||
tester.Start();
|
tester.Start();
|
||||||
var acc = tester.NewAccount();
|
var acc = tester.NewAccount();
|
||||||
acc.GrantAccess();
|
acc.GrantAccess();
|
||||||
acc.RegisterDerivationScheme("BTC");
|
acc.RegisterDerivationScheme("BTC", true);
|
||||||
var btcDerivationScheme = acc.DerivationScheme;
|
var btcDerivationScheme = acc.DerivationScheme;
|
||||||
acc.RegisterDerivationScheme("LTC");
|
acc.RegisterDerivationScheme("LTC", true);
|
||||||
|
|
||||||
var walletController = tester.PayTester.GetController<WalletsController>(acc.UserId);
|
var walletController = tester.PayTester.GetController<WalletsController>(acc.UserId);
|
||||||
WalletId walletId = new WalletId(acc.StoreId, "LTC");
|
WalletId walletId = new WalletId(acc.StoreId, "LTC");
|
||||||
var rescan = Assert.IsType<RescanWalletModel>(Assert.IsType<ViewResult>(walletController.WalletRescan(walletId).Result).Model);
|
var rescan = Assert.IsType<RescanWalletModel>(Assert.IsType<ViewResult>(walletController.WalletRescan(walletId).Result).Model);
|
||||||
Assert.False(rescan.Ok);
|
Assert.False(rescan.Ok);
|
||||||
Assert.True(rescan.IsFullySync);
|
Assert.True(rescan.IsFullySync);
|
||||||
|
Assert.True(rescan.IsSegwit);
|
||||||
Assert.False(rescan.IsSupportedByCurrency);
|
Assert.False(rescan.IsSupportedByCurrency);
|
||||||
Assert.False(rescan.IsServerAdmin);
|
Assert.False(rescan.IsServerAdmin);
|
||||||
|
|
||||||
|
|||||||
@@ -280,6 +280,9 @@ namespace BTCPayServer.Controllers
|
|||||||
|
|
||||||
var vm = new RescanWalletModel();
|
var vm = new RescanWalletModel();
|
||||||
vm.IsFullySync = _dashboard.IsFullySynched();
|
vm.IsFullySync = _dashboard.IsFullySynched();
|
||||||
|
// We need to ensure it is segwit,
|
||||||
|
// because hardware wallet support need the parent transactions to sign, which NBXplorer don't have. (Nor does a pruned node)
|
||||||
|
vm.IsSegwit = paymentMethod.DerivationStrategyBase.IsSegwit();
|
||||||
vm.IsServerAdmin = User.Claims.Any(c => c.Type == Policies.CanModifyServerSettings.Key && c.Value == "true");
|
vm.IsServerAdmin = User.Claims.Any(c => c.Type == Policies.CanModifyServerSettings.Key && c.Value == "true");
|
||||||
vm.IsSupportedByCurrency = _dashboard.Get(walletId.CryptoCode)?.Status?.BitcoinStatus?.Capabilities?.CanScanTxoutSet == true;
|
vm.IsSupportedByCurrency = _dashboard.Get(walletId.CryptoCode)?.Status?.BitcoinStatus?.Capabilities?.CanScanTxoutSet == true;
|
||||||
var explorer = ExplorerClientProvider.GetExplorerClient(walletId.CryptoCode);
|
var explorer = ExplorerClientProvider.GetExplorerClient(walletId.CryptoCode);
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ using System.Globalization;
|
|||||||
using BTCPayServer.Services;
|
using BTCPayServer.Services;
|
||||||
using BTCPayServer.Data;
|
using BTCPayServer.Data;
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using NBXplorer.DerivationStrategy;
|
||||||
|
|
||||||
namespace BTCPayServer
|
namespace BTCPayServer
|
||||||
{
|
{
|
||||||
@@ -128,6 +129,19 @@ namespace BTCPayServer
|
|||||||
resp.Headers[name] = value;
|
resp.Headers[name] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsSegwit(this DerivationStrategyBase derivationStrategyBase)
|
||||||
|
{
|
||||||
|
if (IsSegwitCore(derivationStrategyBase))
|
||||||
|
return true;
|
||||||
|
return (derivationStrategyBase is P2SHDerivationStrategy p2shStrat && IsSegwitCore(p2shStrat.Inner));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsSegwitCore(DerivationStrategyBase derivationStrategyBase)
|
||||||
|
{
|
||||||
|
return (derivationStrategyBase is P2WSHDerivationStrategy) ||
|
||||||
|
(derivationStrategyBase is DirectDerivationStrategy direct) && direct.Segwit;
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetAbsoluteRoot(this HttpRequest request)
|
public static string GetAbsoluteRoot(this HttpRequest request)
|
||||||
{
|
{
|
||||||
return string.Concat(
|
return string.Concat(
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ namespace BTCPayServer.Models.WalletViewModels
|
|||||||
public bool IsServerAdmin { get; set; }
|
public bool IsServerAdmin { get; set; }
|
||||||
public bool IsSupportedByCurrency { get; set; }
|
public bool IsSupportedByCurrency { get; set; }
|
||||||
public bool IsFullySync { get; set; }
|
public bool IsFullySync { get; set; }
|
||||||
public bool Ok => IsServerAdmin && IsSupportedByCurrency && IsFullySync;
|
public bool IsSegwit { get; set; }
|
||||||
|
public bool Ok => IsServerAdmin && IsSupportedByCurrency && IsFullySync && IsSegwit;
|
||||||
|
|
||||||
[Range(1000, 10_000)]
|
[Range(1000, 10_000)]
|
||||||
public int BatchSize { get; set; } = 3000;
|
public int BatchSize { get; set; } = 3000;
|
||||||
|
|||||||
@@ -36,6 +36,14 @@
|
|||||||
{
|
{
|
||||||
<p><span class="fa fa-times-circle" style="color:red;"></span> <span>This full node do not support rescan of the UTXO set</span></p>
|
<p><span class="fa fa-times-circle" style="color:red;"></span> <span>This full node do not support rescan of the UTXO set</span></p>
|
||||||
}
|
}
|
||||||
|
@if (Model.IsSegwit)
|
||||||
|
{
|
||||||
|
<p><span class="fa fa-check-circle" style="color:green;"></span> <span>This wallet is compatible with segwit</span></p>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<p><span class="fa fa-times-circle" style="color:red;"></span> <span>This wallet is not compatible with segwit</span></p>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user