Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
24 changes: 12 additions & 12 deletions mobile-app/lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,14 @@
"@addAccountMenuMultisigSubtitle": {
"description": "Add multisig menu row subtitle"
},
"addAccountMenuDiscoverMultisigTitle": "Discover Multisig",
"@addAccountMenuDiscoverMultisigTitle": {
"description": "Discover multisig menu row title"
},
"addAccountMenuDiscoverMultisigSubtitle": "Find multisigs where your accounts are signers",
"@addAccountMenuDiscoverMultisigSubtitle": {
"description": "Discover multisig menu row subtitle"
},

"multisigTag": "MULTISIG",
"@multisigTag": {
Expand All @@ -281,6 +289,10 @@
"@multisigAddTitle": {
"description": "Create multisig screen app bar title"
},
"multisigDiscoverTitle": "Discover Multisig",
"@multisigDiscoverTitle": {
"description": "Discover multisig screen app bar title"
},
"multisigCreateSubtitle": "Give this multisig a name you'll recognize. You can change it anytime.",
"@multisigCreateSubtitle": {
"description": "Subtitle under multisig name field"
Expand Down Expand Up @@ -374,10 +386,6 @@
"@multisigDone": {
"description": "Done button on multisig flow completion screens"
},
"multisigAddPasteAddressSection": "Paste Multisig Address",
"@multisigAddPasteAddressSection": {
"description": "Section label for manual multisig address entry"
},
"multisigAddDiscoveredTitle": "Discovered for you",
"@multisigAddDiscoveredTitle": {
"description": "Section title for on-chain discovered multisigs"
Expand All @@ -386,14 +394,6 @@
"@multisigAddDiscoveredSubtitle": {
"description": "Helper text under discovered multisigs section"
},
"multisigAddAddressHint": "Multisig SS58 address",
"@multisigAddAddressHint": {
"description": "Hint for multisig address text field"
},
"multisigAddFromAddressButton": "Add From Address",
"@multisigAddFromAddressButton": {
"description": "Primary button to add multisig from pasted address"
},
"multisigAddButton": "Add",
"@multisigAddButton": {
"description": "Add button on discovered multisig row"
Expand Down
6 changes: 3 additions & 3 deletions mobile-app/lib/l10n/app_id.arb
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,13 @@
"addAccountMenuImportSubtitle": "Gunakan recovery phrase untuk mengimpor",
"addAccountMenuMultisigTitle": "Buat Multisig",
"addAccountMenuMultisigSubtitle": "Siapkan alamat bersama dengan beberapa penandatangan",
"addAccountMenuDiscoverMultisigTitle": "Temukan Multisig",
"addAccountMenuDiscoverMultisigSubtitle": "Cari multisig di mana akun Anda adalah penandatangan",

"multisigTag": "MULTISIG",
"multisigProposeTitle": "Ajukan",
"multisigAddTitle": "Buat Multisig",
"multisigDiscoverTitle": "Temukan Multisig",
"multisigCreateSubtitle": "Berikan nama multisig yang mudah Anda kenali. Anda bisa mengubahnya kapan saja.",
"multisigCreateButton": "Buat",
"multisigCreateCreatingButton": "Membuat",
Expand All @@ -92,11 +95,8 @@
"multisigCreatePredictedAddressLabel": "ALAMAT MULTISIG",
"multisigCreatePredictedAddressPlaceholder": "Tambahkan penandatangan untuk melihat alamat",
"multisigDone": "Selesai",
"multisigAddPasteAddressSection": "Tempel Alamat Multisig",
"multisigAddDiscoveredTitle": "Ditemukan untuk Anda",
"multisigAddDiscoveredSubtitle": "Multisig di chain di mana salah satu akun Anda adalah penandatangan",
"multisigAddAddressHint": "Alamat SS58 multisig",
"multisigAddFromAddressButton": "Tambah Dari Alamat",
"multisigAddButton": "Tambah",
"multisigAddedButton": "Ditambahkan",
"multisigAddNoneFound": "Tidak ada multisig ditemukan.",
Expand Down
36 changes: 18 additions & 18 deletions mobile-app/lib/l10n/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,18 @@ abstract class AppLocalizations {
/// **'Set up a shared address with multiple signers'**
String get addAccountMenuMultisigSubtitle;

/// Discover multisig menu row title
///
/// In en, this message translates to:
/// **'Discover Multisig'**
String get addAccountMenuDiscoverMultisigTitle;

/// Discover multisig menu row subtitle
///
/// In en, this message translates to:
/// **'Find multisigs where your accounts are signers'**
String get addAccountMenuDiscoverMultisigSubtitle;

/// Badge label for multisig accounts
///
/// In en, this message translates to:
Expand All @@ -464,6 +476,12 @@ abstract class AppLocalizations {
/// **'Create Multisig'**
String get multisigAddTitle;

/// Discover multisig screen app bar title
///
/// In en, this message translates to:
/// **'Discover Multisig'**
String get multisigDiscoverTitle;

/// Subtitle under multisig name field
///
/// In en, this message translates to:
Expand Down Expand Up @@ -584,12 +602,6 @@ abstract class AppLocalizations {
/// **'Done'**
String get multisigDone;

/// Section label for manual multisig address entry
///
/// In en, this message translates to:
/// **'Paste Multisig Address'**
String get multisigAddPasteAddressSection;

/// Section title for on-chain discovered multisigs
///
/// In en, this message translates to:
Expand All @@ -602,18 +614,6 @@ abstract class AppLocalizations {
/// **'Multisigs on chain where one of your accounts is a signer'**
String get multisigAddDiscoveredSubtitle;

/// Hint for multisig address text field
///
/// In en, this message translates to:
/// **'Multisig SS58 address'**
String get multisigAddAddressHint;

/// Primary button to add multisig from pasted address
///
/// In en, this message translates to:
/// **'Add From Address'**
String get multisigAddFromAddressButton;

/// Add button on discovered multisig row
///
/// In en, this message translates to:
Expand Down
18 changes: 9 additions & 9 deletions mobile-app/lib/l10n/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get addAccountMenuMultisigSubtitle => 'Set up a shared address with multiple signers';

@override
String get addAccountMenuDiscoverMultisigTitle => 'Discover Multisig';

@override
String get addAccountMenuDiscoverMultisigSubtitle => 'Find multisigs where your accounts are signers';

@override
String get multisigTag => 'MULTISIG';

Expand All @@ -205,6 +211,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get multisigAddTitle => 'Create Multisig';

@override
String get multisigDiscoverTitle => 'Discover Multisig';

@override
String get multisigCreateSubtitle => 'Give this multisig a name you\'ll recognize. You can change it anytime.';

Expand Down Expand Up @@ -270,21 +279,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get multisigDone => 'Done';

@override
String get multisigAddPasteAddressSection => 'Paste Multisig Address';

@override
String get multisigAddDiscoveredTitle => 'Discovered for you';

@override
String get multisigAddDiscoveredSubtitle => 'Multisigs on chain where one of your accounts is a signer';

@override
String get multisigAddAddressHint => 'Multisig SS58 address';

@override
String get multisigAddFromAddressButton => 'Add From Address';

@override
String get multisigAddButton => 'Add';

Expand Down
18 changes: 9 additions & 9 deletions mobile-app/lib/l10n/app_localizations_id.dart
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,12 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get addAccountMenuMultisigSubtitle => 'Siapkan alamat bersama dengan beberapa penandatangan';

@override
String get addAccountMenuDiscoverMultisigTitle => 'Temukan Multisig';

@override
String get addAccountMenuDiscoverMultisigSubtitle => 'Cari multisig di mana akun Anda adalah penandatangan';

@override
String get multisigTag => 'MULTISIG';

Expand All @@ -206,6 +212,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get multisigAddTitle => 'Buat Multisig';

@override
String get multisigDiscoverTitle => 'Temukan Multisig';

@override
String get multisigCreateSubtitle =>
'Berikan nama multisig yang mudah Anda kenali. Anda bisa mengubahnya kapan saja.';
Expand Down Expand Up @@ -272,21 +281,12 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get multisigDone => 'Selesai';

@override
String get multisigAddPasteAddressSection => 'Tempel Alamat Multisig';

@override
String get multisigAddDiscoveredTitle => 'Ditemukan untuk Anda';

@override
String get multisigAddDiscoveredSubtitle => 'Multisig di chain di mana salah satu akun Anda adalah penandatangan';

@override
String get multisigAddAddressHint => 'Alamat SS58 multisig';

@override
String get multisigAddFromAddressButton => 'Tambah Dari Alamat';

@override
String get multisigAddButton => 'Tambah';

Expand Down
41 changes: 24 additions & 17 deletions mobile-app/lib/providers/multisig_providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ class MultisigAccountsNotifier extends StateNotifier<AsyncValue<List<MultisigAcc

Future<void> add(MultisigAccount account) async {
await _settingsService.addMultisigAccount(account);
state.whenData((current) {
state = AsyncValue.data([...current, account]);
});

final current = state.value ?? [];
state = AsyncValue.data([...current, account]);
}

Future<void> updateName(MultisigAccount account, String name) async {
Expand All @@ -37,16 +37,16 @@ class MultisigAccountsNotifier extends StateNotifier<AsyncValue<List<MultisigAcc
}
final updated = account.copyWith(name: name);
await _settingsService.updateMultisigAccount(updated);
state.whenData((current) {
state = AsyncValue.data(current.map((a) => a.accountId == updated.accountId ? updated : a).toList());
});

final current = state.value ?? [];
state = AsyncValue.data(current.map((a) => a.accountId == updated.accountId ? updated : a).toList());
}

Future<void> remove(String accountId) async {
await _settingsService.removeMultisigAccount(accountId);
state.whenData((current) {
state = AsyncValue.data(current.where((a) => a.accountId != accountId).toList());
});

final current = state.value ?? [];
state = AsyncValue.data(current.where((a) => a.accountId != accountId).toList());
}

MultisigAccount? byAccountId(String accountId) {
Expand All @@ -55,6 +55,10 @@ class MultisigAccountsNotifier extends StateNotifier<AsyncValue<List<MultisigAcc
orElse: () => throw Exception('Multisig $accountId not found'),
);
}

void reset() {
state = const AsyncValue.data([]);
}
}

final multisigAccountsProvider = StateNotifierProvider<MultisigAccountsNotifier, AsyncValue<List<MultisigAccount>>>((
Expand All @@ -67,18 +71,21 @@ final multisigAccountsProvider = StateNotifierProvider<MultisigAccountsNotifier,
final discoveredMultisigsProvider = FutureProvider.autoDispose<List<MultisigAccount>>((ref) async {
final service = ref.watch(multisigServiceProvider);
final accountsAsync = ref.watch(accountsProvider);
final accounts = accountsAsync.value ?? [];

final List<Account> accounts;
switch (accountsAsync) {
case AsyncData(:final value):
accounts = value;
case AsyncError(:final error, :final stackTrace):
Error.throwWithStackTrace(error, stackTrace);
case AsyncLoading():
accounts = await ref.read(accountsServiceProvider).getAccounts();
}

final ids = accounts.map((a) => a.accountId).toList();
return service.discoverForUser(ids);
});

final multisigLookupProvider = FutureProvider.autoDispose.family<MultisigAccount?, String>((ref, address) async {
final service = ref.watch(multisigServiceProvider);
final accountsAsync = ref.watch(accountsProvider);
final ids = (accountsAsync.value ?? []).map((a) => a.accountId).toList();
return service.lookupByAddress(address, ids);
});

final multisigOpenProposalsProvider = FutureProvider.autoDispose.family<List<MultisigProposal>, MultisigAccount>((
ref,
msig,
Expand Down
3 changes: 3 additions & 0 deletions mobile-app/lib/services/logout_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:resonance_network_wallet/providers/account_providers.dart';
import 'package:resonance_network_wallet/providers/currency_display_provider.dart';
import 'package:resonance_network_wallet/providers/l10n_provider.dart';
import 'package:resonance_network_wallet/providers/mining_rewards_provider.dart';
import 'package:resonance_network_wallet/providers/multisig_providers.dart';
import 'package:resonance_network_wallet/providers/pending_multisig_creations_provider.dart';
import 'package:resonance_network_wallet/providers/pending_transactions_provider.dart';
import 'package:resonance_network_wallet/providers/remote_config_provider.dart';
Expand All @@ -30,6 +31,8 @@ class LogoutService {
_ref.invalidate(miningRewardsProvider);
_ref.read(accountsProvider.notifier).reset();
_ref.read(activeAccountProvider.notifier).reset();
_ref.read(multisigAccountsProvider.notifier).reset();
_ref.invalidate(discoveredMultisigsProvider);
_ref.read(accountAssociationsProvider.notifier).reset();
await _ref.read(selectedAppLocaleProvider.notifier).reset();
await _ref.read(selectedFiatCurrencyProvider.notifier).reset();
Expand Down
18 changes: 18 additions & 0 deletions mobile-app/lib/v2/screens/accounts/add_account_menu_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:quantus_sdk/quantus_sdk.dart';
import 'package:resonance_network_wallet/providers/account_providers.dart';
import 'package:resonance_network_wallet/providers/l10n_provider.dart';
import 'package:resonance_network_wallet/providers/multisig_providers.dart';
import 'package:resonance_network_wallet/shared/utils/account_utils.dart';
import 'package:resonance_network_wallet/v2/components/scaffold_base.dart';
import 'package:resonance_network_wallet/v2/components/v2_app_bar.dart';
import 'package:resonance_network_wallet/v2/screens/accounts/create_account_screen.dart';
import 'package:resonance_network_wallet/v2/screens/import/import_wallet_screen.dart';
import 'package:resonance_network_wallet/v2/screens/multisig/add_multisig_screen.dart';
import 'package:resonance_network_wallet/v2/screens/multisig/discover_multisig_screen.dart';
import 'package:resonance_network_wallet/v2/theme/app_colors.dart';
import 'package:resonance_network_wallet/v2/theme/app_text_styles.dart';

Expand All @@ -35,6 +37,11 @@ class _AddAccountMenuScreenState extends ConsumerState<AddAccountMenuScreen> {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => const AddMultisigScreen()));
}

void _onDiscoverMultisig() {
ref.invalidate(discoveredMultisigsProvider);
Navigator.of(context).push(MaterialPageRoute(builder: (_) => const DiscoverMultisigScreen()));
}

@override
Widget build(BuildContext context) {
final l10n = ref.watch(l10nProvider);
Expand Down Expand Up @@ -67,6 +74,17 @@ class _AddAccountMenuScreenState extends ConsumerState<AddAccountMenuScreen> {
const SizedBox(height: 16),
Divider(color: colors.toasterBackground, height: 1),
const SizedBox(height: 24),
_AddMenuRow(
icon: Icons.radar_outlined,
title: l10n.addAccountMenuDiscoverMultisigTitle,
subtitle: l10n.addAccountMenuDiscoverMultisigSubtitle,
onTap: _onDiscoverMultisig,
colors: colors,
text: context.themeText,
),
const SizedBox(height: 16),
Divider(color: colors.toasterBackground, height: 1),
const SizedBox(height: 24),
_AddMenuRow(
icon: Icons.save_alt,
title: l10n.addAccountMenuImportTitle,
Expand Down
2 changes: 2 additions & 0 deletions mobile-app/lib/v2/screens/import/import_wallet_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ class _ImportWalletScreenV2State extends ConsumerState<ImportWalletScreenV2> {
}
}

/// Discovers on-chain HD accounts only. Multisigs are added manually via
/// Add Account → Discover Multisig.
Future<void> _discoverAccounts(String mnemonic) async {
try {
final discovered = await _discoveryService.discoverAccounts(mnemonic: mnemonic, walletIndex: widget.walletIndex);
Expand Down
Loading