Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Process wallet accounts from backup on account recovery #20160

Merged
merged 6 commits into from
Jun 7, 2024

Conversation

smohamedjavid
Copy link
Member

fixes #18875

Summary

This PR:

  • adds a feature to process backed-up wallet data on account recovery (without the necessity to re-login)
  • refactors keypair data store functions (helpful in wallet settings as well)
  • refactors wallet event to support calling for single account/address

Before and after comparison

Before After
develop.branch.mp4
feature.mp4

Known Issue ⚠️

The collectables are not fetched for the recovered accounts until we re-login. This issue is also happening on the Desktop and needs to be investigated in status-go separately.

Platforms

  • Android
  • iOS

Steps to test

Prerequisite: Make sure the data is backed up in the Waku
  • Open Status
  • Recover a user with multiple wallet accounts and key pairs
  • Verify the accounts and key pairs are shown after recovery (without having to re-login)

A quick regression test is highly appreciated to ensure the changes don't break any existing features.

status: ready

@smohamedjavid smohamedjavid self-assigned this May 23, 2024
@status-im-auto
Copy link
Member

status-im-auto commented May 23, 2024

Jenkins Builds

Click to see older builds (45)
Commit #️⃣ Finished (UTC) Duration Platform Result
4c99ec0 #1 2024-05-23 12:53:19 ~3 min tests 📄log
✔️ 4c99ec0 #1 2024-05-23 12:57:29 ~7 min android-e2e 🤖apk 📲
✔️ 4c99ec0 #1 2024-05-23 12:57:40 ~7 min android 🤖apk 📲
✔️ 4c99ec0 #1 2024-05-23 12:59:06 ~8 min ios 📱ipa 📲
✔️ f6676e9 #2 2024-05-23 13:10:04 ~4 min tests 📄log
✔️ f6676e9 #2 2024-05-23 13:13:13 ~7 min android 🤖apk 📲
✔️ f6676e9 #2 2024-05-23 13:14:01 ~8 min android-e2e 🤖apk 📲
✔️ f6676e9 #2 2024-05-23 13:14:06 ~8 min ios 📱ipa 📲
✔️ 5ed7327 #3 2024-05-27 11:05:49 ~4 min tests 📄log
✔️ 5ed7327 #3 2024-05-27 11:09:01 ~7 min android-e2e 🤖apk 📲
✔️ 5ed7327 #3 2024-05-27 11:09:54 ~8 min android 🤖apk 📲
✔️ 5ed7327 #3 2024-05-27 11:09:58 ~8 min ios 📱ipa 📲
✔️ ef6be8c #4 2024-05-27 12:01:43 ~6 min android 🤖apk 📲
✔️ ef6be8c #4 2024-05-27 12:02:27 ~7 min android-e2e 🤖apk 📲
✔️ ef6be8c #4 2024-05-27 12:03:17 ~8 min ios 📱ipa 📲
✔️ ef6be8c #4 2024-05-27 12:04:00 ~9 min tests 📄log
✔️ 5893e85 #5 2024-05-29 14:53:23 ~3 min tests 📄log
✔️ 5893e85 #5 2024-05-29 14:56:26 ~7 min android-e2e 🤖apk 📲
✔️ 5893e85 #5 2024-05-29 14:56:34 ~7 min android 🤖apk 📲
✔️ 5893e85 #5 2024-05-29 14:57:50 ~8 min ios 📱ipa 📲
✔️ cf13d0a #6 2024-05-29 21:13:28 ~4 min tests 📄log
✔️ cf13d0a #6 2024-05-29 21:15:11 ~6 min android-e2e 🤖apk 📲
✔️ cf13d0a #6 2024-05-29 21:16:15 ~7 min android 🤖apk 📲
✔️ cf13d0a #6 2024-05-29 21:17:32 ~8 min ios 📱ipa 📲
✔️ f7ad755 #7 2024-05-30 12:21:32 ~4 min tests 📄log
✔️ f7ad755 #7 2024-05-30 12:24:00 ~7 min android-e2e 🤖apk 📲
✔️ f7ad755 #7 2024-05-30 12:25:22 ~8 min ios 📱ipa 📲
✔️ f7ad755 #7 2024-05-30 12:25:37 ~8 min android 🤖apk 📲
✔️ ac45fd2 #8 2024-06-03 12:04:23 ~4 min tests 📄log
✔️ ac45fd2 #8 2024-06-03 12:06:11 ~6 min android 🤖apk 📲
✔️ ac45fd2 #8 2024-06-03 12:07:14 ~7 min android-e2e 🤖apk 📲
✔️ ac45fd2 #8 2024-06-03 12:08:58 ~8 min ios 📱ipa 📲
✔️ 0856323 #9 2024-06-04 19:05:31 ~4 min tests 📄log
✔️ 0856323 #9 2024-06-04 19:07:22 ~6 min android-e2e 🤖apk 📲
✔️ 0856323 #9 2024-06-04 19:08:37 ~7 min android 🤖apk 📲
✔️ 0856323 #9 2024-06-04 19:10:17 ~9 min ios 📱ipa 📲
✔️ d4a14f9 #10 2024-06-05 20:24:34 ~4 min tests 📄log
✔️ d4a14f9 #10 2024-06-05 20:26:14 ~6 min android-e2e 🤖apk 📲
✔️ d4a14f9 #10 2024-06-05 20:26:42 ~6 min android 🤖apk 📲
✔️ d4a14f9 #10 2024-06-05 20:31:10 ~10 min ios 📱ipa 📲
✔️ 784cb63 #11 2024-06-07 08:10:47 ~4 min tests 📄log
✔️ 784cb63 #11 2024-06-07 08:13:06 ~6 min android-e2e 🤖apk 📲
✔️ 784cb63 #11 2024-06-07 08:14:51 ~8 min android 🤖apk 📲
✔️ 784cb63 #11 2024-06-07 08:20:13 ~13 min ios 📱ipa 📲
✔️ 784cb63 #12 2024-06-07 08:33:13 ~12 min ios 📱ipa 📲
Commit #️⃣ Finished (UTC) Duration Platform Result
✔️ 9cdffc6 #12 2024-06-07 11:08:30 ~4 min tests 📄log
✔️ 9cdffc6 #12 2024-06-07 11:12:02 ~7 min android-e2e 🤖apk 📲
✔️ 9cdffc6 #12 2024-06-07 11:12:58 ~8 min android 🤖apk 📲
✔️ 9cdffc6 #13 2024-06-07 11:18:53 ~14 min ios 📱ipa 📲
✔️ b37fe75 #13 2024-06-07 14:46:27 ~4 min tests 📄log
✔️ b37fe75 #13 2024-06-07 14:49:39 ~7 min android 🤖apk 📲
✔️ b37fe75 #13 2024-06-07 14:49:40 ~7 min android-e2e 🤖apk 📲
✔️ b37fe75 #14 2024-06-07 14:57:25 ~15 min ios 📱ipa 📲

@smohamedjavid smohamedjavid force-pushed the feature/process-wallet-data-from-backup branch from 4c99ec0 to f6676e9 Compare May 23, 2024 13:04
Comment on lines 112 to 139
(defn get-keypair-operability
[{:keys [accounts]}]
(cond
(some #(= (:operable %) :no) accounts)
:no

(some #(= (:operable %) :partially) accounts)
:partially

:else
:fully))

(defn- add-keys-to-keypair
[keypair]
(assoc keypair :operable (get-keypair-operability keypair)))

(defn rpc->keypair
[keypair]
(-> keypair
(update :type keyword)
(update :accounts #(map rpc->account %))
add-keys-to-keypair))

(defn rpc->keypairs
[keypairs]
(let [renamed-data (sort-and-rename-keypairs keypairs)]
(cske/transform-keys csk/->kebab-case-keyword renamed-data)))
(->> (map rpc->keypair keypairs)
(sort-by #(if (= (:type %) :profile) 0 1))))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Refactored key pair data store functions

@@ -57,16 +57,16 @@
(rf/reg-event-fx
:wallet/get-accounts-success
(fn [{:keys [db]} [accounts]]
(let [wallet-accounts (filter #(not (:chat %)) accounts)
(let [wallet-accounts (data-store/rpc->accounts accounts)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The filter is already in the rpc->accounts method. Just removed the duplication.

Comment on lines 83 to 90
(rf/reg-event-fx
:wallet/process-account-from-signal
(fn [{:keys [db]} [{:keys [address] :as account}]]
{:db (assoc-in db [:wallet :accounts address] (data-store/rpc->account account))
:fx [[:dispatch [:wallet/get-wallet-token-for-account address]]
[:dispatch [:wallet/request-new-collectibles-for-account-from-signal address]]
[:dispatch [:wallet/check-recent-history-for-account address]]]}))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Introduced this new event to process accounts/addresses individually.

I have used the suffix -from-signal as right now we use this event for processing backed-up data but in the near future, we will handle sync messages (If an account is modified/created/deleted in a paired device, the other device is notified when online and this can handle those scenarios too)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's good to dispatch smaller events because they'll take less time to process, the problem is if they are touching the database too often and we have subscriptions mounted that react to it. We may end up having a lot of not needed rerenders.

To fix it we can write in the "subscribed" keys in batches, similar to what I did with collectibles.

Have you checked if this approach is triggering more rerenders than needed, for example, in the wallet home?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I doubt touching app-db often as this event is dispatched only when we process the backed-up data* (during recovery) or receive any new data* from the paired device (yet to be done).
*watch-only account or Key pair

In the case of recovery, The user won't immediately land in the wallet home after we receive the login signal (goes through Identifier, Notification, and get started page) which gives us a bit of time to update the app-db and unwrapping/update the assets data upon receiving from status-go before the user lands in the wallet tab. Later in the future, we will have a progress screen for backup recovery (just like Desktop).

Yes, there are re-renders whenever the loading state of an account changes and the card in the home updates. Apart from that, I don't see any unwanted re-renders.

(log/debug ::unknown-wallet-event
:type event-type
:event (transforms/js->clj event-js))))))
(log/debug ::unknown-wallet-event :type event-type)))))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed the transform method in the log as it's not needed.

Comment on lines 40 to 60
(rf/reg-sub
:wallet/tokens-loading?
:wallet/tokens-loading
:<- [:wallet/ui]
:-> :tokens-loading?)
:-> :tokens-loading)

(rf/reg-sub
:wallet/home-tokens-loading?
:<- [:wallet/tokens-loading]
(fn [tokens-loading]
(->> tokens-loading
vals
(some true?))))

(rf/reg-sub
:wallet/current-viewing-account-tokens-loading?
:<- [:wallet/tokens-loading]
:<- [:wallet/current-viewing-account-address]
(fn [[tokens-loading current-viewing-account-address]]
(get tokens-loading current-viewing-account-address)))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made the tokens loading flag granular to the account

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's be careful with this change, it may create bugs. Is there a special reason to change this?

Since we aren't able to see two accounts at the same time, I wonder if makes sense to know that an account that is off screen is loaded or loading 🤔

I think this change needs some extra refactors, such as when we create a new account, make sure to properly mark it this key as loading, same when they are received.

I'd like to know the reason to make this change because we may be adding some extra complexity that maybe we don't need.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a special reason to change this?

When we receive a backed-up watch-only account or keypair from Waku, we process the accounts individually (by storing them in our app-db, fetching assets, and balances) as we can't rely on a single boolean/flag (tokens-loading?) as it will affect existing account(s). So, I made it granular so that each account can refer to its token loading state (in the account screen and account card at home). For the home tab - aggregated tokens and balance - if any accounts are loading, it will show the loading UI.

Additionally, we won't receive all data at once. So, we need to make it a granular approach for easy processing.

Also, it's not good to call the wallet_getAccounts (or any assets RPC) every time we receive any backed-up data as it will make a lot of requests/processing time.

Since we aren't able to see two accounts at the same time, I wonder if makes sense to know that an account that is off screen is loaded or loading 🤔

The existing flag tokens-loading? is global and shows loading for all account cards as it fetches all accounts in one shot. Making it granular at least shows balances for accounts that are loaded while the user can scroll through it.

I think this change needs some extra refactors, such as when we create a new account, make sure to properly mark it this key as loading, same when they are received.

When a new account is added, we fetch all accounts and other chain of events (tokens, collectibles,..etc) that are dispatched as usual, It's the existing feature/code. It ensures the key is marked as loading (for every account).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❗ Just for information: Every watch-only account is sent in a signal separately and every keypair is sent separately in a signal. For the derived accounts, we need to parse through keypairs and fetch assets for those accounts. Same for the watch-only accounts.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smohamedjavid Thanks for the explanation.

Again, just make sure to properly update the code that is related and that may be affected.

Will we ask for manual QA to make sure nothing is broken?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will we ask for manual QA to make sure nothing is broken?

Yes, we will do a manual QA for this PR 👍

@smohamedjavid smohamedjavid marked this pull request as ready for review May 23, 2024 13:23
Copy link
Contributor

@ulisesmac ulisesmac left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @smohamedjavid !

THanks for the PR, I left some comments with some questions, it's a big refactor so just want to make sure we have everything under control

Comment on lines 112 to 123
(defn get-keypair-operability
[{:keys [accounts]}]
(cond
(some #(= (:operable %) :no) accounts)
:no

(some #(= (:operable %) :partially) accounts)
:partially

:else
:fully))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although the function name is clear enough, I'd suggest renaming the returned keywords to be more explicit, since we may pass these values and it may be confusing.

What about :partially-operable o :partial-operability?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand what is get-keypair-operability doing? What does partially operable mean?

Also is the sorting not required?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about :partially-operable o :partial-operability?

@ulisesmac - I have no strong opinion as I followed the same value we use in status-go. Additionally, I think it's repetitive as the key for that value is :operable and we include the same as the suffix. But, I'm happy to change it if everyone felt like that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand what is get-keypair-operability doing? What does partially operable mean?

@OmarBasem - Based on the operability of accounts from a key pair we determine whether that keypair is fully operable or not. This helps to sort and show keypairs which don't have keystore files in the wallet settings (Maybe in the wallet home too).

What does partially operable mean?

The Keystore for that keypair (of derived account) is present but we need the user's authentication to make it fully operable. This case happens mostly/only in the profile keypair of the recovered accounts.

To the user, the fully operable and partially operable looks the same. Only the no operable account won't be able to perform any transactions in that account.

Also is the sorting not required?

We still do the sorting to show the profile keypair first (by checking the type of the keypair).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smohamedjavid thanks for the clarification. I currently do not see usages of operable in the codebase. Is that functionality yet to be implemented?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes @OmarBasem, it will be used soon in our codebase.

  • To sort the missing keypairs in wallet settings
  • To show the accounts that are non-operable in different types of account cards in the wallet home

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@smohamedjavid

Now I'm having more questions on this function.

Do we receive a keypair and its accounts? If so, consider adding :as _keypair to the destructuring.

If so, then each account inside a keypair has an operability defined? why? I don't understand it, I believe all the accounts inside a keypair have the same operability as the keypair, since they are derived from it.

I'd really appreciate an explanation :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ulisesmac - As we discussed async about the different keypairs and accounts, I have updated the key name to lowest-operability to NOT confuse it with the operable key of the accounts.


Add a short answer to your question for others to know:

Do we receive a keypair and its accounts? If so, consider adding :as _keypair to the destructuring.

Yes, each keypair map will have an accounts key which has all the accounts generated from it.

If so, then each account inside a keypair has an operability defined? why? I don't understand it, I believe all the accounts inside a keypair have the same operability as the keypair, since they are derived from it.

It depends on the keypair.

Let's take Profile keypair. If you recover the account, the default account is fully operable.
But, if there is any other account generated from it, it will be partially operable for security reasons. status-im/status-desktop#10772

If there is any seed-phrase key pair or private key - key pair, all the accounts generated from it are no operable as its keystore is missing.

Fully -> Keystore files are there and validated
Partially -> Keystore files are there but need to be validated (by the user's password)
No -> There are no keystore files for this keypair

For Partially operable accounts/keypair -> It looks the same as the fully operable to the user. Whenever there is password authentication in the app, we need to call one other method to make partially operable accounts fully operable.

Introducing this new key lowest-operability will help us sort the missing keypairs quickly in the wallet settings.

Comment on lines 83 to 90
(rf/reg-event-fx
:wallet/process-account-from-signal
(fn [{:keys [db]} [{:keys [address] :as account}]]
{:db (assoc-in db [:wallet :accounts address] (data-store/rpc->account account))
:fx [[:dispatch [:wallet/get-wallet-token-for-account address]]
[:dispatch [:wallet/request-new-collectibles-for-account-from-signal address]]
[:dispatch [:wallet/check-recent-history-for-account address]]]}))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's good to dispatch smaller events because they'll take less time to process, the problem is if they are touching the database too often and we have subscriptions mounted that react to it. We may end up having a lot of not needed rerenders.

To fix it we can write in the "subscribed" keys in batches, similar to what I did with collectibles.

Have you checked if this approach is triggering more rerenders than needed, for example, in the wallet home?

src/status_im/contexts/wallet/events.cljs Outdated Show resolved Hide resolved
src/status_im/contexts/wallet/events.cljs Outdated Show resolved Hide resolved
src/status_im/subs/wallet/wallet_test.cljs Show resolved Hide resolved
Copy link
Member

@seanstrom seanstrom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good ✅
Left a few comments about tests 🧪

src/status_im/common/signals/events.cljs Show resolved Hide resolved
src/status_im/contexts/wallet/collectible/events.cljs Outdated Show resolved Hide resolved
src/status_im/contexts/wallet/events.cljs Outdated Show resolved Hide resolved
src/status_im/subs/wallet/wallet_test.cljs Show resolved Hide resolved
@smohamedjavid smohamedjavid force-pushed the feature/process-wallet-data-from-backup branch 2 times, most recently from 5893e85 to cf13d0a Compare May 29, 2024 21:08
Copy link
Member

@seanstrom seanstrom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good 🙌
Left a small comment about renaming some test stuff, but it's not a blocker 🏄

src/status_im/contexts/wallet/events_test.cljs Outdated Show resolved Hide resolved
@smohamedjavid smohamedjavid force-pushed the feature/process-wallet-data-from-backup branch 2 times, most recently from f7ad755 to ac45fd2 Compare June 3, 2024 11:59
@VolodLytvynenko VolodLytvynenko self-assigned this Jun 6, 2024
@VolodLytvynenko
Copy link
Contributor

can't check this PR due blocker #20370

@VolodLytvynenko VolodLytvynenko force-pushed the feature/process-wallet-data-from-backup branch from d4a14f9 to 784cb63 Compare June 7, 2024 08:06
@VolodLytvynenko
Copy link
Contributor

hi @smohamedjavid thank you for PR. Take a look found issues

PR_ISSUE 1: Endless spinner after attempting to update wallet on iOS

Steps:

  1. Go to wallet overview page
  2. Perform update (swipe down)
  3. Check the spinner

Actual result:

The spinner does not disappear

spinner.mp4

Expected result:

The spinner should disappear once the update process is completed, indicating that the update was successful.

OS:

IOS

Devices:

  • iPhone 11 Pro Max, IOS 17

Logs

logs.zip

@VolodLytvynenko
Copy link
Contributor

@smohamedjavid You mentioned that this PR is necessary for further work related to the wallet to be unblocked. If you think this issue is better to fix separately, then we can merge the current PR, but please, take this issue as the next for fixing. Otherwise, let me know if this issue is fixed in the current PR.

@smohamedjavid
Copy link
Member Author

@VolodLytvynenko - Thank you for testing this PR 🙏

I have fixed the issue. Please re-test.

@status-im-auto
Copy link
Member

86% of end-end tests have passed

Total executed tests: 51
Failed tests: 4
Expected to fail tests: 3
Passed tests: 44
Not executed tests: 1
IDs of not executed tests: 702936 
IDs of failed tests: 727230,702948,703629,727229 
IDs of expected to fail tests: 727232,703503,703495 

Not executed tests (1)

Click to expand
  • Rerun not executed tests
  • Failed tests (4)

    Click to expand
  • Rerun failed tests

  • Class TestWalletMultipleDevice:

    1. test_wallet_send_asset_from_drawer, id: 727230

    # STEP: Getting ETH amount in the wallet of the sender before transaction
    Device 1: Find `WalletTab` by `accessibility id`: `wallet-stack-tab`

    critical/test_wallet.py:120: in test_wallet_send_asset_from_drawer
        sender_balance, receiver_balance, eth_amount_sender, eth_amount_receiver = self._get_balances_before_tx()
    critical/test_wallet.py:41: in _get_balances_before_tx
        self.wallet_1.wallet_tab.click()
    ../views/base_element.py:90: in click
        element = self.find_element()
    ../views/base_element.py:79: in find_element
        raise NoSuchElementException(
     Device 1: WalletTab by accessibility id: `wallet-stack-tab` is not found on the screen; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
    



    2. test_wallet_send_eth, id: 727229

    Device 1: Tap on found: LogInButton
    Device 1: Find Button by accessibility id: done

    critical/test_wallet.py:111: in test_wallet_send_eth
        self.wallet_1.send_asset(address=self.receiver['address'], asset_name='Ether', amount=amount_to_send)
    ../views/wallet_view.py:100: in send_asset
        self.confirm_transaction()
    ../views/wallet_view.py:88: in confirm_transaction
        self.done_button.click()
    ../views/base_element.py:90: in click
        element = self.find_element()
    ../views/base_element.py:79: in find_element
        raise NoSuchElementException(
     Device 1: Button by accessibility id: `done` is not found on the screen; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
    



    Class TestCommunityMultipleDeviceMergedTwo:

    1. test_community_hashtag_links_to_community_channels, id: 702948

    Device 2: Find Text by xpath: //android.view.ViewGroup[@content-desc='chat-item']//android.widget.TextView[contains(@text,'#cats')]
    Device 2: Looking for a message by text: it is just a message text

    critical/chats/test_public_chat_browsing.py:1098: in test_community_hashtag_links_to_community_channels
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Message in community channel is not visible for user before join
    



    Device sessions

    2. test_community_join_when_node_owner_offline, id: 703629

    Device 2: Looking for community: 'open community'
    Device 2: Click until Text by accessibility id: community-description-text will be presented

    critical/chats/test_public_chat_browsing.py:1184: in test_community_join_when_node_owner_offline
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     not
    



    Device sessions

    Expected to fail tests (3)

    Click to expand

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_mute_chat, id: 703495

    # STEP: Change device time so chat will be unmuted by timer
    Device 2: Long press on ChatElement

    critical/chats/test_group_chat.py:466: in test_group_chat_mute_chat
        self.errors.verify_no_errors()
    base_test_case.py:190: in verify_no_errors
        pytest.fail('\n '.join([self.errors.pop(0) for _ in range(len(self.errors))]))
     Chat is still muted after timeout 
    

    [[Chat is not unmuted after expected time: https://github.com//issues/19627]]

    Device sessions

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_watch_only_account, id: 727232

    Device 1: Text is 0x8d2413447ff297d30bdc475f6d5cb00254685aae
    Device 1: Click system back button

    critical/test_wallet.py:214: in test_wallet_add_remove_watch_only_account
        self.home_view.driver.fail(
    base_test_case.py:178: in fail
        pytest.fail('Device %s: %s' % (self.number, text))
     Device 1: Incorrect address '0x8d2413447ff297d30bdc475f6d5cb00254685aae' is shown when swiping between accounts, expected one is '0x8d2413447ff297d30bdc475f6d5cb00254685aae' 
    

    [[Missing networks in account address, https://github.com//issues/20166]]

    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_community_discovery, id: 703503

    Test is not run, e2e blocker  
    

    [[reason: [NOTRUN] Curated communities not loading, https://github.com//issues/17852]]

    Passed tests (44)

    Click to expand

    Class TestOneToOneChatMultipleSharedDevicesNewUiTwo:

    1. test_1_1_chat_mute_chat, id: 703496
    Device sessions

    2. test_1_1_chat_is_shown_message_sent_delivered_from_offline, id: 702783
    Device sessions

    3. test_1_1_chat_delete_via_long_press_relogin, id: 702784
    Device sessions

    Class TestDeepLinksOneDevice:

    1. test_links_deep_links, id: 702775
    Device sessions

    2. test_links_open_universal_links_from_chat, id: 704613
    Device sessions

    Class TestActivityMultipleDevicePR:

    1. test_activity_center_reply_read_unread_delete_filter_swipe, id: 702947
    Device sessions

    Class TestOneToOneChatMultipleSharedDevicesNewUi:

    1. test_1_1_chat_edit_message, id: 702855
    Device sessions

    2. test_1_1_chat_message_reaction, id: 702730
    Device sessions

    3. test_1_1_chat_non_latin_messages_stack_update_profile_photo, id: 702745
    Device sessions

    4. test_1_1_chat_pin_messages, id: 702731
    Device sessions

    5. test_1_1_chat_text_message_delete_push_disappear, id: 702733
    Device sessions

    6. test_1_1_chat_push_emoji, id: 702813
    Device sessions

    7. test_1_1_chat_emoji_send_reply_and_open_link, id: 702782
    Device sessions

    8. test_1_1_chat_send_image_save_and_share, id: 703391
    Device sessions

    Class TestWalletOneDevice:

    1. test_wallet_add_remove_regular_account, id: 727231
    Device sessions

    Class TestGroupChatMultipleDeviceMergedNewUI:

    1. test_group_chat_reactions, id: 703202
    Device sessions

    2. test_group_chat_join_send_text_messages_push, id: 702807
    Device sessions

    3. test_group_chat_offline_pn, id: 702808
    Device sessions

    4. test_group_chat_pin_messages, id: 702732
    Device sessions

    5. test_group_chat_send_image_save_and_share, id: 703297
    Device sessions

    Class TestCommunityMultipleDeviceMerged:

    1. test_community_emoji_send_copy_paste_reply, id: 702840
    Device sessions

    2. test_community_contact_block_unblock_offline, id: 702894
    Device sessions

    3. test_community_mark_all_messages_as_read, id: 703086
    Device sessions

    4. test_community_links_with_previews_github_youtube_twitter_gif_send_enable, id: 702844
    Device sessions

    5. test_community_unread_messages_badge, id: 702841
    Device sessions

    6. test_community_message_delete, id: 702839
    Device sessions

    7. test_community_message_send_check_timestamps_sender_username, id: 702838
    Device sessions

    8. test_community_edit_delete_message_when_offline, id: 704615
    Device sessions

    9. test_community_one_image_send_reply, id: 702859
    Device sessions

    10. test_community_message_edit, id: 702843
    Device sessions

    11. test_community_several_images_send_reply, id: 703194
    Device sessions

    Class TestActivityMultipleDevicePRTwo:

    1. test_activity_center_admin_notification_accept_swipe, id: 702958
    Device sessions

    2. test_activity_center_mentions, id: 702957
    Device sessions

    Class TestCommunityOneDeviceMerged:

    1. test_community_copy_and_paste_message_in_chat_input, id: 702742
    Device sessions

    2. test_community_navigate_to_channel_when_relaunch, id: 702846
    Device sessions

    3. test_restore_multiaccount_with_waku_backup_remove_switch, id: 703133
    Device sessions

    4. test_community_undo_delete_message, id: 702869
    Device sessions

    5. test_community_mute_community_and_channel, id: 703382
    Device sessions

    Class TestCommunityMultipleDeviceMergedTwo:

    1. test_community_leave, id: 702845
    Device sessions

    2. test_community_mentions_push_notification, id: 702786
    Device sessions

    3. test_community_markdown_support, id: 702809
    Device sessions

    Class TestActivityCenterContactRequestMultipleDevicePR:

    1. test_activity_center_contact_request_accept_swipe_mark_all_as_read, id: 702851
    Device sessions

    2. test_activity_center_contact_request_decline, id: 702850
    Device sessions

    3. test_add_contact_field_validation, id: 702777
    Device sessions

    @VolodLytvynenko
    Copy link
    Contributor

    Thank you for PR. No issues from my side. PR is ready to be merged

    @smohamedjavid smohamedjavid force-pushed the feature/process-wallet-data-from-backup branch from 9cdffc6 to b37fe75 Compare June 7, 2024 14:41
    @smohamedjavid smohamedjavid merged commit 9c7cb0f into develop Jun 7, 2024
    6 checks passed
    @smohamedjavid smohamedjavid deleted the feature/process-wallet-data-from-backup branch June 7, 2024 14:58
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    Archived in project
    Archived in project
    Development

    Successfully merging this pull request may close these issues.

    Not all eth accounts are recovered until relogin.
    7 participants