From 12a707be54dc9b4e2262ad32784769e4dbe53577 Mon Sep 17 00:00:00 2001 From: Sean Hagstrom Date: Mon, 24 Jun 2024 16:48:26 +0100 Subject: [PATCH] fix: handle removing old accounts not associated with the updated key-pair --- src/status_im/contexts/wallet/events.cljs | 16 ++++++--- .../contexts/wallet/events_test.cljs | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/status_im/contexts/wallet/events.cljs b/src/status_im/contexts/wallet/events.cljs index 19615d148189..b8a870e1e559 100644 --- a/src/status_im/contexts/wallet/events.cljs +++ b/src/status_im/contexts/wallet/events.cljs @@ -560,9 +560,17 @@ removed-account-addresses updated-keypairs-by-id updated-accounts-by-address]} (data-store/process-keypairs keypairs) - new-account-addresses (clojure.set/difference - (set (keys updated-accounts-by-address)) - (set (keys existing-accounts-by-address)))] + updated-keypair-ids (set (keys updated-keypairs-by-id)) + updated-account-addresses (set (keys updated-accounts-by-address)) + existing-account-addresses (set (keys existing-accounts-by-address)) + new-account-addresses (clojure.set/difference updated-account-addresses + existing-account-addresses) + old-account-addresses (->> (vals existing-accounts-by-address) + (filter (fn [{:keys [address key-uid]}] + (and (contains? updated-keypair-ids key-uid) + (nil? (get updated-accounts-by-address + address))))) + (map :address))] (cond-> {:db (-> db (assoc-in [:wallet :keypairs] (-> (partial dissoc existing-keypairs-by-id) @@ -570,7 +578,7 @@ (merge updated-keypairs-by-id))) (assoc-in [:wallet :accounts] (-> (partial dissoc existing-accounts-by-address) - (apply removed-account-addresses) + (apply (into removed-account-addresses old-account-addresses)) (merge updated-accounts-by-address))))} (seq new-account-addresses) (assoc :fx refresh-accounts-fx-dispatches)))) diff --git a/src/status_im/contexts/wallet/events_test.cljs b/src/status_im/contexts/wallet/events_test.cljs index 5a6ae005460c..f13f74eaa928 100644 --- a/src/status_im/contexts/wallet/events_test.cljs +++ b/src/status_im/contexts/wallet/events_test.cljs @@ -183,6 +183,39 @@ :type "seed" :removed true :accounts [raw-account]}]])))) + (testing "event removes accounts not present with key pair" + (reset! rf-db/app-db {:wallet {:accounts {(:address account) account + "1x001" (assoc account + :address "1x001" + :key-uid "0x001")} + :keypairs {keypair-key-uid + {:key-uid keypair-key-uid + :type :seed + :lowest-operability :fully + :accounts [account]} + "0x001" + {:key-uid "0x001" + :type :seed + :lowest-operability :fully + :accounts [(assoc account + :address "1x001" + :key-uid "0x001")]}}}}) + (is + (match? {:db {:wallet {:accounts {(:address account) account} + :keypairs {keypair-key-uid + {:key-uid keypair-key-uid + :type :seed + :lowest-operability :fully + :accounts [account]} + "0x001" + {:key-uid "0x001" + :type :seed + :lowest-operability :fully + :accounts []}}}}} + (dispatch [event-id + [{:key-uid "0x001" + :type "seed" + :accounts []}]])))) (testing "event updates existing key pairs" (reset! rf-db/app-db {:wallet {:accounts {(:address account) (assoc account :operable :no)}