dev
dart 187 lines 5.86 KB
Raw
1 import 'package:flutter/services.dart';
2 import "package:yaml/yaml.dart";
3 import 'package:cw_core/node.dart';
4 import 'package:cw_core/wallet_type.dart';
5
6 Future<List<Node>> loadDefaultNodes(WalletType type) async {
7 String path;
8 switch (type) {
9 case WalletType.monero:
10 path = 'assets/node_list.yml';
11 break;
12 case WalletType.bitcoin:
13 path = 'assets/bitcoin_electrum_server_list.yml';
14 break;
15 case WalletType.litecoin:
16 path = 'assets/litecoin_electrum_server_list.yml';
17 break;
18 case WalletType.haven:
19 path = 'assets/haven_node_list.yml';
20 break;
21 // TODO: (refactoring) each wallet would have its path, so `wallet.nodePath` would be decided based on chain id in Evm wallet
22 case WalletType.ethereum:
23 path = 'assets/ethereum_server_list.yml';
24 break;
25 case WalletType.nano:
26 path = 'assets/nano_node_list.yml';
27 break;
28 case WalletType.bitcoinCash:
29 path = 'assets/bitcoin_cash_electrum_server_list.yml';
30 break;
31 case WalletType.polygon:
32 path = 'assets/polygon_node_list.yml';
33 break;
34 case WalletType.solana:
35 path = 'assets/solana_node_list.yml';
36 break;
37 case WalletType.tron:
38 path = 'assets/tron_node_list.yml';
39 break;
40 case WalletType.wownero:
41 path = 'assets/wownero_node_list.yml';
42 break;
43 case WalletType.zano:
44 path = 'assets/zano_node_list.yml';
45 break;
46 case WalletType.decred:
47 path = 'assets/decred_node_list.yml';
48 break;
49 case WalletType.dogecoin:
50 path = 'assets/dogecoin_electrum_server_list.yml';
51 break;
52 case WalletType.base:
53 path = 'assets/base_node_list.yml';
54 break;
55 case WalletType.arbitrum:
56 path = 'assets/arbitrum_node_list.yml';
57 break;
58 case WalletType.zcash:
59 path = 'assets/zcash_node_list.yml';
60 break;
61 case WalletType.bsc:
62 path = 'assets/bsc_node_list.yml';
63 break;
64 case WalletType.banano:
65 case WalletType.none:
66 path = '';
67 break;
68 }
69
70 final nodesRaw = await rootBundle.loadString(path);
71 final loadedNodes = loadYaml(nodesRaw) as YamlList;
72 final nodes = <Node>[];
73
74 for (final raw in loadedNodes) {
75 if (raw is Map) {
76 final map = Map.from(raw);
77 map["isBuiltin"] = 1;
78 map["isOfficial"] = ((map["isOfficial"] as bool? ?? false) ? 1 : 0);
79 map["isDefault"] = ((map["isDefault"] as bool? ?? false) ? 1 : 0);
80
81 final node = Node.fromMap(Map<String, Object>.from(map));
82 node.type = type;
83 nodes.add(node);
84 }
85 }
86
87 return nodes;
88 }
89
90 Future<List<Node>> loadDefaultNanoPowNodes() async {
91 final powNodesRaw = await rootBundle.loadString('assets/nano_pow_node_list.yml');
92 final loadedPowNodes = loadYaml(powNodesRaw) as YamlList;
93 final nodes = <Node>[];
94
95 for (final raw in loadedPowNodes) {
96 if (raw is Map) {
97 final map = Map.from(raw);
98 map["isBuiltin"] = 1;
99 map["isOfficial"] = ((map["isOfficial"] as bool? ?? false) ? 1 : 0);
100 map["isDefault"] = ((map["isDefault"] as bool? ?? false) ? 1 : 0);
101 final node = Node.fromMap(Map<String, Object>.from(map));
102 node.isPow = true;
103 node.type = WalletType.nano;
104 nodes.add(node);
105 }
106 }
107
108 return nodes;
109 }
110
111 Future<List<Node>> loadAllDefaultNodes() async {
112 final moneroNodes = await loadDefaultNodes(WalletType.monero);
113 final bitcoinElectrumServerList = await loadDefaultNodes(WalletType.bitcoin);
114 final litecoinElectrumServerList = await loadDefaultNodes(WalletType.litecoin);
115 final bitcoinCashElectrumServerList = await loadDefaultNodes(WalletType.bitcoinCash);
116 final havenNodes = await loadDefaultNodes(WalletType.haven);
117 final ethereumNodes = await loadDefaultNodes(WalletType.ethereum);
118 final nanoNodes = await loadDefaultNodes(WalletType.nano);
119 final polygonNodes = await loadDefaultNodes(WalletType.polygon);
120 final solanaNodes = await loadDefaultNodes(WalletType.solana);
121 final tronNodes = await loadDefaultNodes(WalletType.tron);
122 final decredNodes = await loadDefaultNodes(WalletType.decred);
123 final zanoNodes = await loadDefaultNodes(WalletType.zano);
124 final dogecoinElectrumServerList = await loadDefaultNodes(WalletType.dogecoin);
125 final baseNodes = await loadDefaultNodes(WalletType.base);
126 final arbitrumNodes = await loadDefaultNodes(WalletType.arbitrum);
127 final zcashNodes = await loadDefaultNodes(WalletType.zcash);
128 final bscNodes = await loadDefaultNodes(WalletType.bsc);
129
130 return moneroNodes +
131 bitcoinElectrumServerList +
132 litecoinElectrumServerList +
133 havenNodes +
134 ethereumNodes +
135 bitcoinCashElectrumServerList +
136 nanoNodes +
137 polygonNodes +
138 solanaNodes +
139 tronNodes +
140 zanoNodes +
141 decredNodes +
142 dogecoinElectrumServerList +
143 baseNodes +
144 arbitrumNodes +
145 zcashNodes +
146 bscNodes;
147 }
148
149 Future<void> resetToDefault() async {
150 final nodes = await loadAllDefaultNodes();
151
152 final currentNodes = await Node.getAll();
153
154 // after reset, nodes should retain the id to correspond with the ones in shared prefs.
155 // alternative would be nuking the shared prefs on reset
156 for (final node in nodes) {
157 try {
158 final curr = currentNodes.firstWhere(
159 (item) => item.uri == node.uri && item.typeRaw == node.typeRaw,
160 );
161 node.id = curr.id;
162 } catch (e) {}
163 }
164
165 await Node.deleteAll();
166 for (final node in nodes) {
167 await node.save();
168 }
169 }
170
171 Future<void> resetPowToDefault() async {
172 final nanoPowNodes = await loadDefaultNanoPowNodes();
173 await Node.deleteAllPow();
174 for (final node in nanoPowNodes) {
175 node.save();
176 }
177 }
178
179 Future<Node> getDefaultNodeFromFiles(WalletType type, {bool isPow = false}) async {
180 final nodes = isPow ? await loadDefaultNanoPowNodes() : await loadDefaultNodes(type);
181 try {
182 return nodes.firstWhere((item) => item.isDefault);
183 } catch (e) {
184 // ideally the yamls would always have a default, but this is better than nothing
185 return nodes.first;
186 }
187 }