import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/buy/order.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/ionia/ionia_category.dart'; import 'package:cake_wallet/ionia/ionia_merchant.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mailer/flutter_mailer.dart'; import 'package:hive/hive.dart'; import 'package:cake_wallet/di.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/router.dart' as Router; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/reactions/bootstrap.dart'; import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/authentication_store.dart'; import 'package:cake_wallet/entities/transaction_description.dart'; import 'package:cake_wallet/entities/get_encryption_key.dart'; import 'package:cake_wallet/entities/contact.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cake_wallet/entities/default_settings_migration.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/entities/template.dart'; import 'package:cake_wallet/exchange/trade.dart'; import 'package:cake_wallet/exchange/exchange_template.dart'; import 'package:cake_wallet/src/screens/root/root.dart'; import 'package:uni_links/uni_links.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; final navigatorKey = GlobalKey(); final rootKey = GlobalKey(); final RouteObserver routeObserver = RouteObserver(); Future main() async { await runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); FlutterError.onError = (errorDetails) { // if not a UI error if (errorDetails.library != "widgets library") { _onError(errorDetails); } }; /// A callback that is invoked when an unhandled error occurs in the root /// isolate. PlatformDispatcher.instance.onError = (error, stack) { _onError(FlutterErrorDetails(exception: error, stack: stack)); return true; }; final appDir = await getApplicationDocumentsDirectory(); await Hive.close(); Hive.init(appDir.path); if (!Hive.isAdapterRegistered(Contact.typeId)) { Hive.registerAdapter(ContactAdapter()); } if (!Hive.isAdapterRegistered(Node.typeId)) { Hive.registerAdapter(NodeAdapter()); } if (!Hive.isAdapterRegistered(TransactionDescription.typeId)) { Hive.registerAdapter(TransactionDescriptionAdapter()); } if (!Hive.isAdapterRegistered(Trade.typeId)) { Hive.registerAdapter(TradeAdapter()); } if (!Hive.isAdapterRegistered(WalletInfo.typeId)) { Hive.registerAdapter(WalletInfoAdapter()); } if (!Hive.isAdapterRegistered(walletTypeTypeId)) { Hive.registerAdapter(WalletTypeAdapter()); } if (!Hive.isAdapterRegistered(Template.typeId)) { Hive.registerAdapter(TemplateAdapter()); } if (!Hive.isAdapterRegistered(ExchangeTemplate.typeId)) { Hive.registerAdapter(ExchangeTemplateAdapter()); } if (!Hive.isAdapterRegistered(Order.typeId)) { Hive.registerAdapter(OrderAdapter()); } if (!isMoneroOnly && !Hive.isAdapterRegistered(UnspentCoinsInfo.typeId)) { Hive.registerAdapter(UnspentCoinsInfoAdapter()); } final secureStorage = FlutterSecureStorage(); final transactionDescriptionsBoxKey = await getEncryptionKey( secureStorage: secureStorage, forKey: TransactionDescription.boxKey); final tradesBoxKey = await getEncryptionKey( secureStorage: secureStorage, forKey: Trade.boxKey); final ordersBoxKey = await getEncryptionKey( secureStorage: secureStorage, forKey: Order.boxKey); final contacts = await Hive.openBox(Contact.boxName); final nodes = await Hive.openBox(Node.boxName); final transactionDescriptions = await Hive.openBox( TransactionDescription.boxName, encryptionKey: transactionDescriptionsBoxKey); final trades = await Hive.openBox(Trade.boxName, encryptionKey: tradesBoxKey); final orders = await Hive.openBox(Order.boxName, encryptionKey: ordersBoxKey); final walletInfoSource = await Hive.openBox(WalletInfo.boxName); final templates = await Hive.openBox