From 8a55611e482d064b1fa3b1cf759f982e67bcedec Mon Sep 17 00:00:00 2001 From: Patrick Niemeyer Date: Sun, 14 Jul 2024 15:20:03 -0500 Subject: [PATCH] app: Fix for potential bug in account selector widget. --- .../lib/api/orchid_eth/orchid_account.dart | 2 +- .../lib/orchid/account/account_selector.dart | 28 +++++++++++++------ .../account_manager/account_manager_page.dart | 8 +++--- storage/commitments/test_kzg_commitments.py | 2 ++ 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/gui-orchid/lib/api/orchid_eth/orchid_account.dart b/gui-orchid/lib/api/orchid_eth/orchid_account.dart index 37bbf070e..410f97258 100644 --- a/gui-orchid/lib/api/orchid_eth/orchid_account.dart +++ b/gui-orchid/lib/api/orchid_eth/orchid_account.dart @@ -46,7 +46,7 @@ class Account { required this.funder, // required? }); - /// Create an account with referencing a stored signer key + /// Create an account referencing a stored signer key Account.fromSignerKeyRef({ required StoredEthereumKeyRef signerKey, int version = 0, diff --git a/gui-orchid/lib/orchid/account/account_selector.dart b/gui-orchid/lib/orchid/account/account_selector.dart index 710cb9066..dbfa1750e 100644 --- a/gui-orchid/lib/orchid/account/account_selector.dart +++ b/gui-orchid/lib/orchid/account/account_selector.dart @@ -54,15 +54,25 @@ class _AccountSelectorState extends State { } Widget _buildAccountList() { - List accounts = widget.accounts.map((Account account) { - log("XXX: build view model for account: $account"); - return AccountViewModel( - chain: Chains.chainFor(account.chainId), - signerKey: account.signerKey, - funder: account.funder, - active: widget.selectedAccounts.contains(account), - detail: _accountDetailStore.get(account)); - }).toList(); + List accounts = widget.accounts + .map((Account account) { + // There should not be errors stored in accounts that would cause a problem here, however + // we've had at least one bug involving an orphaned account with no signer key. This will + // at least prevent those types of bugs from blocking the user. + try { + return AccountViewModel( + chain: Chains.chainFor(account.chainId), + signerKey: account.signerKey, + funder: account.funder, + active: widget.selectedAccounts.contains(account), + detail: _accountDetailStore.get(account)); + } catch (err) { + log("_buildAccountList: error building account view model: $err"); + return null; + } + }) + .whereType() // remove nulls + .toList(); // final footer = () { // return OrchidActionButton( diff --git a/gui-orchid/lib/pages/account_manager/account_manager_page.dart b/gui-orchid/lib/pages/account_manager/account_manager_page.dart index 9f94e7c2a..8ab7d966e 100644 --- a/gui-orchid/lib/pages/account_manager/account_manager_page.dart +++ b/gui-orchid/lib/pages/account_manager/account_manager_page.dart @@ -380,11 +380,11 @@ class _AccountManagerPageState extends State { void _deleteIdentity(StoredEthereumKey identity) async { await UserPreferencesKeys().removeKey(identity.ref()); // Remove accounts for this key. - var matchingAccounts = UserPreferencesVPN().cachedDiscoveredAccounts.get(); + Set? matchingAccounts = UserPreferencesVPN().cachedDiscoveredAccounts.get(); - // var matching = matchingAccounts - // .where((account) => account.signerKeyRef == identity.ref()); - // log("XXX: delete identity removed ${matching.length} matching accounts"); + var matching = (matchingAccounts ?? {}) + .where((account) => account.signerKeyRef == identity.ref()); + log("XXX: delete identity removing ${matching.length} matching accounts"); matchingAccounts ?.removeWhere((account) => account.signerKeyRef == identity.ref()); diff --git a/storage/commitments/test_kzg_commitments.py b/storage/commitments/test_kzg_commitments.py index e3a182fb5..e59bfda07 100644 --- a/storage/commitments/test_kzg_commitments.py +++ b/storage/commitments/test_kzg_commitments.py @@ -79,6 +79,8 @@ def test_roots_of_unity(): '0000000000000000000000000000000000000000000000000000000000000001') assert (bytes_from_fr(roots_of_unity[1]).hex() == '73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000') + assert (bytes_from_fr(roots_of_unity[3]).hex() == + '73eda753299d7d47a5e80b39939ed33467baa40089fb5bfefffeffff00000001') print("Roots of unity look correct")