diff --git a/src/react_native/wallet_connect.cljs b/src/react_native/wallet_connect.cljs index cd2a1c2625..5001f2d7e4 100644 --- a/src/react_native/wallet_connect.cljs +++ b/src/react_native/wallet_connect.cljs @@ -62,16 +62,17 @@ (bean/->js {:id id :namespaces approved-namespaces}))) +(defn disconnect-session + [{:keys [web3-wallet reason topic]}] + (oops/ocall web3-wallet + "disconnectSession" + (bean/->js {:topic topic + :reason reason}))) + (defn get-active-sessions [web3-wallet] (oops/ocall web3-wallet "getActiveSessions")) -(defn core-pairing-disconnnect - [web3-wallet topic] - (oops/ocall web3-wallet - "core.pairing.disconnect" - (bean/->js {:topic topic}))) - (defn core-pairing-pair [web3-wallet url] (oops/ocall web3-wallet diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index 44ee9bc1a4..44d687d7a8 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -290,6 +290,7 @@ (def ^:const wallet-connect-session-request-event "session_request") (def ^:const wallet-connect-session-delete-event "session_delete") (def ^:const wallet-connect-user-rejected-error-key "USER_REJECTED") +(def ^:const wallet-connect-user-disconnected-reason-key "USER_DISCONNECTED") (def ^:const transaction-pending-type-wallet-connect-transfer "WalletConnectTransfer") diff --git a/src/status_im/contexts/wallet/connected_dapps/view.cljs b/src/status_im/contexts/wallet/connected_dapps/view.cljs index 01d7ad5cea..ca72c9cccf 100644 --- a/src/status_im/contexts/wallet/connected_dapps/view.cljs +++ b/src/status_im/contexts/wallet/connected_dapps/view.cljs @@ -13,26 +13,25 @@ [utils.re-frame :as rf])) (defn- on-disconnect - [wallet-account {:keys [name topic pairing-topic]}] + [wallet-account {:keys [name topic]}] (rf/dispatch [:hide-bottom-sheet]) (rf/dispatch [:wallet-connect/disconnect-dapp - {:topic topic - :pairing-topic pairing-topic - :on-success (fn [] - (rf/dispatch [:toasts/upsert - {:id :dapp-disconnect-success - :type :positive - :text (i18n/label :t/disconnect-dapp-success - {:dapp name - :account (:name wallet-account)})}])) - :on-fail (fn [] - (rf/dispatch [:toasts/upsert - {:id :dapp-disconnect-failure - :type :negative - :text (i18n/label :t/disconnect-dapp-fail - {:dapp name - :account (:name wallet-account)})}]))}])) + {:topic topic + :on-success (fn [] + (rf/dispatch [:toasts/upsert + {:id :dapp-disconnect-success + :type :positive + :text (i18n/label :t/disconnect-dapp-success + {:dapp name + :account (:name wallet-account)})}])) + :on-fail (fn [] + (rf/dispatch [:toasts/upsert + {:id :dapp-disconnect-failure + :type :negative + :text (i18n/label :t/disconnect-dapp-fail + {:dapp name + :account (:name wallet-account)})}]))}])) (defn- on-dapp-disconnect-press [wallet-account dapp] diff --git a/src/status_im/contexts/wallet/wallet_connect/effects.cljs b/src/status_im/contexts/wallet/wallet_connect/effects.cljs index 94680770a4..b38b1a7fcc 100644 --- a/src/status_im/contexts/wallet/wallet_connect/effects.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/effects.cljs @@ -41,8 +41,10 @@ (rf/reg-fx :effects.wallet-connect/disconnect - (fn [{:keys [web3-wallet topic on-success on-fail]}] - (-> (wallet-connect/core-pairing-disconnnect web3-wallet topic) + (fn [{:keys [web3-wallet topic reason on-success on-fail]}] + (-> (wallet-connect/disconnect-session {:web3-wallet web3-wallet + :topic topic + :reason reason}) (promesa/then on-success) (promesa/catch on-fail)))) diff --git a/src/status_im/contexts/wallet/wallet_connect/events.cljs b/src/status_im/contexts/wallet/wallet_connect/events.cljs index 3e54f1d156..c5f9632308 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events.cljs @@ -115,14 +115,16 @@ (rf/reg-event-fx :wallet-connect/disconnect-dapp - (fn [{:keys [db]} [{:keys [pairing-topic on-success on-fail]}]] + (fn [{:keys [db]} [{:keys [topic on-success on-fail]}]] (let [web3-wallet (get db :wallet-connect/web3-wallet)] {:fx [[:effects.wallet-connect/disconnect {:web3-wallet web3-wallet - :topic pairing-topic + :topic topic + :reason (wallet-connect/get-sdk-error + constants/wallet-connect-user-disconnected-reason-key) :on-fail on-fail :on-success (fn [] - (rf/dispatch [:wallet-connect/disconnect-session pairing-topic]) + (rf/dispatch [:wallet-connect/disconnect-session topic]) (when on-success (on-success)))}]]}))) @@ -211,12 +213,14 @@ (map wallet-connect-core/sdk-session->db-session) (wallet-connect-core/filter-sessions-for-account-addresses account-addresses)) - expired-sessions (remove - (fn [{:keys [expiry]}] - (> expiry (/ now 1000))) + session-topics (set (map :topic sessions)) + expired-sessions (filter + (fn [{:keys [expiry topic]}] + (or (< expiry (/ now 1000)) + (not (contains? session-topics topic)))) persisted-sessions)] - {:fx (mapv (fn [{:keys [pairingTopic]}] - [:wallet-connect/disconnect-session pairingTopic]) + {:fx (mapv (fn [{:keys [topic]}] + [:dispatch [:wallet-connect/disconnect-session topic]]) expired-sessions) :db (assoc db :wallet-connect/sessions sessions)}))) @@ -274,15 +278,15 @@ (rf/reg-event-fx :wallet-connect/disconnect-session - (fn [{:keys [db]} [pairing-topic]] + (fn [{:keys [db]} [topic]] {:db (update db :wallet-connect/sessions (fn [sessions] (->> sessions - (remove #(= (:pairingTopic %) pairing-topic)) + (remove #(= (:topic %) topic)) (into [])))) :fx [[:json-rpc/call [{:method "wallet_disconnectWalletConnectSession" - :params [pairing-topic] + :params [topic] :on-success #(log/info "Wallet Connect session disconnected") :on-error #(log/info "Wallet Connect session persistence failed" %)}]]]}))