diff --git a/assets/node_list.yml b/assets/node_list.yml index 70c114f57..90c09e0b6 100644 --- a/assets/node_list.yml +++ b/assets/node_list.yml @@ -2,14 +2,10 @@ uri: xmr-node-uk.cakewallet.com:18081 is_default: true - - uri: eu-node.cakewallet.io:18081 - login: cake - password: public_node + uri: xmr-node-eu.cakewallet.com:18081 is_default: false - - uri: node.cakewallet.io:18081 - login: cake - password: public_node + uri: xmr-node-usa-east.cakewallet.com:18081 is_default: false - uri: node.moneroworld.com:18089 diff --git a/lib/main.dart b/lib/main.dart index c97b83b20..2cf7e5911 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -80,7 +80,8 @@ void main() async { sharedPreferences: sharedPreferences, walletListService: walletListService, nodes: nodes, - authStore: authenticationStore); + authStore: authenticationStore, + initialMigrationVersion: 2); final settingsStore = await SettingsStoreBase.load( nodes: nodes, diff --git a/lib/src/domain/common/default_settings_migration.dart b/lib/src/domain/common/default_settings_migration.dart index 7a5e138a0..82d919248 100644 --- a/lib/src/domain/common/default_settings_migration.dart +++ b/lib/src/domain/common/default_settings_migration.dart @@ -19,28 +19,104 @@ Future defaultSettingsMigration( return; } - try { - switch (version) { - case 1: - await sharedPreferences.setString( - 'current_fiat_currency', FiatCurrency.usd.toString()); - await sharedPreferences.setInt( - 'current_fee_priority', TransactionPriority.standart.raw); - await sharedPreferences.setInt('current_balance_display_mode', - BalanceDisplayMode.availableBalance.raw); - await sharedPreferences.setInt( - 'current_default_settings_migration_version', 1); - await sharedPreferences.setBool('save_recipient_address', false); - await resetToDefault(nodes); - await sharedPreferences.setInt('current_node_id', 0); - break; - default: - break; + final migrationVersionsLength = version - currentVersion; + final migrationVersions = List.generate( + migrationVersionsLength, (i) => currentVersion + (i + 1)); + + await Future.forEach(migrationVersions, (int version) async { + try { + switch (version) { + case 1: + await sharedPreferences.setString( + 'current_fiat_currency', FiatCurrency.usd.toString()); + await sharedPreferences.setInt( + 'current_fee_priority', TransactionPriority.standart.raw); + await sharedPreferences.setInt('current_balance_display_mode', + BalanceDisplayMode.availableBalance.raw); + await sharedPreferences.setBool('save_recipient_address', false); + await resetToDefault(nodes); + await changeCurrentNodeToDefault( + sharedPreferences: sharedPreferences, nodes: nodes); + + break; + case 2: + await replaceNodesMigration(nodes: nodes); + await replaceDefaultNode( + sharedPreferences: sharedPreferences, nodes: nodes); + + break; + default: + break; + } + + await sharedPreferences.setInt( + 'current_default_settings_migration_version', version); + } catch (e) { + print('Migration error: ${e.toString()}'); } - } catch (e) { - print('Migration error: ${e.toString()}'); - } + }); await sharedPreferences.setInt( 'current_default_settings_migration_version', version); } + +Future replaceNodesMigration({@required Box nodes}) async { + final replaceNodes = { + 'eu-node.cakewallet.io:18081': + Node(uri: 'xmr-node-eu.cakewallet.com:18081'), + 'node.cakewallet.io:18081': + Node(uri: 'xmr-node-usa-east.cakewallet.com:18081') + }; + + nodes.values.forEach((Node node) async { + final nodeToReplace = replaceNodes[node.uri]; + + if (nodeToReplace != null) { + node.uri = nodeToReplace.uri; + node.login = nodeToReplace.login; + node.password = nodeToReplace.password; + await node.save(); + } + }); +} + +Future changeCurrentNodeToDefault( + {@required SharedPreferences sharedPreferences, + @required Box nodes}) async { + final timeZone = DateTime.now().timeZoneOffset.inHours; + String nodeUri = ''; + + if (timeZone >= 1) { // Eurasia + nodeUri = 'xmr-node-eu.cakewallet.com:18081'; + } else if (timeZone <= -4) { // America + nodeUri = 'xmr-node-usa-east.cakewallet.com:18081'; + } + + final node = nodes.values.firstWhere((Node node) => node.uri == nodeUri) ?? + nodes.values.first; + final nodeId = node != null ? node.key as int : 0; // 0 - England + + await sharedPreferences.setInt('current_node_id', nodeId); +} + +Future replaceDefaultNode( + {@required SharedPreferences sharedPreferences, + @required Box nodes}) async { + const nodesForReplace = [ + 'xmr-node-uk.cakewallet.com:18081', + 'eu-node.cakewallet.io:18081', + 'node.cakewallet.io:18081' + ]; + final currentNodeId = sharedPreferences.getInt('current_node_id'); + final currentNode = + nodes.values.firstWhere((Node node) => node.key == currentNodeId); + final needToReplace = + currentNode == null ? true : nodesForReplace.contains(currentNode.uri); + + if (!needToReplace) { + return; + } + + await changeCurrentNodeToDefault( + sharedPreferences: sharedPreferences, nodes: nodes); +} diff --git a/lib/src/domain/common/node_list.dart b/lib/src/domain/common/node_list.dart index 1ee860663..1c318a5fc 100644 --- a/lib/src/domain/common/node_list.dart +++ b/lib/src/domain/common/node_list.dart @@ -5,9 +5,15 @@ import 'package:cake_wallet/src/domain/common/node.dart'; Future> loadDefaultNodes() async { final nodesRaw = await rootBundle.loadString('assets/node_list.yml'); - final nodes = loadYaml(nodesRaw) as List>; - - return nodes.map((raw) => Node.fromMap(raw)).toList(); + final nodes = loadYaml(nodesRaw) as YamlList; + + return nodes.map((dynamic raw) { + if (raw is Map) { + return Node.fromMap(raw); + } + + return null; + }).toList(); } Future resetToDefault(Box nodeSource) async {