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

Dynamic chains props #100

Merged
merged 2 commits into from
Oct 23, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
feat: Added chains use case & update chains rpc via Github json
reasje committed Oct 23, 2023
commit e5ce2a3d0f3cc784d9895182a7cc91b6d269e91d
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';
@@ -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);
// }
}
3 changes: 3 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -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,