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