Skip to content
This repository has been archived by the owner on Sep 17, 2024. It is now read-only.

Commit

Permalink
Merge pull request #100 from MXCzkEVM/dynamic_chains_props
Browse files Browse the repository at this point in the history
Dynamic chains props
  • Loading branch information
reasje authored Oct 23, 2023
2 parents 728abb7 + e5ce2a3 commit 2e77196
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 2 deletions.
9 changes: 9 additions & 0 deletions lib/core/src/providers/providers_use_cases.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:datadashwallet/common/common.dart';
import 'package:datadashwallet/features/common/account/log_out_use_case.dart';
import 'package:datadashwallet/features/common/common.dart';
import 'package:datadashwallet/features/common/contract/chains_use_case.dart';
import 'package:datadashwallet/features/common/contract/nft_contract_use_case.dart';
import 'package:datadashwallet/features/common/contract/pricing_use_case.dart';
import 'package:datadashwallet/features/common/contract/tweets_use_case.dart';
Expand Down Expand Up @@ -146,3 +147,11 @@ final Provider<AppVersionUseCase> appVersionUseCaseProvider = Provider(
ref.watch(web3RepositoryProvider),
),
);

final Provider<ChainsUseCase> chainsUseCaseProvider = Provider(
(ref) => ChainsUseCase(
ref.watch(web3RepositoryProvider),
ref.watch(chainConfigurationUseCaseProvider),
ref.watch(authUseCaseProvider),
),
);
88 changes: 88 additions & 0 deletions lib/features/common/contract/chains_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import 'dart:async';

import 'package:datadashwallet/core/core.dart';
import 'package:datadashwallet/features/settings/subfeatures/chain_configuration/domain/chain_configuration_use_case.dart';
import 'package:mxc_logic/mxc_logic.dart';

class ChainsUseCase extends ReactiveUseCase {
ChainsUseCase(
this._repository, this._chainConfigurationUseCase, this._authUseCase);

final Web3Repository _repository;
final ChainConfigurationUseCase _chainConfigurationUseCase;
final AuthUseCase _authUseCase;

Future<ChainsRpcList> getChainsRpcUrls() async {
return await _repository.chainsRepository.getChainsRpcUrls();
}

void updateChainsRPCUrls() async {
try {
final chainsRpcUrls = await getChainsRpcUrls();
final networks = _chainConfigurationUseCase.networks.value;

for (ChainRpcUrl chainRpcUrl in chainsRpcUrls.chainList ?? []) {
final foundIndex = networks
.indexWhere((element) => element.chainId == chainRpcUrl.chainId);

if (foundIndex != -1) {
final network = networks.elementAt(foundIndex);

// If any change is detected
if (network.web3RpcHttpUrl != chainRpcUrl.httpUrl ||
network.web3RpcWebsocketUrl != chainRpcUrl.wssUrl) {
final updatedNetwork = network.copyWith(
web3RpcHttpUrl: chainRpcUrl.httpUrl,
web3RpcWebsocketUrl: chainRpcUrl.wssUrl);
// Update in DB
_chainConfigurationUseCase.updateItem(updatedNetwork, foundIndex);

if (network.enabled) {
_chainConfigurationUseCase.updateSelectedNetwork(updatedNetwork);
_authUseCase.resetNetwork(updatedNetwork);
}
}
}
}
} catch (e) {
// This update necessary since, RPC change might be essential.
updateChainsRPCUrls();
}
}

// void checkChainsRpcUrls(void Function(Network) resetNetwork, Network selectedNetwork) async {
// try {
// final chainsRpcUrls = await getChainsRpcUrls();

// for (ChainRpcUrl chain in chainsRpcUrls.chainList ?? []) {
// await checkChainRpcUrls(chain);
// }
// } catch (e) {
// checkChainsRpcUrls();
// }
// }

// Future<void> checkChainRpcUrls(ChainRpcUrl chain) async {
// for (String url in chain.rpcUrls ?? []) {
// try {
// if (url.contains('wss')) {
// await checkWebSocketRpcUrl(url);
// } else {
// await checkRpcUrl(url);
// }
// // select the rpc url
// } catch (e) {
// continue;
// }
// }
// }

// // TODO: check websocket link
// Future<int> checkWebSocketRpcUrl(String url) async {
// return _repository.chainsRepository.getBlockNumber(url);
// }

// Future<int> checkRpcUrl(String url) async {
// return _repository.chainsRepository.getBlockNumber(url);
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ class ChainConfigurationUseCase extends ReactiveUseCase {
}

void updateFixedNetworks() {
final fixedList = Network.fixedNetworks();
for (int i = 0; i < _repository.items.length; i++) {
final repoItem = _repository.items[i];

Expand All @@ -61,12 +62,26 @@ class ChainConfigurationUseCase extends ReactiveUseCase {

if (index != -1) {
// matches
final fixedItem = Network.fixedNetworks().elementAt(index);
final fixedItem = fixedList.elementAt(index);
if (!repoItem.compareWithOther(fixedItem)) {
_repository.updateItem(repoItem.copyWithOther(fixedItem), i);
}
} else {
// Fixed network does't contain repo Item It means It's deleted
_repository.removeItem(repoItem);
}
}

// Adding new networks If available
for (Network network in fixedList) {
final foundIndex =
_repository.items.indexWhere((e) => e.chainId == network.chainId);

if (foundIndex == -1) {
_repository.addItem(network);
}
}

update(networks, _repository.items);
}

Expand Down Expand Up @@ -114,6 +129,10 @@ class ChainConfigurationUseCase extends ReactiveUseCase {
update(selectedNetwork, selectedNetwork.value);
}

void updateSelectedNetwork(Network updatedSelectedNetwork) {
update(selectedNetwork, updatedSelectedNetwork);
}

/// only for details of custom network delete network page
void selectNetworkForDetails(Network network) {
update(selectedNetworkForDetails, network);
Expand Down
3 changes: 3 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ void main() {
final appVersionUseCase = container.read(appVersionUseCaseProvider);
await appVersionUseCase.checkLatestVersion();

final initializationUseCase = container.read(chainsUseCaseProvider);
initializationUseCase.updateChainsRPCUrls();

runApp(
UncontrolledProviderScope(
container: container,
Expand Down

0 comments on commit 2e77196

Please sign in to comment.