Skip to content

Commit

Permalink
Merge pull request #214 from hypha-dao/feature/pay_for_cpu
Browse files Browse the repository at this point in the history
add pay CPU action
  • Loading branch information
n13 authored Jul 19, 2023
2 parents f1a45ef + 1200abb commit ff284f6
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 26 deletions.
6 changes: 4 additions & 2 deletions lib/core/di/services_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ Future<void> _registerServicesModule() async {
networkingManager: _getIt<NetworkingManager>(), remoteConfigService: _getIt<RemoteConfigService>()));
_registerLazySingleton(() => TransactionHistoryService(_getIt<NetworkingManager>()));
_registerLazySingleton(() => TokenService(_getIt<NetworkingManager>()));
_registerLazySingleton(() => HyphaMemberService(_getIt<NetworkingManager>()));
_registerLazySingleton(() => SignTransactionCallbackService(_getIt<NetworkingManager>()));
_registerLazySingleton(() => HyphaMemberService(_getIt<NetworkingManager>(), _getIt<RemoteConfigService>()));
_registerLazySingleton(() => SignTransactionCallbackService(
_getIt<NetworkingManager>(),
));
_registerLazySingleton(() =>
DaoService(networkingManager: _getIt<NetworkingManager>(), remoteConfigService: _getIt<RemoteConfigService>()));

Expand Down
35 changes: 29 additions & 6 deletions lib/core/network/api/services/hypha_member_service.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart';
import 'package:hypha_wallet/core/network/api/services/remote_config_service.dart';
import 'package:hypha_wallet/core/network/networking_manager.dart';
import 'package:hypha_wallet/ui/architecture/result/result.dart';

class HyphaMemberService {
final NetworkingManager networkingManager;
final RemoteConfigService remoteConfigService;

HyphaMemberService(this.networkingManager);
HyphaMemberService(this.networkingManager, this.remoteConfigService);

Future<List<Map<String, dynamic>>> _getTableRows(
String code,
Expand Down Expand Up @@ -39,20 +41,41 @@ class HyphaMemberService {
/// Find a hypha accounts starting with prefix
Future<Result<List<String>, HyphaError>> findHyphaAccounts({
required String prefix,
required Networks network,
}) async {
try {
final res = await _getTableRows(
'dao.hypha',
'dao.hypha',
final daoContract = remoteConfigService.daoContract(network: network);
final rows = await _getTableRows(
daoContract,
daoContract,
'members',
lower: prefix.toLowerCase(),
upper: prefix.toLowerCase().padRight(12, 'z'),
);
final names = List<String>.from(res.map((e) => e['name']));
print('res: $names');
final names = List<String>.from(rows.map((e) => e['name']));
return Result.value(names);
} catch (error) {
return Result.error(HyphaError.fromError(error));
}
}

Future<Result<bool, HyphaError>> isMember({
required String account,
required Networks network,
}) async {
try {
final daoContract = remoteConfigService.daoContract(network: network);
final rows = await _getTableRows(
daoContract,
daoContract,
'members',
lower: account,
upper: account,
limit: 1,
);
return Result.value(rows.isNotEmpty);
} catch (error) {
return Result.error(HyphaError.fromError(error));
}
}
}
34 changes: 34 additions & 0 deletions lib/core/network/api/services/pay_cpu_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:hypha_wallet/core/crypto/eosdart/eosdart.dart';
import 'package:hypha_wallet/core/crypto/seeds_esr/eos_action.dart';
import 'package:hypha_wallet/core/network/api/eos_service.dart';
import 'package:hypha_wallet/core/network/api/services/remote_config_service.dart';
import 'package:hypha_wallet/core/network/networking_manager.dart';

class PayForCpuService {
final NetworkingManager networkingManager;
final EOSService eosService;

PayForCpuService(
this.eosService,
this.networkingManager,
);

/// Usage: preload the payCpuAction for any member who is a Hypha member - see HyphaMemberService
EOSAction payCpuAction({
required String account,
required Networks network,
}) {
final contractName = eosService.remoteConfigService.payCpuContract(network: network);
final action = EOSAction()
..account = contractName
..name = 'payforcpu'
..data = {'account': account}
..authorization = [
Authorization()
..actor = account
..permission = 'active'
];

return action;
}
}
30 changes: 24 additions & 6 deletions lib/core/network/api/services/remote_config_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,16 @@ class RemoteConfigService {
return networkConfig['inviteContract'];
}

String payCpuContract({Networks? network}) {
final networkConfig = _getNetworkConfig(network: network);
return networkConfig['payCpuContract'];
}

String daoContract({Networks? network}) {
final networkConfig = _getNetworkConfig(network: network);
return networkConfig['daoContract'];
}

bool get isSignUpEnabled => FirebaseRemoteConfig.instance.getBool('signUpEnabled');
bool get isWalletEnabled => FirebaseRemoteConfig.instance.getBool('walletEnabled');

Expand Down Expand Up @@ -100,40 +110,48 @@ class RemoteConfigService {
'endpoint': 'https://mainnet.telos.net',
'fastEndpoint': 'https://mainnet.telos.net',
'loginContract': 'eosio.login',
'inviteContract': 'join.hypha',
'loginAction': 'loginuser',
'logoutAction': 'deletelogin',
'inviteContract': 'join.hypha',
'payCpuContract': 'paycpu.hypha',
'daoContract': 'dao.hypha',
'graphQlEndpoint': 'https://alpha-dhomn.tekit.io/graphql'
},
'telosTestnet': {
'name': 'Telos Testnet',
'endpoint': 'https://testnet.telos.net',
'fastEndpoint': 'https://testnet.telos.net',
'loginContract': 'eosio.login',
'inviteContract': 'joinhypha111',
'loginAction': 'loginuser',
'logoutAction': 'deletelogin',
'inviteContract': 'joinhypha111',
'payCpuContract': 'paycpuxhypha',
'daoContract': 'mtdhoxhyphaa',
'graphQlEndpoint': 'https://alpha-stts.tekit.io/graphql'
},
'eos': {
'name': 'EOS',
'endpoint': 'https://eos.greymass.com',
'fastEndpoint': 'https://eos.greymass.com',
'loginContract': 'eosio.login',
'inviteContract': 'join.hypha',
'loginAction': 'loginuser',
'logoutAction': 'deletelogin',
'graphQlEndpoint': ''
'inviteContract': 'join.hypha',
'payCpuContract': 'paycpu.hypha',
'daoContract': 'dao.hypha',
'graphQlEndpoint': 'https://nameless-brook-400051.eu-central-1.aws.cloud.dgraph.io/graphql'
},
'eosTestnet': {
'name': 'Jungle4 Testnet',
'endpoint': 'https://jungle4.dfuse.eosnation.io',
'fastEndpoint': 'https://jungle4.dfuse.eosnation.io',
'loginContract': 'eosio.login',
'inviteContract': 'joinxhypha11',
'loginAction': 'loginuser',
'logoutAction': 'deletelogin',
'graphQlEndpoint': ''
'inviteContract': 'joinxhypha11',
'payCpuContract': 'paycpuxhypha',
'daoContract': 'dao.hypha',
'graphQlEndpoint': 'https://nameless-brook-400226.eu-central-1.aws.cloud.dgraph.io/graphql'
}
}),
'accountCreatorEndpoint': 'http://34.236.29.152:9108',
Expand Down
5 changes: 3 additions & 2 deletions lib/core/network/repository/user_account_repository.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart';
import 'package:hypha_wallet/core/network/api/services/hypha_member_service.dart';
import 'package:hypha_wallet/core/network/api/services/remote_config_service.dart';
import 'package:hypha_wallet/core/network/api/services/user_account_service.dart';
import 'package:hypha_wallet/ui/architecture/result/result.dart';

Expand All @@ -19,7 +20,7 @@ class UserAccountRepository {
return _userService.findAvailableUserAccount(fullName);
}

Future<Result<List<String>, HyphaError>> findHyphaAccounts(String prefix) {
return _memberService.findHyphaAccounts(prefix: prefix);
Future<Result<List<String>, HyphaError>> findHyphaAccounts(String prefix, Networks network) {
return _memberService.findHyphaAccounts(prefix: prefix, network: network);
}
}
11 changes: 7 additions & 4 deletions lib/ui/search_user/interactor/search_user_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart';
import 'package:hypha_wallet/core/network/api/services/remote_config_service.dart';
import 'package:hypha_wallet/core/network/models/user_profile_data.dart';
import 'package:hypha_wallet/ui/architecture/interactor/page_states.dart';
import 'package:hypha_wallet/ui/architecture/result/result.dart';
Expand Down Expand Up @@ -32,16 +33,18 @@ class SearchUserBloc extends Bloc<SearchUserEvent, SearchUserState> {

/// Debounce to avoid making search network calls each time the user types
/// switchMap: To remove the previous event. Every time a new Stream is created, the previous Stream is discarded.
Stream<_OnSearchQueryChanged> _transformEvents(
Stream<_OnSearchQueryChanged> events, Stream<_OnSearchQueryChanged> Function(_OnSearchQueryChanged) transitionFn) {
Stream<_OnSearchQueryChanged> _transformEvents(Stream<_OnSearchQueryChanged> events,
Stream<_OnSearchQueryChanged> Function(_OnSearchQueryChanged) transitionFn) {
return events.debounceTime(const Duration(milliseconds: 300)).switchMap(transitionFn);
}

Future<void> _onSearchQueryChanged(_OnSearchQueryChanged event, Emitter<SearchUserState> emit) async {
emit(state.copyWith(pageState: PageState.loading, showClearIcon: event.query.isNotEmpty));
if (event.query.length > _minTextLengthBeforeValidSearch) {
final Result<List<UserProfileData>, HyphaError> results = await searchForMemberUseCase.run(event.query.toLowerCase());
if(results.isValue) {
final searchNetwork = Networks.telos; // TODO(Gery): This needs to be the account's network
final Result<List<UserProfileData>, HyphaError> results =
await searchForMemberUseCase.run(event.query.toLowerCase(), searchNetwork);
if (results.isValue) {
emit(state.copyWith(users: results.asValue!.value, pageState: PageState.success));
} else {
emit(state.copyWith(pageState: PageState.failure));
Expand Down
10 changes: 4 additions & 6 deletions lib/ui/search_user/usecases/search_for_user_use_case.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@

import 'package:hypha_wallet/core/error_handler/model/hypha_error.dart';
import 'package:hypha_wallet/core/network/api/services/remote_config_service.dart';
import 'package:hypha_wallet/core/network/models/user_profile_data.dart';
import 'package:hypha_wallet/core/network/repository/user_account_repository.dart';
import 'package:hypha_wallet/ui/architecture/result/result.dart';
import 'package:hypha_wallet/ui/shared/usercases/get_user_profiles_from_accounts_use_case.dart';


class SearchForMemberUseCase {
final UserAccountRepository userAccountRepository;
final GetUserProfilesFromAccountsUseCase getUserProfilesFromAccountsUseCase;
// FindAvailableAccountUseCase

SearchForMemberUseCase(this.userAccountRepository, this.getUserProfilesFromAccountsUseCase);

Future<Result<List<UserProfileData>, HyphaError>> run(String searchQuery) async {
final Result<List<String>, HyphaError> result = await userAccountRepository.findHyphaAccounts(searchQuery);
if(result.isValue) {
Future<Result<List<UserProfileData>, HyphaError>> run(String searchQuery, Networks network) async {
final Result<List<String>, HyphaError> result = await userAccountRepository.findHyphaAccounts(searchQuery, network);
if (result.isValue) {
return getUserProfilesFromAccountsUseCase.run(result.asValue!.value);
}

Expand Down

0 comments on commit ff284f6

Please sign in to comment.