diff --git a/lib/main.dart b/lib/main.dart index 45ee30411..cb507f253 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,6 +31,7 @@ import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart'; import 'package:stackwallet/pages/settings_views/global_settings_view/stack_backup_views/restore_from_encrypted_string_view.dart'; import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart'; import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/changenow_initial_load_status.dart'; import 'package:stackwallet/providers/exchange/exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_exchange_form_provider.dart'; @@ -41,7 +42,6 @@ import 'package:stackwallet/providers/global/base_currencies_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/route_generator.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/services/debug_service.dart'; import 'package:stackwallet/services/locale_service.dart'; import 'package:stackwallet/services/node_service.dart'; @@ -79,7 +79,7 @@ void main() async { await DebugService.instance.init(isar); // clear out all info logs on startup. No need to await and block - DebugService.instance.purgeInfoLogs(); + unawaited(DebugService.instance.purgeInfoLogs()); // Registering Transaction Model Adapters Hive.registerAdapter(TransactionDataAdapter()); @@ -193,13 +193,14 @@ class _MaterialAppWithThemeState extends ConsumerState NotificationApi.prefs = _prefs; NotificationApi.notificationsService = _notificationsService; - ref.read(baseCurrenciesProvider).update(); + unawaited(ref.read(baseCurrenciesProvider).update()); await _nodeService.updateDefaults(); await _notificationsService.init( nodeService: _nodeService, tradesService: _tradesService, prefs: _prefs, + changeNow: ref.read(changeNowProvider), ); await _prefs.init(); ref.read(priceAnd24hChangeNotifierProvider).start(true); @@ -216,7 +217,7 @@ class _MaterialAppWithThemeState extends ConsumerState .startPeriodicBackupTimer(duration: const Duration(minutes: 10)); break; case BackupFrequencyType.everyAppStart: - ref.read(autoSWBServiceProvider).doBackup(); + unawaited(ref.read(autoSWBServiceProvider).doBackup()); break; case BackupFrequencyType.afterClosingAWallet: // ignore this case here @@ -236,8 +237,9 @@ class _MaterialAppWithThemeState extends ConsumerState .isNotEmpty) { return; } - final response = await ChangeNow.getAvailableCurrencies(); - final response2 = await ChangeNow.getAvailableFloatingRatePairs(); + final response = await ref.read(changeNowProvider).getAvailableCurrencies(); + final response2 = + await ref.read(changeNowProvider).getAvailableFloatingRatePairs(); if (response.value != null) { ref.read(availableChangeNowCurrenciesStateProvider.state).state = response.value!; @@ -248,13 +250,13 @@ class _MaterialAppWithThemeState extends ConsumerState if (response.value!.length > 1) { if (ref.read(estimatedRateExchangeFormProvider).from == null) { if (response.value!.where((e) => e.ticker == "btc").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateFrom( + await ref.read(estimatedRateExchangeFormProvider).updateFrom( response.value!.firstWhere((e) => e.ticker == "btc"), false); } } if (ref.read(estimatedRateExchangeFormProvider).to == null) { if (response.value!.where((e) => e.ticker == "doge").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateTo( + await ref.read(estimatedRateExchangeFormProvider).updateTo( response.value!.firstWhere((e) => e.ticker == "doge"), false); } } @@ -288,7 +290,8 @@ class _MaterialAppWithThemeState extends ConsumerState return; } - final response3 = await ChangeNow.getAvailableFixedRateMarkets(); + final response3 = + await ref.read(changeNowProvider).getAvailableFixedRateMarkets(); if (response3.value != null) { ref.read(fixedRateMarketPairsStateProvider.state).state = response3.value!; @@ -297,7 +300,7 @@ class _MaterialAppWithThemeState extends ConsumerState final matchingMarkets = response3.value!.where((e) => e.to == "doge" && e.from == "btc"); if (matchingMarkets.isNotEmpty) { - ref + await ref .read(fixedRateExchangeFormProvider) .updateMarket(matchingMarkets.first, true); } @@ -443,7 +446,7 @@ class _MaterialAppWithThemeState extends ConsumerState } }); } else { - Navigator.push( + unawaited(Navigator.push( navigatorKey.currentContext!, RouteGenerator.getRoute( shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, @@ -458,7 +461,7 @@ class _MaterialAppWithThemeState extends ConsumerState ), settings: const RouteSettings(name: "/swbrestorelockscreen"), ), - ); + )); } } diff --git a/lib/models/exchange/exchange_form_state.dart b/lib/models/exchange/exchange_form_state.dart index b02a2806c..b680c3cbe 100644 --- a/lib/models/exchange/exchange_form_state.dart +++ b/lib/models/exchange/exchange_form_state.dart @@ -270,7 +270,7 @@ class ExchangeFormState extends ChangeNotifier { required Currency from, required Currency to, }) async { - final response = await ChangeNow.getEstimatedExchangeAmount( + final response = await ChangeNow.instance.getEstimatedExchangeAmount( fromTicker: from.ticker, toTicker: to.ticker, fromAmount: fromAmount); if (response.value != null) { @@ -286,8 +286,8 @@ class ExchangeFormState extends ChangeNotifier { required Currency from, required Currency to, }) async { - final response = await ChangeNow.getMinimalExchangeAmount( - fromTicker: from.ticker, toTicker: to.ticker); + final response = await ChangeNow.instance + .getMinimalExchangeAmount(fromTicker: from.ticker, toTicker: to.ticker); if (response.value != null) { return response.value!; diff --git a/lib/pages/exchange_view/exchange_loading_overlay.dart b/lib/pages/exchange_view/exchange_loading_overlay.dart index 8285f9a82..5598d4fd6 100644 --- a/lib/pages/exchange_view/exchange_loading_overlay.dart +++ b/lib/pages/exchange_view/exchange_loading_overlay.dart @@ -2,11 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart'; import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/changenow_initial_load_status.dart'; import 'package:stackwallet/providers/exchange/exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_market_pairs_provider.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/text_styles.dart'; @@ -38,7 +38,8 @@ class _ExchangeLoadingOverlayViewState ref.read(changeNowFixedInitialLoadStatusStateProvider.state).state = ChangeNowLoadStatus.loading; - final response3 = await ChangeNow.getAvailableFixedRateMarkets(); + final response3 = + await ref.read(changeNowProvider).getAvailableFixedRateMarkets(); if (response3.value != null) { ref.read(fixedRateMarketPairsStateProvider.state).state = response3.value!; @@ -47,7 +48,7 @@ class _ExchangeLoadingOverlayViewState final matchingMarkets = response3.value!.where((e) => e.to == "doge" && e.from == "btc"); if (matchingMarkets.isNotEmpty) { - ref + await ref .read(fixedRateExchangeFormProvider) .updateMarket(matchingMarkets.first, true); } @@ -78,8 +79,9 @@ class _ExchangeLoadingOverlayViewState ref.read(changeNowEstimatedInitialLoadStatusStateProvider.state).state = ChangeNowLoadStatus.loading; - final response = await ChangeNow.getAvailableCurrencies(); - final response2 = await ChangeNow.getAvailableFloatingRatePairs(); + final response = await ref.read(changeNowProvider).getAvailableCurrencies(); + final response2 = + await ref.read(changeNowProvider).getAvailableFloatingRatePairs(); if (response.value != null) { ref.read(availableChangeNowCurrenciesStateProvider.state).state = response.value!; @@ -90,13 +92,13 @@ class _ExchangeLoadingOverlayViewState if (response.value!.length > 1) { if (ref.read(estimatedRateExchangeFormProvider).from == null) { if (response.value!.where((e) => e.ticker == "btc").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateFrom( + await ref.read(estimatedRateExchangeFormProvider).updateFrom( response.value!.firstWhere((e) => e.ticker == "btc"), false); } } if (ref.read(estimatedRateExchangeFormProvider).to == null) { if (response.value!.where((e) => e.ticker == "doge").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateTo( + await ref.read(estimatedRateExchangeFormProvider).updateTo( response.value!.firstWhere((e) => e.ticker == "doge"), false); } } diff --git a/lib/pages/exchange_view/exchange_step_views/step_3_view.dart b/lib/pages/exchange_view/exchange_step_views/step_3_view.dart index 160f9598a..a0c79343f 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_3_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_3_view.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/models/exchange/change_now/change_now_response.dart'; @@ -6,8 +8,8 @@ import 'package:stackwallet/models/exchange/incomplete_exchange.dart'; import 'package:stackwallet/pages/exchange_view/exchange_step_views/step_4_view.dart'; import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet.dart'; import 'package:stackwallet/pages/exchange_view/sub_widgets/step_row.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/services/notifications_api.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; @@ -219,35 +221,39 @@ class _Step3ViewState extends ConsumerState { response; if (model.rateType == ExchangeRateType.estimated) { - response = await ChangeNow + response = await ref + .read(changeNowProvider) .createStandardExchangeTransaction( - fromTicker: model.sendTicker, - toTicker: model.receiveTicker, - receivingAddress: model.recipientAddress!, - amount: model.sendAmount, - refundAddress: model.refundAddress!, - ); + fromTicker: model.sendTicker, + toTicker: model.receiveTicker, + receivingAddress: + model.recipientAddress!, + amount: model.sendAmount, + refundAddress: model.refundAddress!, + ); } else { - response = await ChangeNow + response = await ref + .read(changeNowProvider) .createFixedRateExchangeTransaction( - fromTicker: model.sendTicker, - toTicker: model.receiveTicker, - receivingAddress: model.recipientAddress!, - amount: model.sendAmount, - refundAddress: model.refundAddress!, - rateId: model.rateId!, - ); + fromTicker: model.sendTicker, + toTicker: model.receiveTicker, + receivingAddress: + model.recipientAddress!, + amount: model.sendAmount, + refundAddress: model.refundAddress!, + rateId: model.rateId!, + ); } if (response.value == null) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( title: "Failed to create trade", message: response.exception?.toString(), ), - ); + )); return; } @@ -257,8 +263,9 @@ class _Step3ViewState extends ConsumerState { shouldNotifyListeners: true, ); - final statusResponse = - await ChangeNow.getTransactionStatus( + final statusResponse = await ref + .read(changeNowProvider) + .getTransactionStatus( id: response.value!.id); debugPrint("WTF: $statusResponse"); @@ -278,7 +285,7 @@ class _Step3ViewState extends ConsumerState { status += " for deposit"; } - NotificationApi.showNotification( + unawaited(NotificationApi.showNotification( changeNowId: model.trade!.id, title: status, body: "Trade ID ${model.trade!.id}", @@ -287,13 +294,13 @@ class _Step3ViewState extends ConsumerState { date: model.trade!.date, shouldWatchForUpdates: true, coinName: "coinName", - ); + )); if (mounted) { - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( Step4View.routeName, arguments: model, - ); + )); } }, style: Theme.of(context) diff --git a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart index c80bba8f1..7ce46630d 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart @@ -13,10 +13,10 @@ import 'package:stackwallet/pages/exchange_view/send_from_view.dart'; import 'package:stackwallet/pages/exchange_view/sub_widgets/step_row.dart'; import 'package:stackwallet/pages/home_view/home_view.dart'; import 'package:stackwallet/pages/send_view/sub_widgets/building_transaction_dialog.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/exchange_send_from_wallet_id_provider.dart'; import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/route_generator.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart'; @@ -69,8 +69,9 @@ class _Step4ViewState extends ConsumerState { } Future _updateStatus() async { - final statusResponse = - await ChangeNow.getTransactionStatus(id: model.trade!.id); + final statusResponse = await ref + .read(changeNowProvider) + .getTransactionStatus(id: model.trade!.id); String status = "Waiting"; if (statusResponse.value != null) { _status = statusResponse.value!.status; @@ -214,11 +215,11 @@ class _Step4ViewState extends ConsumerState { final data = ClipboardData( text: model.sendAmount.toString()); await clipboard.setData(data); - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.info, message: "Copied to clipboard", context: context, - ); + )); }, child: Row( children: [ @@ -271,11 +272,11 @@ class _Step4ViewState extends ConsumerState { final data = ClipboardData( text: model.trade!.payinAddress); await clipboard.setData(data); - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.info, message: "Copied to clipboard", context: context, - ); + )); }, child: Row( children: [ @@ -331,11 +332,11 @@ class _Step4ViewState extends ConsumerState { final data = ClipboardData(text: model.trade!.id); await clipboard.setData(data); - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.info, message: "Copied to clipboard", context: context, - ); + )); }, child: SvgPicture.asset( Assets.svg.copy, @@ -487,7 +488,7 @@ class _Step4ViewState extends ConsumerState { try { bool wasCancelled = false; - showDialog( + unawaited(showDialog( context: context, useSafeArea: false, barrierDismissible: false, @@ -500,7 +501,7 @@ class _Step4ViewState extends ConsumerState { }, ); }, - ); + )); final txData = await manager.prepareSend( @@ -524,7 +525,8 @@ class _Step4ViewState extends ConsumerState { txData["address"] = address; if (mounted) { - Navigator.of(context).push( + unawaited( + Navigator.of(context).push( RouteGenerator.getRoute( shouldUseMaterialRoute: RouteGenerator @@ -543,7 +545,7 @@ class _Step4ViewState extends ConsumerState { .routeName, ), ), - ); + )); } } } catch (e) { @@ -551,7 +553,7 @@ class _Step4ViewState extends ConsumerState { // pop building dialog Navigator.of(context).pop(); - showDialog( + unawaited(showDialog( context: context, useSafeArea: false, barrierDismissible: true, @@ -584,7 +586,7 @@ class _Step4ViewState extends ConsumerState { ), ); }, - ); + )); // } } } diff --git a/lib/pages/exchange_view/exchange_view.dart b/lib/pages/exchange_view/exchange_view.dart index 85f2a1f12..1ed4a18d7 100644 --- a/lib/pages/exchange_view/exchange_view.dart +++ b/lib/pages/exchange_view/exchange_view.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:decimal/decimal.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -16,6 +18,7 @@ import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet. import 'package:stackwallet/pages/exchange_view/trade_details_view.dart'; import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart'; import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/changenow_initial_load_status.dart'; import 'package:stackwallet/providers/exchange/exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/exchange_send_from_wallet_id_provider.dart'; @@ -24,7 +27,6 @@ import 'package:stackwallet/providers/exchange/fixed_rate_market_pairs_provider. import 'package:stackwallet/providers/exchange/trade_sent_from_stack_lookup_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/providers.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; import 'package:stackwallet/utilities/constants.dart'; @@ -407,14 +409,14 @@ class _ExchangeViewState extends ConsumerState { .read(fixedRateExchangeFormProvider) .updateMarket(market, true); } catch (e) { - showDialog( + unawaited(showDialog( context: context, builder: (_) => const StackDialog( title: "Fixed rate market error", message: "Could not find the specified fixed rate trade pair", ), - ); + )); return; } }, @@ -716,14 +718,14 @@ class _ExchangeViewState extends ConsumerState { .read(fixedRateExchangeFormProvider) .updateMarket(market, true); } catch (e) { - showDialog( + unawaited(showDialog( context: context, builder: (_) => const StackDialog( title: "Fixed rate market error", message: "Could not find the specified fixed rate trade pair", ), - ); + )); return; } }, @@ -924,12 +926,12 @@ class _ExchangeViewState extends ConsumerState { } } } - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.warning, message: "Estimated rate trade pair \"$fromTicker-$toTicker\" unavailable. Reverting to last estimated rate pair.", context: context, - ); + )); break; case ExchangeRateType.fixed: final fromTicker = ref @@ -970,12 +972,12 @@ class _ExchangeViewState extends ConsumerState { ); return; } - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.warning, message: "Fixed rate trade pair \"$fromTicker-$toTicker\" unavailable. Reverting to last fixed rate pair.", context: context, - ); + )); break; } }, @@ -1047,7 +1049,7 @@ class _ExchangeViewState extends ConsumerState { } if (!isAvailable) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1056,7 +1058,7 @@ class _ExchangeViewState extends ConsumerState { message: "The $fromTicker - $toTicker market is currently disabled for estimated/floating rate trades", ), - ); + )); return; } @@ -1068,15 +1070,16 @@ class _ExchangeViewState extends ConsumerState { .read(prefsChangeNotifierProvider) .exchangeRateType; - final response = await ChangeNow + final response = await ref + .read(changeNowProvider) .getEstimatedExchangeAmount( - fromTicker: fromTicker, - toTicker: toTicker, - fromAmount: sendAmount, - ); + fromTicker: fromTicker, + toTicker: toTicker, + fromAmount: sendAmount, + ); if (response.value == null) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1084,7 +1087,7 @@ class _ExchangeViewState extends ConsumerState { "Failed to update trade estimate", message: response.exception?.toString(), ), - ); + )); return; } @@ -1108,10 +1111,10 @@ class _ExchangeViewState extends ConsumerState { exchangeSendFromWalletIdStateProvider .state) .state = null; - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( Step1View.routeName, arguments: model, - ); + )); } } else { final fromTicker = ref @@ -1133,18 +1136,19 @@ class _ExchangeViewState extends ConsumerState { .read(prefsChangeNotifierProvider) .exchangeRateType; - final response = await ChangeNow + final response = await ref + .read(changeNowProvider) .getEstimatedFixedRateExchangeAmount( - fromTicker: fromTicker, - toTicker: toTicker, - fromAmount: sendAmount, - useRateId: true, - ); + fromTicker: fromTicker, + toTicker: toTicker, + fromAmount: sendAmount, + useRateId: true, + ); bool? shouldCancel; if (response.value == null) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1152,7 +1156,7 @@ class _ExchangeViewState extends ConsumerState { "Failed to update trade estimate", message: response.exception?.toString(), ), - ); + )); return; } else if (response.value!.warningMessage != null && @@ -1234,10 +1238,10 @@ class _ExchangeViewState extends ConsumerState { exchangeSendFromWalletIdStateProvider .state) .state = null; - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( Step1View.routeName, arguments: model, - ); + )); } } } @@ -1341,18 +1345,18 @@ class _ExchangeViewState extends ConsumerState { final tx = txData.getAllTransactions()[txid]; if (mounted) { - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( TradeDetailsView.routeName, arguments: Tuple4(tradeId, tx, walletIds.first, manager.walletName), - ); + )); } } else { - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( TradeDetailsView.routeName, arguments: Tuple4( tradeId, null, walletIds?.first, null), - ); + )); } }, ), @@ -1454,7 +1458,7 @@ class RateInfo extends ConsumerWidget { } } - showModalBottomSheet( + unawaited(showModalBottomSheet( backgroundColor: Colors.transparent, context: context, shape: const RoundedRectangleBorder( @@ -1467,7 +1471,7 @@ class RateInfo extends ConsumerWidget { if (value is ExchangeRateType && value != type) { onChanged(value); } - }); + })); } : null, style: Theme.of(context).textButtonTheme.style?.copyWith( diff --git a/lib/pages/exchange_view/wallet_initiated_exchange_view.dart b/lib/pages/exchange_view/wallet_initiated_exchange_view.dart index ade932343..564a8b6e2 100644 --- a/lib/pages/exchange_view/wallet_initiated_exchange_view.dart +++ b/lib/pages/exchange_view/wallet_initiated_exchange_view.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:decimal/decimal.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -16,13 +18,12 @@ import 'package:stackwallet/pages/exchange_view/sub_widgets/exchange_rate_sheet. import 'package:stackwallet/pages/exchange_view/sub_widgets/step_row.dart'; import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart'; import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart'; -import 'package:stackwallet/providers/exchange/changenow_initial_load_status.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/exchange_send_from_wallet_id_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_market_pairs_provider.dart'; import 'package:stackwallet/providers/providers.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; @@ -477,14 +478,14 @@ class _WalletInitiatedExchangeViewState fixedRateExchangeFormProvider) .updateMarket(market, true); } catch (e) { - showDialog( + unawaited(showDialog( context: context, builder: (_) => const StackDialog( title: "Fixed rate market error", message: "Could not find the specified fixed rate trade pair", ), - ); + )); return; } }, @@ -832,14 +833,14 @@ class _WalletInitiatedExchangeViewState fixedRateExchangeFormProvider) .updateMarket(market, true); } catch (e) { - showDialog( + unawaited(showDialog( context: context, builder: (_) => const StackDialog( title: "Fixed rate market error", message: "Could not find the specified fixed rate trade pair", ), - ); + )); return; } }, @@ -1064,12 +1065,12 @@ class _WalletInitiatedExchangeViewState } } } - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.warning, message: "Estimated rate trade pair \"$fromTicker-$toTicker\" unavailable. Reverting to last estimated rate pair.", context: context, - ); + )); break; case ExchangeRateType.fixed: final fromTicker = ref @@ -1111,12 +1112,12 @@ class _WalletInitiatedExchangeViewState ); return; } - showFloatingFlushBar( + unawaited(showFloatingFlushBar( type: FlushBarType.warning, message: "Fixed rate trade pair \"$fromTicker-$toTicker\" unavailable. Reverting to last fixed rate pair.", context: context, - ); + )); break; } }, @@ -1196,14 +1197,14 @@ class _WalletInitiatedExchangeViewState if (availableBalance < sendAmount + Format.satoshisToAmount(fee)) { - showDialog( + unawaited(showDialog( context: context, builder: (_) => StackOkDialog( title: "Insufficient balance", message: "Current ${coin.prettyName} wallet does not have enough ${coin.ticker} for this trade", ), - ); + )); return; } } @@ -1237,7 +1238,7 @@ class _WalletInitiatedExchangeViewState } if (!isAvailable) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1246,7 +1247,7 @@ class _WalletInitiatedExchangeViewState message: "The $fromTicker - $toTicker market is currently disabled for estimated/floating rate trades", ), - ); + )); return; } @@ -1254,15 +1255,16 @@ class _WalletInitiatedExchangeViewState .read(prefsChangeNotifierProvider) .exchangeRateType; - final response = await ChangeNow + final response = await ref + .read(changeNowProvider) .getEstimatedExchangeAmount( - fromTicker: fromTicker, - toTicker: toTicker, - fromAmount: sendAmount, - ); + fromTicker: fromTicker, + toTicker: toTicker, + fromAmount: sendAmount, + ); if (response.value == null) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1271,7 +1273,7 @@ class _WalletInitiatedExchangeViewState message: response.exception?.toString(), ), - ); + )); return; } @@ -1295,10 +1297,10 @@ class _WalletInitiatedExchangeViewState exchangeSendFromWalletIdStateProvider .state) .state = Tuple2(walletId, coin); - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( Step2View.routeName, arguments: model, - ); + )); } } else { final fromTicker = ref @@ -1320,18 +1322,19 @@ class _WalletInitiatedExchangeViewState .read(prefsChangeNotifierProvider) .exchangeRateType; - final response = await ChangeNow + final response = await ref + .read(changeNowProvider) .getEstimatedFixedRateExchangeAmount( - fromTicker: fromTicker, - toTicker: toTicker, - fromAmount: sendAmount, - useRateId: true, - ); + fromTicker: fromTicker, + toTicker: toTicker, + fromAmount: sendAmount, + useRateId: true, + ); bool? shouldCancel; if (response.value == null) { - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( @@ -1340,7 +1343,7 @@ class _WalletInitiatedExchangeViewState message: response.exception?.toString(), ), - ); + )); return; } else if (response.value!.warningMessage != null && @@ -1422,10 +1425,10 @@ class _WalletInitiatedExchangeViewState exchangeSendFromWalletIdStateProvider .state) .state = Tuple2(walletId, coin); - Navigator.of(context).pushNamed( + unawaited(Navigator.of(context).pushNamed( Step2View.routeName, arguments: model, - ); + )); } } } diff --git a/lib/pages/home_view/sub_widgets/home_view_button_bar.dart b/lib/pages/home_view/sub_widgets/home_view_button_bar.dart index 22766731d..d1fc06814 100644 --- a/lib/pages/home_view/sub_widgets/home_view_button_bar.dart +++ b/lib/pages/home_view/sub_widgets/home_view_button_bar.dart @@ -1,13 +1,15 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/pages/exchange_view/exchange_view.dart'; import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart'; import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart'; +import 'package:stackwallet/providers/exchange/change_now_provider.dart'; import 'package:stackwallet/providers/exchange/exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_exchange_form_provider.dart'; import 'package:stackwallet/providers/exchange/fixed_rate_market_pairs_provider.dart'; import 'package:stackwallet/providers/providers.dart'; -import 'package:stackwallet/services/change_now/change_now.dart'; import 'package:stackwallet/utilities/cfcolors.dart'; import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/text_styles.dart'; @@ -41,8 +43,9 @@ class _HomeViewButtonBarState extends ConsumerState { BuildContext context, WidgetRef ref, ) async { - final response = await ChangeNow.getAvailableCurrencies(); - final response2 = await ChangeNow.getAvailableFloatingRatePairs(); + final response = await ref.read(changeNowProvider).getAvailableCurrencies(); + final response2 = + await ref.read(changeNowProvider).getAvailableFloatingRatePairs(); if (response.value != null && response2.value != null) { ref.read(availableChangeNowCurrenciesStateProvider.state).state = response.value!; @@ -52,13 +55,13 @@ class _HomeViewButtonBarState extends ConsumerState { if (response.value!.length > 1) { if (ref.read(estimatedRateExchangeFormProvider).from == null) { if (response.value!.where((e) => e.ticker == "btc").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateFrom( + await ref.read(estimatedRateExchangeFormProvider).updateFrom( response.value!.firstWhere((e) => e.ticker == "btc"), true); } } if (ref.read(estimatedRateExchangeFormProvider).to == null) { if (response.value!.where((e) => e.ticker == "doge").isNotEmpty) { - ref.read(estimatedRateExchangeFormProvider).updateTo( + await ref.read(estimatedRateExchangeFormProvider).updateTo( response.value!.firstWhere((e) => e.ticker == "doge"), true); } } @@ -70,15 +73,15 @@ class _HomeViewButtonBarState extends ConsumerState { Logging.instance.log( "Failed to load changeNOW floating rate market data: \n${response.exception?.errorMessage}\n${response2.exception?.toString()}", level: LogLevel.Error); - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( title: "Failed to fetch available currencies", message: - "${response.exception?.toString()}\n\n${response2.exception?.toString()}", + "${response.exception?.toString()}\n\n${response2.exception?.toString()}", ), - ); + )); } } @@ -86,7 +89,8 @@ class _HomeViewButtonBarState extends ConsumerState { BuildContext context, WidgetRef ref, ) async { - final response3 = await ChangeNow.getAvailableFixedRateMarkets(); + final response3 = + await ref.read(changeNowProvider).getAvailableFixedRateMarkets(); if (response3.value != null) { ref.read(fixedRateMarketPairsStateProvider.state).state = @@ -97,7 +101,7 @@ class _HomeViewButtonBarState extends ConsumerState { response3.value!.where((e) => e.to == "doge" && e.from == "btc"); if (matchingMarkets.isNotEmpty) { - ref + await ref .read(fixedRateExchangeFormProvider) .updateMarket(matchingMarkets.first, true); } @@ -108,14 +112,14 @@ class _HomeViewButtonBarState extends ConsumerState { Logging.instance.log( "Failed to load changeNOW fixed rate markets: ${response3.exception?.errorMessage}", level: LogLevel.Error); - showDialog( + unawaited(showDialog( context: context, barrierDismissible: true, builder: (_) => StackDialog( title: "ChangeNOW API call failed", message: "${response3.exception?.toString()}", ), - ); + )); } } diff --git a/lib/providers/exchange/change_now_provider.dart b/lib/providers/exchange/change_now_provider.dart new file mode 100644 index 000000000..759692c13 --- /dev/null +++ b/lib/providers/exchange/change_now_provider.dart @@ -0,0 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:stackwallet/services/change_now/change_now.dart'; + +final changeNowProvider = Provider((ref) => ChangeNow.instance); diff --git a/lib/services/change_now/change_now.dart b/lib/services/change_now/change_now.dart index f67fb8969..af70b83e4 100644 --- a/lib/services/change_now/change_now.dart +++ b/lib/services/change_now/change_now.dart @@ -13,20 +13,24 @@ import 'package:stackwallet/models/exchange/change_now/exchange_transaction_stat import 'package:stackwallet/models/exchange/change_now/fixed_rate_market.dart'; import 'package:stackwallet/utilities/logger.dart'; -abstract class ChangeNow { +class ChangeNow { static const String scheme = "https"; static const String authority = "api.changenow.io"; static const String apiVersion = "/v1"; - /// set this to override using standard http client. Useful for testing - static http.Client? client; + ChangeNow._(); + static final ChangeNow _instance = ChangeNow._(); + static ChangeNow get instance => _instance; - static Uri _buildUri(String path, Map? params) { + /// set this to override using standard http client. Useful for testing + http.Client? client; + + Uri _buildUri(String path, Map? params) { return Uri.https(authority, apiVersion + path, params); } - static Future _makeGetRequest(Uri uri) async { - final client = ChangeNow.client ?? http.Client(); + Future _makeGetRequest(Uri uri) async { + final client = this.client ?? http.Client(); try { final response = await client.get( uri, @@ -43,11 +47,11 @@ abstract class ChangeNow { } } - static Future _makePostRequest( + Future _makePostRequest( Uri uri, Map body, ) async { - final client = ChangeNow.client ?? http.Client(); + final client = this.client ?? http.Client(); try { final response = await client.post( uri, @@ -69,7 +73,7 @@ abstract class ChangeNow { /// /// Set [active] to true to return only active currencies. /// Set [fixedRate] to true to return only currencies available on a fixed-rate flow. - static Future>> getAvailableCurrencies({ + Future>> getAvailableCurrencies({ bool? fixedRate, bool? active, }) async { @@ -117,7 +121,7 @@ abstract class ChangeNow { } } - static ChangeNowResponse> _parseAvailableCurrenciesJson( + ChangeNowResponse> _parseAvailableCurrenciesJson( List jsonArray) { try { List currencies = []; @@ -144,7 +148,7 @@ abstract class ChangeNow { /// /// Required [ticker] to fetch paired currencies for. /// Set [fixedRate] to true to return only currencies available on a fixed-rate flow. - static Future>> getPairedCurrencies({ + Future>> getPairedCurrencies({ required String ticker, bool? fixedRate, }) async { @@ -199,7 +203,7 @@ abstract class ChangeNow { /// The API endpoint returns minimal payment amount required to make /// an exchange of [fromTicker] to [toTicker]. /// If you try to exchange less, the transaction will most likely fail. - static Future> getMinimalExchangeAmount({ + Future> getMinimalExchangeAmount({ required String fromTicker, required String toTicker, String? apiKey, @@ -237,7 +241,7 @@ abstract class ChangeNow { /// Get estimated amount of [toTicker] cryptocurrency to receive /// for [fromAmount] of [fromTicker] - static Future> + Future> getEstimatedExchangeAmount({ required String fromTicker, required String toTicker, @@ -281,7 +285,7 @@ abstract class ChangeNow { /// This API endpoint returns fixed-rate estimated exchange amount of /// [toTicker] cryptocurrency to receive for [fromAmount] of [fromTicker] - static Future> + Future> getEstimatedFixedRateExchangeAmount({ required String fromTicker, required String toTicker, @@ -336,7 +340,7 @@ abstract class ChangeNow { /// fixed-rate flow. Some currencies get enabled or disabled from time to /// time and the market info gets updates, so make sure to refresh the list /// occasionally. One time per minute is sufficient. - static Future>> + Future>> getAvailableFixedRateMarkets({ String? apiKey, }) async { @@ -373,7 +377,7 @@ abstract class ChangeNow { } } - static ChangeNowResponse> _parseFixedRateMarketsJson( + ChangeNowResponse> _parseFixedRateMarketsJson( List jsonArray) { try { List markets = []; @@ -395,7 +399,7 @@ abstract class ChangeNow { /// The API endpoint creates a transaction, generates an address for /// sending funds and returns transaction attributes. - static Future> + Future> createStandardExchangeTransaction({ required String fromTicker, required String toTicker, @@ -457,7 +461,7 @@ abstract class ChangeNow { /// The API endpoint creates a transaction, generates an address for /// sending funds and returns transaction attributes. - static Future> + Future> createFixedRateExchangeTransaction({ required String fromTicker, required String toTicker, @@ -520,8 +524,7 @@ abstract class ChangeNow { } } - static Future> - getTransactionStatus({ + Future> getTransactionStatus({ required String id, String? apiKey, }) async { @@ -556,7 +559,7 @@ abstract class ChangeNow { } } - static Future>> + Future>> getAvailableFloatingRatePairs({ bool includePartners = false, }) async { @@ -593,7 +596,7 @@ abstract class ChangeNow { } } - static ChangeNowResponse> + ChangeNowResponse> _parseAvailableFloatingRatePairsJson(List jsonArray) { try { List pairs = []; diff --git a/lib/services/notifications_service.dart b/lib/services/notifications_service.dart index 89f7673e5..31d8b664c 100644 --- a/lib/services/notifications_service.dart +++ b/lib/services/notifications_service.dart @@ -17,6 +17,7 @@ class NotificationsService extends ChangeNotifier { late NodeService nodeService; late TradesService tradesService; late Prefs prefs; + late ChangeNow changeNow; NotificationsService._(); static final NotificationsService _instance = NotificationsService._(); @@ -26,10 +27,12 @@ class NotificationsService extends ChangeNotifier { required NodeService nodeService, required TradesService tradesService, required Prefs prefs, + required ChangeNow changeNow, }) async { this.nodeService = nodeService; this.tradesService = tradesService; this.prefs = prefs; + this.changeNow = changeNow; } // watched transactions @@ -177,7 +180,7 @@ class NotificationsService extends ChangeNotifier { for (final notification in _watchedChangeNowTradeNotifications) { final id = notification.changeNowId!; - final result = await ChangeNow.getTransactionStatus(id: id); + final result = await changeNow.getTransactionStatus(id: id); ChangeNowTransactionStatus? status = result.value?.status; diff --git a/test/services/change_now/change_now_test.dart b/test/services/change_now/change_now_test.dart index 8792e4807..5955a7e94 100644 --- a/test/services/change_now/change_now_test.dart +++ b/test/services/change_now/change_now_test.dart @@ -20,15 +20,15 @@ void main() { group("getAvailableCurrencies", () { test("getAvailableCurrencies succeeds without options", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(availableCurrenciesJSON), 200)); - final result = await ChangeNow.getAvailableCurrencies(); + final result = await ChangeNow.instance.getAvailableCurrencies(); expect(result.exception, null); expect(result.value == null, false); @@ -37,15 +37,17 @@ void main() { test("getAvailableCurrencies succeeds with active option", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies?active=true"), + Uri.parse( + "https://api.ChangeNow.instance.io/v1/currencies?active=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(availableCurrenciesJSONActive), 200)); - final result = await ChangeNow.getAvailableCurrencies(active: true); + final result = + await ChangeNow.instance.getAvailableCurrencies(active: true); expect(result.exception, null); expect(result.value == null, false); @@ -54,15 +56,17 @@ void main() { test("getAvailableCurrencies succeeds with fixedRate option", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies?fixedRate=true"), + Uri.parse( + "https://api.ChangeNow.instance.io/v1/currencies?fixedRate=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(availableCurrenciesJSONFixedRate), 200)); - final result = await ChangeNow.getAvailableCurrencies(fixedRate: true); + final result = + await ChangeNow.instance.getAvailableCurrencies(fixedRate: true); expect(result.exception, null); expect(result.value == null, false); @@ -72,17 +76,17 @@ void main() { test("getAvailableCurrencies succeeds with fixedRate and active options", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/currencies?fixedRate=true&active=true"), + "https://api.ChangeNow.instance.io/v1/currencies?fixedRate=true&active=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(availableCurrenciesJSONActiveFixedRate), 200)); - final result = - await ChangeNow.getAvailableCurrencies(active: true, fixedRate: true); + final result = await ChangeNow.instance + .getAvailableCurrencies(active: true, fixedRate: true); expect(result.exception, null); expect(result.value == null, false); @@ -93,15 +97,15 @@ void main() { "getAvailableCurrencies fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"some unexpected": "but valid json data"}', 200)); - final result = await ChangeNow.getAvailableCurrencies(); + final result = await ChangeNow.instance.getAvailableCurrencies(); expect(result.exception!.type, ChangeNowExceptionType.serializeResponseError); @@ -110,14 +114,14 @@ void main() { test("getAvailableCurrencies fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response("", 400)); - final result = await ChangeNow.getAvailableCurrencies(); + final result = await ChangeNow.instance.getAvailableCurrencies(); expect(result.exception!.type, ChangeNowExceptionType.generic); expect(result.value == null, true); @@ -127,15 +131,16 @@ void main() { group("getPairedCurrencies", () { test("getPairedCurrencies succeeds without fixedRate option", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies-to/XMR"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies-to/XMR"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(getPairedCurrenciesJSON), 200)); - final result = await ChangeNow.getPairedCurrencies(ticker: "XMR"); + final result = + await ChangeNow.instance.getPairedCurrencies(ticker: "XMR"); expect(result.exception, null); expect(result.value == null, false); @@ -144,17 +149,17 @@ void main() { test("getPairedCurrencies succeeds with fixedRate option", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/currencies-to/XMR?fixedRate=true"), + "https://api.ChangeNow.instance.io/v1/currencies-to/XMR?fixedRate=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(getPairedCurrenciesJSONFixedRate), 200)); - final result = - await ChangeNow.getPairedCurrencies(ticker: "XMR", fixedRate: true); + final result = await ChangeNow.instance + .getPairedCurrencies(ticker: "XMR", fixedRate: true); expect(result.exception, null); expect(result.value == null, false); @@ -165,15 +170,16 @@ void main() { "getPairedCurrencies fails with ChangeNowExceptionType.serializeResponseError A", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies-to/XMR"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies-to/XMR"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('[{"some unexpected": "but valid json data"}]', 200)); - final result = await ChangeNow.getPairedCurrencies(ticker: "XMR"); + final result = + await ChangeNow.instance.getPairedCurrencies(ticker: "XMR"); expect(result.exception!.type, ChangeNowExceptionType.serializeResponseError); @@ -182,15 +188,15 @@ void main() { test("getPairedCurrencies fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( - Uri.parse("https://api.changenow.io/v1/currencies"), + Uri.parse("https://api.ChangeNow.instance.io/v1/currencies"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response("", 400)); - final result = - await ChangeNow.getPairedCurrencies(ticker: "XMR", fixedRate: true); + final result = await ChangeNow.instance + .getPairedCurrencies(ticker: "XMR", fixedRate: true); expect(result.exception!.type, ChangeNowExceptionType.generic); expect(result.value == null, true); @@ -200,16 +206,16 @@ void main() { group("getMinimalExchangeAmount", () { test("getMinimalExchangeAmount succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer( (realInvocation) async => Response('{"minAmount": 42}', 200)); - final result = await ChangeNow.getMinimalExchangeAmount( + final result = await ChangeNow.instance.getMinimalExchangeAmount( fromTicker: "xmr", toTicker: "btc", apiKey: "testAPIKEY", @@ -224,15 +230,15 @@ void main() { "getMinimalExchangeAmount fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getMinimalExchangeAmount( + final result = await ChangeNow.instance.getMinimalExchangeAmount( fromTicker: "xmr", toTicker: "btc", apiKey: "testAPIKEY", @@ -245,15 +251,15 @@ void main() { test("getMinimalExchangeAmount fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/min-amount/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getMinimalExchangeAmount( + final result = await ChangeNow.instance.getMinimalExchangeAmount( fromTicker: "xmr", toTicker: "btc", apiKey: "testAPIKEY", @@ -267,17 +273,17 @@ void main() { group("getEstimatedExchangeAmount", () { test("getEstimatedExchangeAmount succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response( '{"estimatedAmount": 58.4142873, "transactionSpeedForecast": "10-60", "warningMessage": null}', 200)); - final result = await ChangeNow.getEstimatedExchangeAmount( + final result = await ChangeNow.instance.getEstimatedExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(42), @@ -293,15 +299,15 @@ void main() { "getEstimatedExchangeAmount fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getEstimatedExchangeAmount( + final result = await ChangeNow.instance.getEstimatedExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(42), @@ -315,15 +321,15 @@ void main() { test("getEstimatedExchangeAmount fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/42/xmr_btc?api_key=testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getEstimatedExchangeAmount( + final result = await ChangeNow.instance.getEstimatedExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(42), @@ -338,16 +344,17 @@ void main() { group("getEstimatedFixedRateExchangeAmount", () { test("getEstimatedFixedRateExchangeAmount succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(estFixedRateExchangeAmountJSON), 200)); - final result = await ChangeNow.getEstimatedFixedRateExchangeAmount( + final result = + await ChangeNow.instance.getEstimatedFixedRateExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(10), @@ -364,15 +371,16 @@ void main() { "getEstimatedFixedRateExchangeAmount fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getEstimatedFixedRateExchangeAmount( + final result = + await ChangeNow.instance.getEstimatedFixedRateExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(10), @@ -387,15 +395,16 @@ void main() { test("getEstimatedFixedRateExchangeAmount fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), + "https://api.ChangeNow.instance.io/v1/exchange-amount/fixed-rate/10/xmr_btc?api_key=testAPIKEY&useRateId=true"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getEstimatedFixedRateExchangeAmount( + final result = + await ChangeNow.instance.getEstimatedFixedRateExchangeAmount( fromTicker: "xmr", toTicker: "btc", fromAmount: Decimal.fromInt(10), @@ -410,16 +419,16 @@ void main() { group("getAvailableFixedRateMarkets", () { test("getAvailableFixedRateMarkets succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/market-info/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response(jsonEncode(fixedRateMarketsJSON), 200)); - final result = await ChangeNow.getAvailableFixedRateMarkets( + final result = await ChangeNow.instance.getAvailableFixedRateMarkets( apiKey: "testAPIKEY", ); @@ -432,15 +441,15 @@ void main() { "getAvailableFixedRateMarkets fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/market-info/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getAvailableFixedRateMarkets( + final result = await ChangeNow.instance.getAvailableFixedRateMarkets( apiKey: "testAPIKEY", ); @@ -451,15 +460,15 @@ void main() { test("getAvailableFixedRateMarkets fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/market-info/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getAvailableFixedRateMarkets( + final result = await ChangeNow.instance.getAvailableFixedRateMarkets( apiKey: "testAPIKEY", ); @@ -471,10 +480,11 @@ void main() { group("createStandardExchangeTransaction", () { test("createStandardExchangeTransaction succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( - Uri.parse("https://api.changenow.io/v1/transactions/testAPIKEY"), + Uri.parse( + "https://api.ChangeNow.instance.io/v1/transactions/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from":"xmr","to":"btc","address":"bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5","amount":"0.3","flow":"standard","extraId":"","userId":"","contactEmail":"","refundAddress":"888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H","refundExtraId":""}', @@ -482,7 +492,7 @@ void main() { )).thenAnswer((realInvocation) async => Response(jsonEncode(createStandardTransactionResponse), 200)); - final result = await ChangeNow.createStandardExchangeTransaction( + final result = await ChangeNow.instance.createStandardExchangeTransaction( fromTicker: "xmr", toTicker: "btc", receivingAddress: "bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5", @@ -501,17 +511,18 @@ void main() { "createStandardExchangeTransaction fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( - Uri.parse("https://api.changenow.io/v1/transactions/testAPIKEY"), + Uri.parse( + "https://api.ChangeNow.instance.io/v1/transactions/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from":"xmr","to":"btc","address":"bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5","amount":"0.3","flow":"standard","extraId":"","userId":"","contactEmail":"","refundAddress":"888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H","refundExtraId":""}', encoding: null, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.createStandardExchangeTransaction( + final result = await ChangeNow.instance.createStandardExchangeTransaction( fromTicker: "xmr", toTicker: "btc", receivingAddress: "bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5", @@ -529,17 +540,18 @@ void main() { test("createStandardExchangeTransaction fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( - Uri.parse("https://api.changenow.io/v1/transactions/testAPIKEY"), + Uri.parse( + "https://api.ChangeNow.instance.io/v1/transactions/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from":"xmr","to":"btc","address":"bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5","amount":"0.3","flow":"standard","extraId":"","userId":"","contactEmail":"","refundAddress":"888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H","refundExtraId":""}', encoding: null, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.createStandardExchangeTransaction( + final result = await ChangeNow.instance.createStandardExchangeTransaction( fromTicker: "xmr", toTicker: "btc", receivingAddress: "bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5", @@ -557,11 +569,11 @@ void main() { group("createFixedRateExchangeTransaction", () { test("createFixedRateExchangeTransaction succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( Uri.parse( - "https://api.changenow.io/v1/transactions/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from":"btc","to":"eth","address":"0x57f31ad4b64095347F87eDB1675566DAfF5EC886","amount":"0.3","flow":"fixed-rate","extraId":"","userId":"","contactEmail":"","refundAddress":"","refundExtraId":"","rateId":""}', @@ -570,7 +582,8 @@ void main() { '{"payinAddress": "33eFX2jfeWbXMSmRe9ewUUTrmSVSxZi5cj", "payoutAddress": "0x57f31ad4b64095347F87eDB1675566DAfF5EC886","payoutExtraId": "", "fromCurrency": "btc", "toCurrency": "eth", "refundAddress": "","refundExtraId": "","validUntil": "2019-09-09T14:01:04.921Z","id": "a5c73e2603f40d","amount": 62.9737711}', 200)); - final result = await ChangeNow.createFixedRateExchangeTransaction( + final result = + await ChangeNow.instance.createFixedRateExchangeTransaction( fromTicker: "btc", toTicker: "eth", receivingAddress: "0x57f31ad4b64095347F87eDB1675566DAfF5EC886", @@ -589,11 +602,11 @@ void main() { "createFixedRateExchangeTransaction fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( Uri.parse( - "https://api.changenow.io/v1/transactions/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from":"btc","to":"eth","address":"0x57f31ad4b64095347F87eDB1675566DAfF5EC886","amount":"0.3","flow":"fixed-rate","extraId":"","userId":"","contactEmail":"","refundAddress":"","refundExtraId":"","rateId":""}', @@ -601,7 +614,8 @@ void main() { )).thenAnswer((realInvocation) async => Response('{"id": "a5c73e2603f40d","amount": 62.9737711}', 200)); - final result = await ChangeNow.createFixedRateExchangeTransaction( + final result = + await ChangeNow.instance.createFixedRateExchangeTransaction( fromTicker: "btc", toTicker: "eth", receivingAddress: "0x57f31ad4b64095347F87eDB1675566DAfF5EC886", @@ -619,18 +633,19 @@ void main() { test("createFixedRateExchangeTransaction fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.post( Uri.parse( - "https://api.changenow.io/v1/transactions/fixed-rate/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: '{"from": "btc","to": "eth","address": "0x57f31ad4b64095347F87eDB1675566DAfF5EC886", "amount": "1.12345","extraId": "", "userId": "","contactEmail": "","refundAddress": "", "refundExtraId": "", "rateId": "" }', encoding: null, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.createFixedRateExchangeTransaction( + final result = + await ChangeNow.instance.createFixedRateExchangeTransaction( fromTicker: "xmr", toTicker: "btc", receivingAddress: "bc1qu58svs9983e2vuyqh7gq7ratf8k5qehz5k0cn5", @@ -649,17 +664,17 @@ void main() { group("getTransactionStatus", () { test("getTransactionStatus succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response( '{"status": "waiting", "payinAddress": "32Ge2ci26rj1sRGw2NjiQa9L7Xvxtgzhrj", "payoutAddress": "0x57f31ad4b64095347F87eDB1675566DAfF5EC886", "fromCurrency": "btc", "toCurrency": "eth", "id": "50727663e5d9a4", "updatedAt": "2019-08-22T14:47:49.943Z", "expectedSendAmount": 1, "expectedReceiveAmount": 52.31667, "createdAt": "2019-08-22T14:47:49.943Z", "isPartner": false}', 200)); - final result = await ChangeNow.getTransactionStatus( + final result = await ChangeNow.instance.getTransactionStatus( id: "47F87eDB1675566DAfF5EC886", apiKey: "testAPIKEY", ); @@ -673,15 +688,15 @@ void main() { "getTransactionStatus fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getTransactionStatus( + final result = await ChangeNow.instance.getTransactionStatus( id: "47F87eDB1675566DAfF5EC886", apiKey: "testAPIKEY", ); @@ -693,15 +708,15 @@ void main() { test("getTransactionStatus fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), + "https://api.ChangeNow.instance.io/v1/transactions/47F87eDB1675566DAfF5EC886/testAPIKEY"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getTransactionStatus( + final result = await ChangeNow.instance.getTransactionStatus( id: "47F87eDB1675566DAfF5EC886", apiKey: "testAPIKEY", ); @@ -714,16 +729,16 @@ void main() { group("getAvailableFloatingRatePairs", () { test("getAvailableFloatingRatePairs succeeds", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/available-pairs?includePartners=false"), + "https://api.ChangeNow.instance.io/v1/market-info/available-pairs?includePartners=false"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('["btc_xmr","btc_firo","btc_doge","eth_ltc"]', 200)); - final result = await ChangeNow.getAvailableFloatingRatePairs(); + final result = await ChangeNow.instance.getAvailableFloatingRatePairs(); expect(result.exception, null); expect(result.value == null, false); @@ -734,15 +749,15 @@ void main() { "getAvailableFloatingRatePairs fails with ChangeNowExceptionType.serializeResponseError", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/available-pairs?includePartners=false"), + "https://api.ChangeNow.instance.io/v1/market-info/available-pairs?includePartners=false"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('{"error": 42}', 200)); - final result = await ChangeNow.getAvailableFloatingRatePairs(); + final result = await ChangeNow.instance.getAvailableFloatingRatePairs(); expect(result.exception!.type, ChangeNowExceptionType.serializeResponseError); @@ -751,15 +766,15 @@ void main() { test("getAvailableFloatingRatePairs fails for any other reason", () async { final client = MockClient(); - ChangeNow.client = client; + ChangeNow.instance.client = client; when(client.get( Uri.parse( - "https://api.changenow.io/v1/market-info/available-pairs?includePartners=false"), + "https://api.ChangeNow.instance.io/v1/market-info/available-pairs?includePartners=false"), headers: {'Content-Type': 'application/json'}, )).thenAnswer((realInvocation) async => Response('', 400)); - final result = await ChangeNow.getAvailableFloatingRatePairs(); + final result = await ChangeNow.instance.getAvailableFloatingRatePairs(); expect(result.exception!.type, ChangeNowExceptionType.generic); expect(result.value == null, true); diff --git a/test/services/change_now/change_now_test.mocks.dart b/test/services/change_now/change_now_test.mocks.dart index d47a9e356..355c1904a 100644 --- a/test/services/change_now/change_now_test.mocks.dart +++ b/test/services/change_now/change_now_test.mocks.dart @@ -1,5 +1,5 @@ // Mocks generated by Mockito 5.2.0 from annotations -// in stackwallet/test/services/change_now_test.dart. +// in stackwallet/test/services/change_now/change_now_test.dart. // Do not manually edit this file. import 'dart:async' as _i5;