Skip to content

Commit ae1367b

Browse files
committed
fix: Gate testnet exchange behind staging env and warn on access instead of crashing startup
1 parent aa73e3b commit ae1367b

283 files changed

Lines changed: 3166 additions & 3447 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/core/bitbox/data/datasources/bitbox_device_datasource.dart

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,23 @@ class BitBoxDeviceDatasource {
1212
Future<List<BitBoxDeviceModel>> scanDevices() async {
1313
try {
1414
if (!Platform.isAndroid) {
15-
throw const BitBoxError.operationFailed(message: 'BitBox is only supported on Android');
15+
throw const BitBoxError.operationFailed(
16+
message: 'BitBox is only supported on Android',
17+
);
1618
}
17-
19+
1820
final devices = await BitBoxApi.scanDevices();
19-
20-
return devices.map((device) => BitBoxDeviceModel.fromBitBoxDevice(
21-
deviceName: device.deviceName,
22-
serialNumber: device.serialNumber,
23-
product: device.product,
24-
connectionType: BitBoxConnectionType.usb,
25-
)).toList();
21+
22+
return devices
23+
.map(
24+
(device) => BitBoxDeviceModel.fromBitBoxDevice(
25+
deviceName: device.deviceName,
26+
serialNumber: device.serialNumber,
27+
product: device.product,
28+
connectionType: BitBoxConnectionType.usb,
29+
),
30+
)
31+
.toList();
2632
} catch (e) {
2733
if (e is BitBoxError) rethrow;
2834
throw BitBoxError.operationFailed(message: e.toString());
@@ -32,22 +38,28 @@ class BitBoxDeviceDatasource {
3238
Future<BitBoxDeviceModel> connectDevice(BitBoxDeviceModel device) async {
3339
try {
3440
if (!Platform.isAndroid) {
35-
throw const BitBoxError.operationFailed(message: 'BitBox is only supported on Android');
41+
throw const BitBoxError.operationFailed(
42+
message: 'BitBox is only supported on Android',
43+
);
3644
}
37-
38-
final hasPermission = await BitBoxApi.requestPermission(device.deviceName);
45+
46+
final hasPermission = await BitBoxApi.requestPermission(
47+
device.deviceName,
48+
);
3949
if (!hasPermission) {
4050
throw const BitBoxError.permissionDenied();
4151
}
42-
52+
4353
final opened = await BitBoxApi.openDevice(
44-
device.deviceName,
54+
device.deviceName,
4555
device.serialNumber,
4656
);
4757
if (!opened) {
48-
throw const BitBoxError.operationFailed(message: 'Failed to open device');
58+
throw const BitBoxError.operationFailed(
59+
message: 'Failed to open device',
60+
);
4961
}
50-
62+
5163
_connectedDevices.add(device.serialNumber);
5264
_cachedDevice = device;
5365
return device;
@@ -60,7 +72,7 @@ class BitBoxDeviceDatasource {
6072
Future<String> unlockDevice(BitBoxDeviceModel device) async {
6173
try {
6274
final pairingCode = await BitBoxApi.startPairing(device.serialNumber);
63-
75+
6476
if (pairingCode != null && pairingCode.isNotEmpty) {
6577
return pairingCode;
6678
} else {
@@ -74,11 +86,13 @@ class BitBoxDeviceDatasource {
7486
Future<String> pairDevice(BitBoxDeviceModel device) async {
7587
try {
7688
final confirmed = await BitBoxApi.confirmPairing(device.serialNumber);
77-
89+
7890
if (!confirmed) {
79-
throw const BitBoxError.operationFailed(message: 'Pairing confirmation failed');
91+
throw const BitBoxError.operationFailed(
92+
message: 'Pairing confirmation failed',
93+
);
8094
}
81-
95+
8296
return await BitBoxApi.getRootFingerprint(device.serialNumber);
8397
} catch (e) {
8498
throw BitBoxError.operationFailed(message: e.toString());
@@ -93,7 +107,7 @@ class BitBoxDeviceDatasource {
93107
}) async {
94108
try {
95109
final xpubType = isTestnet ? 'tpub' : 'xpub';
96-
110+
97111
final xpub = await BitBoxApi.getBtcXpub(
98112
serialNumber: device.serialNumber,
99113
keypath: derivationPath,
@@ -140,8 +154,10 @@ class BitBoxDeviceDatasource {
140154
required bool isTestnet,
141155
}) async {
142156
try {
143-
final String bitboxScriptType = scriptType == ScriptType.bip49 ? 'p2wpkhp2sh' : 'p2wpkh';
144-
157+
final String bitboxScriptType = scriptType == ScriptType.bip49
158+
? 'p2wpkhp2sh'
159+
: 'p2wpkh';
160+
145161
final verifiedAddress = await BitBoxApi.verifyAddress(
146162
serialNumber: device.serialNumber,
147163
keypath: derivationPath,
@@ -157,7 +173,7 @@ class BitBoxDeviceDatasource {
157173
Future<void> disconnectConnection(BitBoxDeviceModel device) async {
158174
try {
159175
await BitBoxApi.closeDevice(device.serialNumber);
160-
176+
161177
_connectedDevices.remove(device.serialNumber);
162178
if (_cachedDevice?.serialNumber == device.serialNumber) {
163179
_cachedDevice = null;
@@ -180,7 +196,7 @@ class BitBoxDeviceDatasource {
180196
// Ignore individual device close errors during disposal
181197
}
182198
}
183-
199+
184200
_connectedDevices.clear();
185201
_cachedDevice = null;
186202
} catch (e) {

lib/core/bitbox/data/repositories/bitbox_device_repository_impl.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class BitBoxDeviceRepositoryImpl implements BitBoxDeviceRepository {
88
final BitBoxDeviceDatasource _datasource;
99

1010
BitBoxDeviceRepositoryImpl({required BitBoxDeviceDatasource datasource})
11-
: _datasource = datasource;
11+
: _datasource = datasource;
1212

1313
@override
1414
Future<List<BitBoxDeviceEntity>> scanDevices() async {

lib/core/bitbox/domain/entities/bitbox_device_entity.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import 'package:freezed_annotation/freezed_annotation.dart';
22

33
part 'bitbox_device_entity.freezed.dart';
44

5-
enum BitBoxConnectionType {
6-
usb,
7-
}
5+
enum BitBoxConnectionType { usb }
86

97
@freezed
108
abstract class BitBoxDeviceEntity with _$BitBoxDeviceEntity {

lib/core/bitbox/domain/errors/bitbox_errors.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,24 @@ part 'bitbox_errors.freezed.dart';
99
sealed class BitBoxError with _$BitBoxError {
1010
const factory BitBoxError.permissionDenied() = PermissionDeniedBitBoxError;
1111
const factory BitBoxError.noDevicesFound() = NoDevicesFoundBitBoxError;
12-
const factory BitBoxError.multipleDevicesFound() = MultipleDevicesFoundBitBoxError;
12+
const factory BitBoxError.multipleDevicesFound() =
13+
MultipleDevicesFoundBitBoxError;
1314
const factory BitBoxError.deviceNotFound() = DeviceNotFoundBitBoxError;
14-
const factory BitBoxError.connectionTypeNotInitialized() = ConnectionTypeNotInitializedBitBoxError;
15-
const factory BitBoxError.noActiveConnection() = NoActiveConnectionBitBoxError;
15+
const factory BitBoxError.connectionTypeNotInitialized() =
16+
ConnectionTypeNotInitializedBitBoxError;
17+
const factory BitBoxError.noActiveConnection() =
18+
NoActiveConnectionBitBoxError;
1619
const factory BitBoxError.deviceMismatch() = DeviceMismatchBitBoxError;
1720
const factory BitBoxError.invalidMagicBytes() = InvalidMagicBytesBitBoxError;
1821
const factory BitBoxError.deviceNotPaired() = DeviceNotPairedBitBoxError;
1922
const factory BitBoxError.handshakeFailed() = HandshakeFailedBitBoxError;
2023
const factory BitBoxError.operationTimeout() = OperationTimeoutBitBoxError;
2124
const factory BitBoxError.connectionFailed() = ConnectionFailedBitBoxError;
2225
const factory BitBoxError.invalidResponse() = InvalidResponseBitBoxError;
23-
const factory BitBoxError.operationCancelled() = OperationCancelledBitBoxError;
24-
const factory BitBoxError.operationFailed({required String message}) = OperationFailedBitBoxError;
26+
const factory BitBoxError.operationCancelled() =
27+
OperationCancelledBitBoxError;
28+
const factory BitBoxError.operationFailed({required String message}) =
29+
OperationFailedBitBoxError;
2530

2631
const BitBoxError._();
2732

lib/core/bitbox/domain/usecases/connect_bitbox_device_usecase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class ConnectBitBoxDeviceUsecase {
55
final BitBoxDeviceRepository _repository;
66

77
ConnectBitBoxDeviceUsecase({required BitBoxDeviceRepository repository})
8-
: _repository = repository;
8+
: _repository = repository;
99

1010
Future<void> execute(BitBoxDeviceEntity device) async {
1111
await _repository.connectDevice(device);

lib/core/bitbox/domain/usecases/get_bitbox_watch_only_wallet_usecase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class GetBitBoxWatchOnlyWalletUsecase {
5959
watchOnlyDescriptor: watchOnly,
6060
signer: SignerEntity.remote,
6161
label: label,
62-
signerDevice: deviceType
62+
signerDevice: deviceType,
6363
);
6464

6565
return watchOnlyWallet;

lib/core/bitbox/domain/usecases/pair_bitbox_device_usecase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class PairBitBoxDeviceUsecase {
55
final BitBoxDeviceRepository _repository;
66

77
PairBitBoxDeviceUsecase({required BitBoxDeviceRepository repository})
8-
: _repository = repository;
8+
: _repository = repository;
99

1010
Future<String> execute(BitBoxDeviceEntity device) async {
1111
return await _repository.pairDevice(device);

lib/core/bitbox/domain/usecases/sign_psbt_bitbox_usecase.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ class SignPsbtBitBoxUsecase {
1010
SignPsbtBitBoxUsecase({
1111
required BitBoxDeviceRepository repository,
1212
required SettingsRepository settingsRepository,
13-
}) : _repository = repository,
14-
_settingsRepository = settingsRepository;
13+
}) : _repository = repository,
14+
_settingsRepository = settingsRepository;
1515

1616
Future<String> execute(
1717
BitBoxDeviceEntity device, {

lib/core/bitbox/domain/usecases/unlock_bitbox_device_usecase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class UnlockBitBoxDeviceUsecase {
55
final BitBoxDeviceRepository _repository;
66

77
UnlockBitBoxDeviceUsecase({required BitBoxDeviceRepository repository})
8-
: _repository = repository;
8+
: _repository = repository;
99

1010
Future<String> execute(BitBoxDeviceEntity device) async {
1111
return await _repository.unlockDevice(device);

lib/core/bitbox/domain/usecases/verify_address_bitbox_usecase.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class VerifyAddressBitBoxUsecase {
2121
}) async {
2222
final settings = await _settingsRepository.fetch();
2323
final isTestnet = settings.environment.isTestnet;
24-
24+
2525
return await _repository.verifyAddress(
2626
device,
2727
address: address,

0 commit comments

Comments
 (0)