Skip to content

Commit 28b19b6

Browse files
refactor(bitbox): make sign/verify usecase params non-nullable, validate at call-site
1 parent fa32f9a commit 28b19b6

4 files changed

Lines changed: 24 additions & 58 deletions

File tree

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,10 @@ class SignPsbtBitBoxUsecase {
1919
@useResult
2020
Future<Result<String, BitBoxFailure>> execute(
2121
BitBoxDeviceEntity device, {
22-
required String? psbt,
23-
required String? derivationPath,
22+
required String psbt,
23+
required String derivationPath,
2424
required ScriptType scriptType,
2525
}) async {
26-
if (psbt == null || derivationPath == null) {
27-
return const Err(
28-
InvalidParametersBitBoxFailure(
29-
'sign requested without psbt/derivationPath',
30-
),
31-
);
32-
}
33-
3426
final bool isTestnet;
3527
try {
3628
final settings = await _settingsRepository.fetch();

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,10 @@ class VerifyAddressBitBoxUsecase {
1919
@useResult
2020
Future<Result<bool, BitBoxFailure>> execute({
2121
required BitBoxDeviceEntity device,
22-
required String? address,
23-
required String? derivationPath,
22+
required String address,
23+
required String derivationPath,
2424
required ScriptType scriptType,
2525
}) async {
26-
if (address == null || derivationPath == null) {
27-
return const Err(
28-
InvalidParametersBitBoxFailure(
29-
'verify requested without address/derivationPath',
30-
),
31-
);
32-
}
33-
3426
final bool isTestnet;
3527
try {
3628
final settings = await _settingsRepository.fetch();

lib/features/bitbox/ui/screens/bitbox_action_screen.dart

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,16 @@ class _BitBoxActionViewState extends State<_BitBoxActionView> {
351351
final derivationPath = widget.parameters?.derivationPath;
352352
final scriptType = widget.parameters?.scriptType ?? ScriptType.bip84;
353353

354-
if (address != null && derivationPath != null) {
355-
cubit.showAddressVerification(address);
354+
if (address == null || derivationPath == null) {
355+
return const Err(
356+
InvalidParametersBitBoxFailure(
357+
'verify requested without address/derivationPath',
358+
),
359+
);
356360
}
357361

362+
cubit.showAddressVerification(address);
363+
358364
return locator<VerifyAddressBitBoxUsecase>().execute(
359365
device: device,
360366
address: address,
@@ -374,12 +380,22 @@ class _BitBoxActionViewState extends State<_BitBoxActionView> {
374380
}
375381

376382
final device = cubit.state.connectedDevice!;
383+
final psbt = widget.parameters?.psbt;
384+
final derivationPath = widget.parameters?.derivationPath;
377385
final scriptType = widget.parameters?.scriptType ?? ScriptType.bip84;
378386

387+
if (psbt == null || derivationPath == null) {
388+
return const Err(
389+
InvalidParametersBitBoxFailure(
390+
'sign requested without psbt/derivationPath',
391+
),
392+
);
393+
}
394+
379395
return locator<SignPsbtBitBoxUsecase>().execute(
380396
device,
381-
psbt: widget.parameters?.psbt,
382-
derivationPath: widget.parameters?.derivationPath,
397+
psbt: psbt,
398+
derivationPath: derivationPath,
383399
scriptType: scriptType,
384400
);
385401
});

test/core_test/bitbox/bitbox_failure_test.dart

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -109,23 +109,6 @@ void main() {
109109
expect((result as Err).failure, isA<BitBoxUnexpectedFailure>());
110110
},
111111
);
112-
113-
test('validates missing psbt below presentation — no raw leak', () async {
114-
final usecase = SignPsbtBitBoxUsecase(
115-
repository: _MockRepository(),
116-
settingsRepository: _MockSettingsRepository(),
117-
);
118-
119-
final result = await usecase.execute(
120-
_device,
121-
psbt: null,
122-
derivationPath: "m/84'/0'/0'",
123-
scriptType: ScriptType.bip84,
124-
);
125-
126-
expect(result, isA<Err>());
127-
expect((result as Err).failure, isA<InvalidParametersBitBoxFailure>());
128-
});
129112
});
130113

131114
group('ConnectBitBoxDeviceUsecase', () {
@@ -174,23 +157,6 @@ void main() {
174157
});
175158

176159
group('VerifyAddressBitBoxUsecase', () {
177-
test('returns InvalidParameters on missing input — no raw leak', () async {
178-
final usecase = VerifyAddressBitBoxUsecase(
179-
repository: _MockRepository(),
180-
settingsRepository: _MockSettingsRepository(),
181-
);
182-
183-
final result = await usecase.execute(
184-
device: _device,
185-
address: null,
186-
derivationPath: "m/84'/0'/0'",
187-
scriptType: ScriptType.bip84,
188-
);
189-
190-
expect(result, isA<Err>());
191-
expect((result as Err).failure, isA<InvalidParametersBitBoxFailure>());
192-
});
193-
194160
test('maps an address mismatch to InvalidResponse', () async {
195161
final repo = _MockRepository();
196162
final settings = _MockSettingsRepository();

0 commit comments

Comments
 (0)