diff --git a/.github/workflows/UnitTests.yml b/.github/workflows/UnitTests.yml index 8d584baadd..1c5954f884 100644 --- a/.github/workflows/UnitTests.yml +++ b/.github/workflows/UnitTests.yml @@ -4,13 +4,18 @@ on: pull_request: branches: - master + push: + branches: + - master jobs: build: runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] + steps: - name: Checkout code @@ -27,10 +32,4 @@ jobs: - name: Test run: dotnet test --no-restore --configuration Release --filter "UnitTests" --logger "console;verbosity=detailed" - continue-on-error: true - - - name: Check test results - if: failure() - run: | - echo "Tests failed on ${{ matrix.os }}" - exit 1 + diff --git a/WalletWasabi.Documentation/WasabiCompatibility.md b/WalletWasabi.Documentation/WasabiCompatibility.md index cfa8949b13..b78ac6d16b 100644 --- a/WalletWasabi.Documentation/WasabiCompatibility.md +++ b/WalletWasabi.Documentation/WasabiCompatibility.md @@ -19,11 +19,13 @@ This document lists all the officially supported software and devices by Wasabi - ColdCard MK2 - ColdCard MK3 - ColdCard MK4 +- ColdCard Q - Ledger Nano S - Ledger Nano S Plus - Ledger Nano X - Trezor Model T - Trezor Safe 3 +- Trezor Safe 5 1* The device by default asks for a "Pairing code", currently, there is no such function in Wasabi. Therefore, either disable the feature or unlock the device with BitBoxApp or hwi-qt before using it with Wasabi. diff --git a/WalletWasabi.Tests/AcceptanceTests/HwiKatas.cs b/WalletWasabi.Tests/AcceptanceTests/HwiKatas.cs index d7cb6b7a75..1e5fb813fc 100644 --- a/WalletWasabi.Tests/AcceptanceTests/HwiKatas.cs +++ b/WalletWasabi.Tests/AcceptanceTests/HwiKatas.cs @@ -176,6 +176,78 @@ public async Task TrezorSafe3KataAsync() Assert.Equal(TransactionCheckResult.Success, checkResult); } + [Fact] + public async Task TrezorSafe5KataAsync() + { + // --- USER INTERACTIONS --- + // + // Connect and initialize your Trezor Safe 5 with the following seed phrase: + // more maid moon upgrade layer alter marine screen benefit way cover alcohol + // NEVER STORE REAL MONEY ON THIS WALLET. IT IS NOT SAFE. + // Run this test. + // displayaddress request: swipe up 1 time and confirm + // displayaddress request: swipe up 1 time and confirm + // signtx request: select cancel 1 time and tap + // signtx request: swipe up 1 time and hold confirm + // + // --- USER INTERACTIONS --- + + var network = Network.Main; + var client = new HwiClient(network); + using var cts = new CancellationTokenSource(ReasonableRequestTimeout); + var enumerate = await client.EnumerateAsync(cts.Token); + Assert.Single(enumerate); + HwiEnumerateEntry entry = enumerate.Single(); + Assert.NotNull(entry.Path); + Assert.True(HwiValidationHelper.ValidatePathString(entry.Model, entry.Path)); + Assert.Equal(HardwareWalletModels.Trezor_Safe_5, entry.Model); + Assert.NotNull(entry.Fingerprint); + + string devicePath = entry.Path; + HardwareWalletModels deviceType = entry.Model; + HDFingerprint fingerprint = entry.Fingerprint!.Value; + + await Assert.ThrowsAsync(async () => await client.SetupAsync(deviceType, devicePath, false, cts.Token)); + + await Assert.ThrowsAsync(async () => await client.RestoreAsync(deviceType, devicePath, false, cts.Token)); + + await Assert.ThrowsAsync(async () => await client.PromptPinAsync(deviceType, devicePath, cts.Token)); + await Assert.ThrowsAsync(async () => await client.SendPinAsync(deviceType, devicePath, 1111, cts.Token)); + + KeyPath keyPath1 = new("m/84h/0h/0h/0/0"); + KeyPath keyPath2 = new("m/84h/0h/0h/0/1"); + ExtPubKey xpub1 = await client.GetXpubAsync(deviceType, devicePath, keyPath1, cts.Token); + ExtPubKey xpub2 = await client.GetXpubAsync(deviceType, devicePath, keyPath2, cts.Token); + Assert.NotNull(xpub1); + Assert.NotNull(xpub2); + Assert.NotEqual(xpub1, xpub2); + + // USER: CONFIRM + BitcoinWitPubKeyAddress address1 = await client.DisplayAddressAsync(deviceType, devicePath, keyPath1, cts.Token); + // USER: CONFIRM + BitcoinWitPubKeyAddress address2 = await client.DisplayAddressAsync(fingerprint, keyPath2, cts.Token); + Assert.NotNull(address1); + Assert.NotNull(address2); + Assert.NotEqual(address1, address2); + var expectedAddress1 = xpub1.PubKey.GetAddress(ScriptPubKeyType.Segwit, network); + var expectedAddress2 = xpub2.PubKey.GetAddress(ScriptPubKeyType.Segwit, network); + Assert.Equal(expectedAddress1, address1); + Assert.Equal(expectedAddress2, address2); + + // USER SHOULD REFUSE ACTION + var result = await Assert.ThrowsAsync(async () => await client.SignTxAsync(deviceType, devicePath, Psbt, cts.Token)); + Assert.Equal(HwiErrorCode.ActionCanceled, result.ErrorCode); + + // USER: Hold to confirm + PSBT signedPsbt = await client.SignTxAsync(deviceType, devicePath, Psbt, cts.Token); + + Transaction signedTx = signedPsbt.GetOriginalTransaction(); + Assert.Equal(Psbt.GetOriginalTransaction().GetHash(), signedTx.GetHash()); + + var checkResult = signedTx.Check(); + Assert.Equal(TransactionCheckResult.Success, checkResult); + } + [Fact] public async Task TrezorOneKataAsync() { diff --git a/WalletWasabi.Tests/Helpers/WabiSabiFactory.cs b/WalletWasabi.Tests/Helpers/WabiSabiFactory.cs index 2d6696bc99..e9a2a26b88 100644 --- a/WalletWasabi.Tests/Helpers/WabiSabiFactory.cs +++ b/WalletWasabi.Tests/Helpers/WabiSabiFactory.cs @@ -344,6 +344,7 @@ public static CoinJoinClient CreateTestCoinJoinClient( coinSelector, new CoinJoinConfiguration("CoinJoinCoordinatorIdentifier", 0.3m, 150.0m, 1, AllowSoloCoinjoining: true), new LiquidityClueProvider(), + 0, TimeSpan.Zero, TimeSpan.Zero, null); diff --git a/WalletWasabi.Tests/UnitTests/BitcoinCore/CoreConfigTests.cs b/WalletWasabi.Tests/UnitTests/BitcoinCore/CoreConfigTests.cs index 2a781a750d..ffb89039ba 100644 --- a/WalletWasabi.Tests/UnitTests/BitcoinCore/CoreConfigTests.cs +++ b/WalletWasabi.Tests/UnitTests/BitcoinCore/CoreConfigTests.cs @@ -17,29 +17,29 @@ public void RemovesEmptyDuplications() var config = new CoreConfig(); config.AddOrUpdate(configStringBuilder.ToString()); - var expectedConfig = + var expectedConfig = EnsureNewLine( """ foo = bar bar = bar - """; + """); Assert.Equal(expectedConfig, config.ToString()); } [Fact] public void CanParse() { - var testConfig = + var testConfig = EnsureNewLine( """ foo=buz foo = bar - """; + """); testConfig += Environment.NewLine; testConfig += Environment.NewLine; testConfig += Environment.NewLine; - testConfig += + testConfig += EnsureNewLine( """ foo = bar foo bar = buz quxx @@ -48,11 +48,11 @@ public void CanParse() foo bar #qoo=boo - """; + """); var coreConfig = new CoreConfig(); coreConfig.AddOrUpdate(testConfig); - var expectedConfig = + var expectedConfig = EnsureNewLine( """ foo = bar @@ -63,7 +63,7 @@ public void CanParse() bar #qoo=boo - """; + """); Assert.Equal(expectedConfig, coreConfig.ToString()); @@ -122,7 +122,7 @@ public void CanParse() Assert.Equal("bar", fooValue); Assert.Equal("0", tooValue); - expectedConfig = + expectedConfig = EnsureNewLine( """ foo = bar @@ -134,11 +134,11 @@ public void CanParse() moo = 1 too = 0 - """; + """); Assert.Equal(expectedConfig, coreConfig.ToString()); - var expectedConfig2 = + var expectedConfig2 = EnsureNewLine( """ foo = bar @@ -150,27 +150,27 @@ public void CanParse() moo = 1 too = 0 - """; + """); Assert.Equal(expectedConfig2, coreConfig2.ToString()); } [Fact] public void KeepsOrder() { - var testConfig = + var testConfig = EnsureNewLine( """ foo=bar buz=qux - """; + """); var coreConfig = new CoreConfig(); coreConfig.AddOrUpdate(testConfig); - var expectedConfig = + var expectedConfig = EnsureNewLine( """ foo = bar buz = qux - """; + """); Assert.Equal(expectedConfig, coreConfig.ToString()); @@ -183,7 +183,7 @@ public void KeepsOrder() [Fact] public void HandlesSections() { - var testConfig = + var testConfig = EnsureNewLine( """ qux=1 [main] @@ -198,11 +198,11 @@ public void HandlesSections() [main] buz=1 test.buz=2 - """; + """); var coreConfig = new CoreConfig(); coreConfig.AddOrUpdate(testConfig); - var expectedConfig = + var expectedConfig = EnsureNewLine( """ qux = 1 main.foo = 1 @@ -214,8 +214,11 @@ public void HandlesSections() main.buz = 1 test.buz = 2 - """; + """); Assert.Equal(expectedConfig, coreConfig.ToString()); } + + // Depending on the source the new lines in """...""" block might be a simple '\n' regardless of the OS + public string EnsureNewLine(string text) => text.Replace("\r\n", "\n").Replace("\n", Environment.NewLine); } diff --git a/WalletWasabi.Tests/UnitTests/Hwi/HwiProcessBridgeMock.cs b/WalletWasabi.Tests/UnitTests/Hwi/HwiProcessBridgeMock.cs index cdaad2a2f6..937ed26564 100644 --- a/WalletWasabi.Tests/UnitTests/Hwi/HwiProcessBridgeMock.cs +++ b/WalletWasabi.Tests/UnitTests/Hwi/HwiProcessBridgeMock.cs @@ -33,6 +33,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) HardwareWalletModels.Trezor_T => "trezor_t", HardwareWalletModels.Trezor_1 => "trezor_1", HardwareWalletModels.Trezor_Safe_3 => "trezor_safe_3", + HardwareWalletModels.Trezor_Safe_5 => "trezor_safe_5", HardwareWalletModels.Coldcard => "coldcard", HardwareWalletModels.Ledger_Nano_S => "ledger_nano_s", HardwareWalletModels.Ledger_Nano_X => "ledger_nano_x", @@ -45,7 +46,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) rawPath = Model switch { HardwareWalletModels.Trezor_T => "webusb: 001:4", - HardwareWalletModels.Trezor_Safe_3 => "webusb: 001:9", + HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => "webusb: 001:9", HardwareWalletModels.Trezor_1 => "hid:\\\\\\\\?\\\\hid#vid_534c&pid_0001&mi_00#7&6f0b727&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}", HardwareWalletModels.Coldcard => @"\\\\?\\hid#vid_d13e&pid_cc10&mi_00#7&1b239988&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}", HardwareWalletModels.Ledger_Nano_S => "\\\\\\\\?\\\\hid#vid_2c97&pid_0001&mi_00#7&e45ae20&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}", @@ -68,7 +69,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) response = Model switch { HardwareWalletModels.Trezor_T => $"[{{\"model\": \"{model}\", \"path\": \"{rawPath}\", \"needs_pin_sent\": false, \"needs_passphrase_sent\": false, \"error\": \"Not initialized\"}}]", - HardwareWalletModels.Trezor_Safe_3 => $"[{{\"model\": \"{model}\", \"label\": \"Test trezor\", \"type\":\"trezor\", \"path\": \"{rawPath}\", \"needs_pin_sent\": false, \"needs_passphrase_sent\": false, \"fingerprint\": \"e5dbc9cb\"}}]", + HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => $"[{{\"model\": \"{model}\", \"label\": \"Test trezor\", \"type\":\"trezor\", \"path\": \"{rawPath}\", \"needs_pin_sent\": false, \"needs_passphrase_sent\": false, \"fingerprint\": \"e5dbc9cb\"}}]", HardwareWalletModels.Trezor_1 => $"[{{\"model\": \"{model}\", \"path\": \"{rawPath}\", \"needs_pin_sent\": true, \"needs_passphrase_sent\": false, \"error\": \"Could not open client or get fingerprint information: Trezor is locked. Unlock by using 'promptpin' and then 'sendpin'.\", \"code\": -12}}]\r\n", HardwareWalletModels.Coldcard => $"[{{\"model\": \"{model}\", \"path\": \"{rawPath}\", \"needs_passphrase\": false, \"fingerprint\": \"a3d0d797\"}}]\r\n", HardwareWalletModels.Ledger_Nano_S => $"[{{\"model\": \"{model}\", \"path\": \"{rawPath}\", \"fingerprint\": \"4054d6f6\", \"needs_pin_sent\": false, \"needs_passphrase_sent\": false}}]\r\n", @@ -82,7 +83,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => SuccessTrueResponse, + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => SuccessTrueResponse, HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not support wiping via software\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not support wiping via software\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not support wiping via software\", \"code\": -9}\r\n", @@ -95,7 +96,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => "{\"error\": \"setup requires interactive mode\", \"code\": -9}", + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => "{\"error\": \"setup requires interactive mode\", \"code\": -9}", HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not support software setup\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not support software setup\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not support software setup\", \"code\": -9}\r\n", @@ -108,7 +109,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => SuccessTrueResponse, + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => SuccessTrueResponse, HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not support software setup\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not support software setup\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not support software setup\", \"code\": -9}\r\n", @@ -121,7 +122,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => SuccessTrueResponse, + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => SuccessTrueResponse, HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not support restoring via software\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not support restoring via software\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not support restoring via software\", \"code\": -9}\r\n", @@ -134,7 +135,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => "{\"error\": \"The PIN has already been sent to this device\", \"code\": -11}", + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => "{\"error\": \"The PIN has already been sent to this device\", \"code\": -11}", HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not need a PIN sent from the host\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not need a PIN sent from the host\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not need a PIN sent from the host\", \"code\": -9}\r\n", @@ -147,7 +148,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { response = Model switch { - HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 => "{\"error\": \"The PIN has already been sent to this device\", \"code\": -11}", + HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => "{\"error\": \"The PIN has already been sent to this device\", \"code\": -11}", HardwareWalletModels.Coldcard => "{\"error\": \"The Coldcard does not need a PIN sent from the host\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_S => "{\"error\": \"The Ledger Nano S does not need a PIN sent from the host\", \"code\": -9}\r\n", HardwareWalletModels.Ledger_Nano_X => "{\"error\": \"The Ledger Nano X does not need a PIN sent from the host\", \"code\": -9}\r\n", @@ -162,6 +163,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { case HardwareWalletModels.Trezor_T: case HardwareWalletModels.Trezor_Safe_3: + case HardwareWalletModels.Trezor_Safe_5: case HardwareWalletModels.Trezor_1: case HardwareWalletModels.Coldcard: case HardwareWalletModels.Ledger_Nano_S: @@ -178,6 +180,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { case HardwareWalletModels.Trezor_T: case HardwareWalletModels.Trezor_Safe_3: + case HardwareWalletModels.Trezor_Safe_5: case HardwareWalletModels.Trezor_1: case HardwareWalletModels.Coldcard: case HardwareWalletModels.Ledger_Nano_S: @@ -196,6 +199,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { case HardwareWalletModels.Trezor_T: case HardwareWalletModels.Trezor_Safe_3: + case HardwareWalletModels.Trezor_Safe_5: case HardwareWalletModels.Trezor_1: case HardwareWalletModels.Coldcard: case HardwareWalletModels.Ledger_Nano_S: @@ -214,6 +218,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { case HardwareWalletModels.Trezor_T: case HardwareWalletModels.Trezor_Safe_3: + case HardwareWalletModels.Trezor_Safe_5: case HardwareWalletModels.Trezor_1: case HardwareWalletModels.Coldcard: case HardwareWalletModels.Ledger_Nano_S: @@ -230,6 +235,7 @@ public HwiProcessBridgeMock(HardwareWalletModels model) { case HardwareWalletModels.Trezor_T: case HardwareWalletModels.Trezor_Safe_3: + case HardwareWalletModels.Trezor_Safe_5: case HardwareWalletModels.Trezor_1: case HardwareWalletModels.Coldcard: case HardwareWalletModels.Ledger_Nano_S: diff --git a/WalletWasabi/Helpers/Constants.cs b/WalletWasabi/Helpers/Constants.cs index e2ab378815..523e70c690 100644 --- a/WalletWasabi/Helpers/Constants.cs +++ b/WalletWasabi/Helpers/Constants.cs @@ -91,7 +91,7 @@ public static class Constants public static readonly Version ClientVersion = new(2, 0, 12, 0); - public static readonly Version HwiVersion = new("3.0.0"); + public static readonly Version HwiVersion = new("3.1.0"); public static readonly Version BitcoinCoreVersion = new("23.0"); public static readonly Version GingerLegalDocumentsVersion = new(5, 0); diff --git a/WalletWasabi/Hwi/Models/HardwareWalletModels.cs b/WalletWasabi/Hwi/Models/HardwareWalletModels.cs index 45298288e4..9c2a1b0b30 100644 --- a/WalletWasabi/Hwi/Models/HardwareWalletModels.cs +++ b/WalletWasabi/Hwi/Models/HardwareWalletModels.cs @@ -52,6 +52,9 @@ public enum HardwareWalletModels [FriendlyName("Trezor Safe 3")] Trezor_Safe_3, + [FriendlyName("Trezor Safe 5")] + Trezor_Safe_5, + [FriendlyName("BitBox")] BitBox02_BTCOnly, diff --git a/WalletWasabi/Hwi/Models/HwiEnumerateEntry.cs b/WalletWasabi/Hwi/Models/HwiEnumerateEntry.cs index 88295d4c59..40912819f0 100644 --- a/WalletWasabi/Hwi/Models/HwiEnumerateEntry.cs +++ b/WalletWasabi/Hwi/Models/HwiEnumerateEntry.cs @@ -46,7 +46,7 @@ public HwiEnumerateEntry( { HardwareWalletModels.Coldcard or HardwareWalletModels.Coldcard_Simulator => WalletType.Coldcard, HardwareWalletModels.Ledger_Nano_S or HardwareWalletModels.Ledger_Nano_X or HardwareWalletModels.Ledger_Nano_S_Plus => WalletType.Ledger, - HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_1_Simulator or HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_T_Simulator or HardwareWalletModels.Trezor_Safe_3 => WalletType.Trezor, + HardwareWalletModels.Trezor_1 or HardwareWalletModels.Trezor_1_Simulator or HardwareWalletModels.Trezor_T or HardwareWalletModels.Trezor_T_Simulator or HardwareWalletModels.Trezor_Safe_3 or HardwareWalletModels.Trezor_Safe_5 => WalletType.Trezor, HardwareWalletModels.Jade => WalletType.Jade, HardwareWalletModels.BitBox02_BTCOnly => WalletType.BitBox, _ => WalletType.Hardware diff --git a/WalletWasabi/Microservices/Binaries/lin64/hwi b/WalletWasabi/Microservices/Binaries/lin64/hwi index cc52d11354..8f1aefba6b 100755 Binary files a/WalletWasabi/Microservices/Binaries/lin64/hwi and b/WalletWasabi/Microservices/Binaries/lin64/hwi differ diff --git a/WalletWasabi/Microservices/Binaries/osx64/hwi b/WalletWasabi/Microservices/Binaries/osx64/hwi index 25b6718b53..747f207b3c 100755 Binary files a/WalletWasabi/Microservices/Binaries/osx64/hwi and b/WalletWasabi/Microservices/Binaries/osx64/hwi differ diff --git a/WalletWasabi/Microservices/Binaries/win64/hwi.exe b/WalletWasabi/Microservices/Binaries/win64/hwi.exe index 0873bbefdf..bc038d0f8e 100755 Binary files a/WalletWasabi/Microservices/Binaries/win64/hwi.exe and b/WalletWasabi/Microservices/Binaries/win64/hwi.exe differ