diff --git a/assets/translations/en.json b/assets/translations/en.json index 54764c231b..7c8af814a6 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -63,7 +63,7 @@ "transactionComplete": "Transaction complete!", "transactionDenied": "Denied", "coinDisableSpan1": "You can't disable {} while it has a swap in progress", - "confirmSending": "Confirm sending", + "confirmSending": "Confirm withdrawl", "confirmSend": "Confirm send", "confirm": "Confirm", "confirmed": "Confirmed", diff --git a/lib/bloc/withdraw_form/withdraw_form_bloc.dart b/lib/bloc/withdraw_form/withdraw_form_bloc.dart index df30709197..d9c3c4002c 100644 --- a/lib/bloc/withdraw_form/withdraw_form_bloc.dart +++ b/lib/bloc/withdraw_form/withdraw_form_bloc.dart @@ -5,6 +5,8 @@ import 'package:komodo_defi_types/komodo_defi_types.dart'; import 'package:web_dex/bloc/withdraw_form/withdraw_form_bloc.dart'; import 'package:web_dex/generated/codegen_loader.g.dart'; import 'package:web_dex/mm2/mm2_api/rpc/base.dart'; +import 'package:web_dex/mm2/mm2_api/mm2_api.dart'; +import 'package:web_dex/mm2/mm2_api/rpc/send_raw_transaction/send_raw_transaction_request.dart'; import 'package:web_dex/model/text_error.dart'; import 'package:web_dex/model/wallet.dart'; import 'package:web_dex/services/fd_monitor_service.dart'; @@ -21,12 +23,15 @@ import 'package:decimal/decimal.dart'; class WithdrawFormBloc extends Bloc { final KomodoDefiSdk _sdk; final WalletType? _walletType; + final Mm2Api _mm2Api; WithdrawFormBloc({ required Asset asset, required KomodoDefiSdk sdk, + required Mm2Api mm2Api, WalletType? walletType, }) : _sdk = sdk, + _mm2Api = mm2Api, _walletType = walletType, super( WithdrawFormState( @@ -471,34 +476,48 @@ class WithdrawFormBloc extends Bloc { state.copyWith( isSending: true, transactionError: () => null, + // No second device interaction is needed on confirm isAwaitingTrezorConfirmation: false, ), ); - - // Show Trezor progress message for hardware wallets - if (_walletType == WalletType.trezor) { - emit(state.copyWith(isAwaitingTrezorConfirmation: true)); + final preview = state.preview; + if (preview == null) { + throw Exception('Missing withdrawal preview'); } - await for (final progress in _sdk.withdrawals.withdraw( - state.toWithdrawParameters(), - )) { - if (progress.status == WithdrawalStatus.complete) { - emit( - state.copyWith( - step: WithdrawFormStep.success, - result: () => progress.withdrawalResult, - isSending: false, - isAwaitingTrezorConfirmation: false, - ), - ); - return; - } + final response = await _mm2Api.sendRawTransaction( + SendRawTransactionRequest( + coin: preview.coin, + txHex: preview.txHex, + ), + ); - if (progress.status == WithdrawalStatus.error) { - throw Exception(progress.errorMessage); - } + if (response.txHash == null) { + throw Exception(response.error?.message ?? 'Broadcast failed'); } + + final result = WithdrawalResult( + txHash: response.txHash!, + balanceChanges: preview.balanceChanges, + coin: preview.coin, + toAddress: preview.to.first, + fee: preview.fee, + kmdRewardsEligible: + preview.kmdRewards != null && + Decimal.parse(preview.kmdRewards!.amount) > Decimal.zero, + ); + + emit( + state.copyWith( + step: WithdrawFormStep.success, + result: () => result, + // Clear cached preview after successful broadcast + preview: () => null, + isSending: false, + isAwaitingTrezorConfirmation: false, + ), + ); + return; } catch (e) { // Capture FD snapshot when KDF withdrawal submission fails if (PlatformTuner.isIOS) { diff --git a/lib/views/wallet/coin_details/withdraw_form/withdraw_form.dart b/lib/views/wallet/coin_details/withdraw_form/withdraw_form.dart index 77168ba8a2..d893ca6ca0 100644 --- a/lib/views/wallet/coin_details/withdraw_form/withdraw_form.dart +++ b/lib/views/wallet/coin_details/withdraw_form/withdraw_form.dart @@ -14,6 +14,7 @@ import 'package:web_dex/bloc/coins_bloc/asset_coin_extension.dart'; import 'package:web_dex/bloc/withdraw_form/withdraw_form_bloc.dart'; import 'package:web_dex/generated/codegen_loader.g.dart'; import 'package:web_dex/mm2/mm2_api/rpc/base.dart'; +import 'package:web_dex/mm2/mm2_api/mm2_api.dart'; import 'package:web_dex/model/text_error.dart'; import 'package:web_dex/model/wallet.dart'; import 'package:web_dex/shared/utils/extensions/kdf_user_extensions.dart'; @@ -50,6 +51,7 @@ class WithdrawForm extends StatefulWidget { class _WithdrawFormState extends State { late final WithdrawFormBloc _formBloc; late final _sdk = context.read(); + late final _mm2Api = context.read(); @override void initState() { @@ -59,6 +61,7 @@ class _WithdrawFormState extends State { _formBloc = WithdrawFormBloc( asset: widget.asset, sdk: _sdk, + mm2Api: _mm2Api, walletType: walletType, ); } @@ -698,7 +701,7 @@ class WithdrawFormConfirmSection extends StatelessWidget { height: 20, child: CircularProgressIndicator(strokeWidth: 2), ) - : Text(LocaleKeys.confirm.tr()), + : Text(LocaleKeys.send.tr()), ), ), ],