From 8ac9cc08e12e60eb5c566ca19f2386c62e25b562 Mon Sep 17 00:00:00 2001 From: Lungu Cristian Date: Tue, 28 Jan 2025 17:33:34 +0200 Subject: [PATCH] Keycard signing for dapp interactions (#21785) * feat: wip dapps signing with keycard Signed-off-by: Cristian Lungu * fix: hide the pin sheet before showing the connection sheet Signed-off-by: Cristian Lungu * fix: signing dapp request with password Signed-off-by: Cristian Lungu * fix: logic for getting the current dapp Signed-off-by: Cristian Lungu * fix: issues after endpoints update Signed-off-by: Cristian Lungu * feat: removed support for eth_sign and signTransaction Signed-off-by: Cristian Lungu * fix: removed unused event Signed-off-by: Cristian Lungu * feat: re-enable dapps interactions with keycard Signed-off-by: Cristian Lungu * fix: adapted to latest standard-auth changes Signed-off-by: Cristian Lungu * feat: enable connected dapps for keycard Signed-off-by: Cristian Lungu * ref: removed threading (->) Signed-off-by: Cristian Lungu * fix: get keycard keypair addresses manually Signed-off-by: Cristian Lungu * fix: wrong condition on utils/keycard-address? --------- Signed-off-by: Cristian Lungu --- src/native_module/core.cljs | 16 ++- src/status_im/constants.cljs | 7 +- src/status_im/contexts/keycard/utils.cljs | 13 +++ .../wallet/common/account_switcher/view.cljs | 9 +- src/status_im/contexts/wallet/effects.cljs | 7 ++ src/status_im/contexts/wallet/rpc.cljs | 2 +- .../wallet/wallet_connect/events/effects.cljs | 65 ++++------- .../events/session_proposals.cljs | 10 +- .../events/session_requests.cljs | 69 +++++------ .../events/session_responses.cljs | 110 +++++++----------- .../modals/common/footer/view.cljs | 7 +- .../wallet_connect/utils/data_store.cljs | 10 +- .../wallet_connect/utils/data_store_test.cljs | 12 +- .../wallet/wallet_connect/utils/signing.cljs | 24 ---- .../wallet_connect/utils/transactions.cljs | 19 +-- src/status_im/subs/wallet/dapps/requests.cljs | 8 ++ 16 files changed, 152 insertions(+), 236 deletions(-) delete mode 100644 src/status_im/contexts/wallet/wallet_connect/utils/signing.cljs diff --git a/src/native_module/core.cljs b/src/native_module/core.cljs index fdc1ba560c..33eca851bc 100644 --- a/src/native_module/core.cljs +++ b/src/native_module/core.cljs @@ -253,15 +253,19 @@ (defn hash-typed-data "used for keycard" - [data callback] - (log/debug "[native-module] hash-typed-data") - (.hashTypedData ^js (encryption) data callback)) + ([data] + (native-utils/promisify-native-module-call hash-typed-data data)) + ([data callback] + (log/debug "[native-module] hash-typed-data") + (.hashTypedData ^js (encryption) data callback))) (defn hash-typed-data-v4 "used for keycard" - [data callback] - (log/debug "[native-module] hash-typed-data-v4") - (.hashTypedDataV4 ^js (encryption) data callback)) + ([data] + (native-utils/promisify-native-module-call hash-typed-data-v4 data)) + ([data callback] + (log/debug "[native-module] hash-typed-data-v4") + (.hashTypedDataV4 ^js (encryption) data callback))) (defn send-transaction-with-signature "used for keycard" diff --git a/src/status_im/constants.cljs b/src/status_im/constants.cljs index 67f7a5fb1d..4446d0a39f 100644 --- a/src/status_im/constants.cljs +++ b/src/status_im/constants.cljs @@ -221,10 +221,7 @@ (def ^:const wallet-connect-eth-sign-typed-v4-method "eth_signTypedData_v4") (def ^:const wallet-connect-supported-methods #{wallet-connect-personal-sign-method - wallet-connect-eth-sign-method wallet-connect-eth-send-transaction-method - ;; NOTE: disabled, as we have no clear use cases for it and other wallets don't support it - ;; wallet-connect-eth-sign-transaction-method wallet-connect-eth-sign-typed-method wallet-connect-eth-sign-typed-v4-method}) (def ^:const wallet-connect-supported-events #{"accountsChanged" "chainChanged"}) @@ -237,11 +234,9 @@ (def ^:const wallet-connect-message-signing-methods #{wallet-connect-personal-sign-method wallet-connect-eth-sign-typed-method - wallet-connect-eth-sign-method wallet-connect-eth-sign-typed-v4-method}) (def ^:const wallet-connect-transaction-methods - #{wallet-connect-eth-send-transaction-method - wallet-connect-eth-sign-transaction-method}) + #{wallet-connect-eth-send-transaction-method}) (def ^:const transaction-pending-type-wallet-connect-transfer "WalletConnectTransfer") diff --git a/src/status_im/contexts/keycard/utils.cljs b/src/status_im/contexts/keycard/utils.cljs index a2297d2d14..a0753344ce 100644 --- a/src/status_im/contexts/keycard/utils.cljs +++ b/src/status_im/contexts/keycard/utils.cljs @@ -76,3 +76,16 @@ args :on-success (get-on-success args) :on-failure (get-on-failure args))) + +(defn keycard-address? + [keypairs address] + (let [find-keycard-keypair (fn [kps] (some #(when-not (empty? (:keycards %)) %) kps)) + keypair-addresses (fn [kp] + (->> (:accounts kp) + (map :address) + set))] + (-> keypairs + vals + find-keycard-keypair + keypair-addresses + (contains? (string/lower-case address))))) diff --git a/src/status_im/contexts/wallet/common/account_switcher/view.cljs b/src/status_im/contexts/wallet/common/account_switcher/view.cljs index a063ae7543..df8c7874d5 100644 --- a/src/status_im/contexts/wallet/common/account_switcher/view.cljs +++ b/src/status_im/contexts/wallet/common/account_switcher/view.cljs @@ -30,8 +30,7 @@ type :no-title}}] (let [{:keys [color emoji watch-only?]} (rf/sub [:wallet/current-viewing-account]) networks (rf/sub [:wallet/selected-network-details]) - sending-collectible? (rf/sub [:wallet/sending-collectible?]) - keycard? (rf/sub [:wallet/selected-keypair-keycard?])] + sending-collectible? (rf/sub [:wallet/sending-collectible?])] [quo/page-nav {:type type :icon-name icon-name @@ -46,11 +45,7 @@ (not watch-only?) show-dapps-button?) {:icon-name :i/dapps - :on-press #(rf/dispatch - (if keycard? - [:keycard/feature-unavailable-show - {:feature-name :wallet.show-connected-dapps}] - [:navigate-to :screen/wallet.connected-dapps]))}) + :on-press #(rf/dispatch [:navigate-to :screen/wallet.connected-dapps])}) (when-not sending-collectible? {:content-type :account-switcher :customization-color color diff --git a/src/status_im/contexts/wallet/effects.cljs b/src/status_im/contexts/wallet/effects.cljs index 99e1761744..c5d6f38a78 100644 --- a/src/status_im/contexts/wallet/effects.cljs +++ b/src/status_im/contexts/wallet/effects.cljs @@ -123,3 +123,10 @@ (-> (sign-transaction-hashes hashes address password) (promesa/then on-success) (promesa/catch on-error)))) + +(rf/reg-fx + :effects.wallet/sign-message + (fn [{:keys [message address password on-success on-error]}] + (-> (wallet-rpc/sign-message message address (security/safe-unmask-data password)) + (promesa/then on-success) + (promesa/catch on-error)))) diff --git a/src/status_im/contexts/wallet/rpc.cljs b/src/status_im/contexts/wallet/rpc.cljs index 731ee62ddb..2cd3084609 100644 --- a/src/status_im/contexts/wallet/rpc.cljs +++ b/src/status_im/contexts/wallet/rpc.cljs @@ -47,7 +47,7 @@ chain-id constants/transaction-pending-type-wallet-connect-transfer (transforms/js-stringify tx-args 0) - signature)) + (utils.hex/normalize-hex signature))) (defn sign-message [message address password] diff --git a/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs b/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs index 7b18145e58..5570190f7f 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/effects.cljs @@ -1,16 +1,16 @@ (ns status-im.contexts.wallet.wallet-connect.events.effects (:require + [native-module.core :as native-module] [promesa.core :as promesa] [react-native.wallet-connect :as wallet-connect] [status-im.config :as config] [status-im.constants :as constants] + [status-im.contexts.wallet.rpc :as wallet-rpc] [status-im.contexts.wallet.wallet-connect.utils.sessions :as sessions] - [status-im.contexts.wallet.wallet-connect.utils.signing :as signing] [status-im.contexts.wallet.wallet-connect.utils.transactions :as transactions] - [status-im.contexts.wallet.wallet-connect.utils.typed-data :as typed-data] [utils.i18n :as i18n] [utils.re-frame :as rf] - [utils.security.core :as security])) + [utils.transforms :as transforms])) (rf/reg-fx :effects.wallet-connect/init @@ -69,20 +69,21 @@ (promesa/catch (partial rf/call-continuation on-fail))))) (rf/reg-fx - :effects.wallet-connect/sign-message - (fn [{:keys [password address data rpc-method on-success on-error]}] - (let [password (security/safe-unmask-data password)] - (-> (condp = - rpc-method - :personal-sign - (signing/personal-sign password address data) + :effects.wallet-connect/hash-message + (fn [{:keys [message on-success on-fail]}] + (-> (wallet-rpc/hash-message-eip-191 message) + (promesa/then (partial rf/call-continuation on-success)) + (promesa/catch (partial rf/call-continuation on-fail))))) - :eth-sign - (signing/eth-sign password address data) - - (signing/personal-sign password address data)) - (promesa/then (partial rf/call-continuation on-success)) - (promesa/catch (partial rf/call-continuation on-error)))))) +(rf/reg-fx + :effects.wallet-connect/hash-typed-data + (fn [{:keys [message legacy? on-success on-fail]}] + (-> (if legacy? + (native-module/hash-typed-data message) + (native-module/hash-typed-data-v4 message)) + (promesa/then (fn [response] (-> response transforms/json->clj :result))) + (promesa/then (partial rf/call-continuation on-success)) + (promesa/catch (partial rf/call-continuation on-fail))))) (rf/reg-fx :effects.wallet-connect/prepare-transaction @@ -93,36 +94,12 @@ (promesa/then on-success) (promesa/catch on-error)))) -(rf/reg-fx - :effects.wallet-connect/sign-transaction - (fn [{:keys [password address chain-id tx-hash tx-args on-success on-error]}] - (-> (transactions/sign-transaction (security/safe-unmask-data password) - address - tx-hash - tx-args - chain-id) - (promesa/then (partial rf/call-continuation on-success)) - (promesa/catch (partial rf/call-continuation on-error))))) - (rf/reg-fx :effects.wallet-connect/send-transaction - (fn [{:keys [password address chain-id tx-hash tx-args on-success on-error]}] - (-> (transactions/send-transaction (security/safe-unmask-data password) - address - tx-hash - tx-args - chain-id) - (promesa/then (partial rf/call-continuation on-success)) - (promesa/catch (partial rf/call-continuation on-error))))) - -(rf/reg-fx - :effects.wallet-connect/sign-typed-data - (fn [{:keys [password address data version chain-id on-success on-error]}] - (-> (typed-data/sign (security/safe-unmask-data password) - address - data - chain-id - version) + (fn [{:keys [chain-id signature tx-args on-success on-error]}] + (-> (wallet-rpc/send-transaction-with-signature chain-id + tx-args + signature) (promesa/then (partial rf/call-continuation on-success)) (promesa/catch (partial rf/call-continuation on-error))))) diff --git a/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs b/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs index ae868a2860..c5f0c5f414 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/session_proposals.cljs @@ -2,7 +2,6 @@ (:require [clojure.string :as string] [re-frame.core :as rf] [react-native.wallet-connect :as wallet-connect] - [status-im.contexts.wallet.data-store :as wallet-data-store] [status-im.contexts.wallet.wallet-connect.utils.data-store :as data-store] [status-im.contexts.wallet.wallet-connect.utils.networks :as networks] @@ -46,15 +45,8 @@ expired? (-> parsed-uri :expiryTimestamp uri/timestamp-expired?) - version-supported? (uri/version-supported? version) - keycard? (wallet-data-store/selected-keypair-keycard? db)] + version-supported? (uri/version-supported? version)] (cond - - keycard? - {:fx [[:dispatch - [:keycard/feature-unavailable-show - {:feature-name :wallet.scan-dapp-connection}]]]} - (or (not valid-wc-uri?) (not version-supported?) (= network-status :offline) diff --git a/src/status_im/contexts/wallet/wallet_connect/events/session_requests.cljs b/src/status_im/contexts/wallet/wallet_connect/events/session_requests.cljs index c04c8c8fa7..d2d07fe8d3 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/session_requests.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/session_requests.cljs @@ -41,12 +41,6 @@ [:wallet-connect/process-eth-send-transaction {:on-success (fn [] (rf/dispatch [:wallet-connect/show-request-modal]))}]] - constants/wallet-connect-eth-sign-method - [:dispatch [:wallet-connect/process-eth-sign]] - - constants/wallet-connect-eth-sign-transaction-method - [:dispatch [:wallet-connect/process-eth-sign-transaction]] - constants/wallet-connect-eth-sign-typed-method [:dispatch [:wallet-connect/process-sign-typed]] @@ -56,6 +50,13 @@ constants/wallet-connect-personal-sign-method [:dispatch [:wallet-connect/process-personal-sign]])]})))) +(rf/reg-event-fx + :wallet-connect/store-prepared-hash + (fn [{:keys [db]} [prepared-hash]] + {:db (assoc-in db + [:wallet-connect/current-request :prepared-hash] + prepared-hash)})) + (rf/reg-event-fx :wallet-connect/process-personal-sign (fn [{:keys [db]}] @@ -65,30 +66,20 @@ [:wallet-connect/current-request] assoc :address (string/lower-case address) - :raw-data raw-data :display-data (or parsed-data raw-data)) - :fx [[:dispatch [:wallet-connect/show-request-modal]]]}))) - -(rf/reg-event-fx - :wallet-connect/process-eth-sign - (fn [{:keys [db]}] - (let [[address raw-data] (data-store/get-db-current-request-params db) - parsed-data (native-module/hex-to-utf8 raw-data)] - {:db (update-in db - [:wallet-connect/current-request] - assoc - :address (string/lower-case address) - :raw-data raw-data - :display-data (or parsed-data raw-data)) - :fx [[:dispatch [:wallet-connect/show-request-modal]]]}))) + :fx [[:effects.wallet-connect/hash-message + {:message raw-data + :on-success #(rf/dispatch [:wallet-connect/store-prepared-hash %]) + :on-fail #(rf/dispatch [:wallet-connect/on-processing-error %])}] + [:dispatch [:wallet-connect/show-request-modal]]]}))) (rf/reg-event-fx :wallet-connect/prepare-transaction-success (fn [{:keys [db]} [prepared-tx chain-id]] - (let [{:keys [tx-args]} prepared-tx - tx (bean/->clj tx-args) - address (-> tx :from string/lower-case) - display-data (transactions/beautify-transaction tx)] + (let [{:keys [tx-args tx-hash]} prepared-tx + tx (bean/->clj tx-args) + address (-> tx :from string/lower-case) + display-data (transactions/beautify-transaction tx)] {:db (update-in db [:wallet-connect/current-request] assoc @@ -96,7 +87,8 @@ :raw-data prepared-tx :transaction tx :chain-id chain-id - :display-data display-data)}))) + :display-data display-data) + :fx [[:dispatch [:wallet-connect/store-prepared-hash tx-hash]]]}))) (rf/reg-event-fx :wallet-connect/process-eth-send-transaction @@ -116,25 +108,14 @@ (rf/call-continuation on-success))) :on-error #(rf/dispatch [:wallet-connect/on-processing-error %])}]]})))) -(rf/reg-event-fx - :wallet-connect/process-eth-sign-transaction - (fn [{:keys [db]}] - (let [event (data-store/get-db-current-request-event db) - tx (-> event data-store/get-request-params first) - chain-id (-> event - (get-in [:params :chainId]) - networks/eip155->chain-id)] - {:fx [[:effects.wallet-connect/prepare-transaction - {:tx tx - :chain-id chain-id - :on-success #(rf/dispatch [:wallet-connect/prepare-transaction-success % chain-id]) - :on-error #(rf/dispatch [:wallet-connect/on-processing-error %])}]]}))) - (rf/reg-event-fx :wallet-connect/process-sign-typed (fn [{:keys [db]}] (try (let [[address raw-data] (data-store/get-db-current-request-params db) + method (-> db + data-store/get-db-current-request-event + data-store/get-request-method) session-chain-id (-> (data-store/get-db-current-request-event db) (get-in [:params :chainId]) networks/eip155->chain-id) @@ -154,7 +135,13 @@ :address (string/lower-case address) :display-data (typed-data/flatten-typed-data typed-data) :raw-data raw-data) - :fx [[:dispatch [:wallet-connect/show-request-modal]]]})) + :fx [[:effects.wallet-connect/hash-typed-data + {:message raw-data + :legacy? (not= constants/wallet-connect-eth-sign-typed-v4-method + method) + :on-success #(rf/dispatch [:wallet-connect/store-prepared-hash %]) + :on-fail #(rf/dispatch [:wallet-connect/on-processing-error %])}] + [:dispatch [:wallet-connect/show-request-modal]]]})) (catch js/Error err {:fx [[:dispatch [:wallet-connect/on-processing-error diff --git a/src/status_im/contexts/wallet/wallet_connect/events/session_responses.cljs b/src/status_im/contexts/wallet/wallet_connect/events/session_responses.cljs index 258911be72..29b766219b 100644 --- a/src/status_im/contexts/wallet/wallet_connect/events/session_responses.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/events/session_responses.cljs @@ -2,16 +2,47 @@ (:require [re-frame.core :as rf] [react-native.wallet-connect :as wallet-connect] [status-im.constants :as constants] + [status-im.contexts.keycard.utils :as keycard] [status-im.contexts.wallet.wallet-connect.utils.data-store :as data-store] [status-im.contexts.wallet.wallet-connect.utils.uri :as uri] [taoensso.timbre :as log] + [utils.hex :as hex] [utils.i18n :as i18n] [utils.transforms :as transforms])) (rf/reg-event-fx - :wallet-connect/respond-current-session + :wallet-connect/authorized-signing (fn [{:keys [db]} [password]] + (let [prepared-hash (get-in db [:wallet-connect/current-request :prepared-hash]) + address (get-in db [:wallet-connect/current-request :address]) + keycard-sign? (-> (get-in db [:wallet :keypairs]) + (keycard/keycard-address? address)) + on-success #(rf/dispatch [:wallet-connect/respond (hex/prefix-hex %)]) + on-fail #(rf/dispatch [:wallet-connect/on-sign-error %])] + (if keycard-sign? + {:fx [[:dispatch + [:standard-auth/authorize-with-keycard + {:on-complete (fn [pin] + (rf/dispatch [:keycard/connect-and-sign-hashes + {:keycard-pin pin + :address address + :hashes [prepared-hash] + :on-success (fn [signatures] + (rf/dispatch [:hide-bottom-sheet]) + (on-success (:signature (first + signatures)))) + :on-failure on-fail}]))}]]]} + {:fx [[:effects.wallet/sign-message + {:message prepared-hash + :address address + :password password + :on-success on-success + :on-error on-fail}]]})))) + +(rf/reg-event-fx + :wallet-connect/respond + (fn [{:keys [db]} [signature]] (let [event (get-in db [:wallet-connect/current-request :event]) method (data-store/get-request-method event) screen (data-store/method-to-screen method) @@ -19,83 +50,30 @@ (if (uri/timestamp-expired? expiry) {:fx [[:dispatch [:toasts/upsert - {:id :new-wallet-account-created - :type :negative + {:type :negative :text (i18n/label :t/wallet-connect-request-expired)}]] [:dispatch [:dismiss-modal screen]]]} - {:fx [(condp = method - constants/wallet-connect-personal-sign-method - [:dispatch [:wallet-connect/respond-sign-message password :personal-sign]] + {:fx [(condp contains? method + #{constants/wallet-connect-personal-sign-method + constants/wallet-connect-eth-sign-typed-method + constants/wallet-connect-eth-sign-typed-v4-method} + [:dispatch [:wallet-connect/finish-session-request signature]] - constants/wallet-connect-eth-sign-method - [:dispatch [:wallet-connect/respond-sign-message password :eth-sign]] - - constants/wallet-connect-eth-send-transaction-method - [:dispatch [:wallet-connect/respond-send-transaction-data password]] - - constants/wallet-connect-eth-sign-transaction-method - [:dispatch [:wallet-connect/respond-sign-transaction-data password]] - - constants/wallet-connect-eth-sign-typed-method - [:dispatch [:wallet-connect/respond-sign-typed-data password :v1]] - - constants/wallet-connect-eth-sign-typed-v4-method - [:dispatch [:wallet-connect/respond-sign-typed-data password :v4]])]})))) - -(rf/reg-event-fx - :wallet-connect/respond-sign-message - (fn [{:keys [db]} [password rpc-method]] - (let [{:keys [address raw-data]} (get db :wallet-connect/current-request)] - {:fx [[:effects.wallet-connect/sign-message - {:password password - :address address - :data raw-data - :rpc-method rpc-method - :on-error [:wallet-connect/on-sign-error] - :on-success [:wallet-connect/finish-session-request]}]]}))) - -(rf/reg-event-fx - :wallet-connect/respond-sign-typed-data - (fn [{:keys [db]} [password typed-data-version]] - (let [{:keys [address raw-data event]} (get db :wallet-connect/current-request) - chain-id (get-in event [:params :chainId])] - {:fx [[:effects.wallet-connect/sign-typed-data - {:password password - :address address - :data raw-data - :chain-id chain-id - :version typed-data-version - :on-error [:wallet-connect/on-sign-error] - :on-success [:wallet-connect/finish-session-request]}]]}))) + #{constants/wallet-connect-eth-send-transaction-method} + [:dispatch [:wallet-connect/respond-send-transaction-data signature]])]})))) (rf/reg-event-fx :wallet-connect/respond-send-transaction-data - (fn [{:keys [db]} [password]] - (let [{:keys [chain-id raw-data address]} (get db :wallet-connect/current-request) - {:keys [tx-hash tx-args]} raw-data] + (fn [{:keys [db]} [signature]] + (let [{:keys [chain-id raw-data]} (get db :wallet-connect/current-request) + {:keys [tx-args]} raw-data] {:fx [[:effects.wallet-connect/send-transaction - {:password password - :address address + {:signature signature :chain-id chain-id - :tx-hash tx-hash :tx-args tx-args :on-error [:wallet-connect/on-sign-error] :on-success [:wallet-connect/finish-session-request]}]]}))) -(rf/reg-event-fx - :wallet-connect/respond-sign-transaction-data - (fn [{:keys [db]} [password]] - (let [{:keys [chain-id raw-data address]} (get db :wallet-connect/current-request) - {:keys [tx-hash tx-args]} raw-data] - {:fx [[:effects.wallet-connect/sign-transaction - {:password password - :address address - :chain-id chain-id - :tx-hash tx-hash - :tx-params tx-args - :on-error [:wallet-connect/on-sign-error] - :on-success [:wallet-connect/finish-session-request]}]]}))) - (rf/reg-event-fx :wallet-connect/on-sign-error (fn [{:keys [db]} [error]] diff --git a/src/status_im/contexts/wallet/wallet_connect/modals/common/footer/view.cljs b/src/status_im/contexts/wallet/wallet_connect/modals/common/footer/view.cljs index 4eec1c2ecf..2c108dd002 100644 --- a/src/status_im/contexts/wallet/wallet_connect/modals/common/footer/view.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/modals/common/footer/view.cljs @@ -12,13 +12,14 @@ (defn- on-auth-success [password] (rf/dispatch [:hide-bottom-sheet]) - (rf/dispatch [:wallet-connect/respond-current-session password])) + (rf/dispatch [:wallet-connect/authorized-signing password])) (defn view [{:keys [warning-label slide-button-text error-state]} & children] (let [{:keys [customization-color]} (rf/sub [:wallet-connect/current-request-account-details]) offline? (rf/sub [:network/offline?]) - theme (quo.theme/use-theme)] + theme (quo.theme/use-theme) + sign-on-keycard? (rf/sub [:wallet-connect/sign-on-keycard?])] [:<> (when (or offline? error-state) [quo/alert-banner @@ -48,6 +49,8 @@ :disabled? (or offline? error-state) :customization-color customization-color :on-auth-success on-auth-success + :on-complete (when sign-on-keycard? + #(on-auth-success "")) :auth-button-label (i18n/label :t/confirm)}]] [rn/view {:style style/warning-container} [quo/text diff --git a/src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs b/src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs index 491468cf4c..2621c6b66a 100644 --- a/src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs @@ -30,10 +30,8 @@ (def method-to-screen {constants/wallet-connect-personal-sign-method :screen/wallet-connect.sign-message constants/wallet-connect-eth-sign-typed-method :screen/wallet-connect.sign-message - constants/wallet-connect-eth-sign-method :screen/wallet-connect.sign-message constants/wallet-connect-eth-sign-typed-v4-method :screen/wallet-connect.sign-message - constants/wallet-connect-eth-send-transaction-method :screen/wallet-connect.send-transaction - constants/wallet-connect-eth-sign-transaction-method :screen/wallet-connect.sign-transaction}) + constants/wallet-connect-eth-send-transaction-method :screen/wallet-connect.send-transaction}) (defn extract-native-call-signature [data] @@ -59,11 +57,11 @@ (defn get-current-request-dapp [request sessions] - (let [dapp-url (get-in request [:event :verifyContext :verified :origin])] + (let [request-topic (get-in request [:event :topic])] (->> sessions (filter (fn [session] - (= (utils.string/remove-trailing-slash dapp-url) - (utils.string/remove-trailing-slash (get session :url))))) + (= (:topic session) + request-topic))) first))) (defn get-dapp-redirect-url diff --git a/src/status_im/contexts/wallet/wallet_connect/utils/data_store_test.cljs b/src/status_im/contexts/wallet/wallet_connect/utils/data_store_test.cljs index 54b7d569fc..c5ca79b2b2 100644 --- a/src/status_im/contexts/wallet/wallet_connect/utils/data_store_test.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/utils/data_store_test.cljs @@ -8,15 +8,15 @@ (deftest get-current-request-dapp-test (testing "returns the correct dapp based on the request's origin" - (let [request {:event {:verifyContext {:verified {:origin "https://dapp.com"}}}} - sessions [{:url "https://dapp.com"} - {:url "https://anotherdapp.com"}]] - (is (= {:url "https://dapp.com"} + (let [request {:event {:topic "123"}} + sessions [{:topic "123"} + {:topic "456"}]] + (is (= {:topic "123"} (sut/get-current-request-dapp request sessions))))) (testing "returns nil if no matching dapp is found" - (let [request {:event {:verifyContext {:verified {:origin "https://dapp.com"}}}} - sessions [{:url "https://anotherdapp.com"}]] + (let [request {:event {:topic "123"}} + sessions [{:topic "456"}]] (is (nil? (sut/get-current-request-dapp request sessions)))))) (deftest get-dapp-redirect-url-test diff --git a/src/status_im/contexts/wallet/wallet_connect/utils/signing.cljs b/src/status_im/contexts/wallet/wallet_connect/utils/signing.cljs deleted file mode 100644 index 58453a296a..0000000000 --- a/src/status_im/contexts/wallet/wallet_connect/utils/signing.cljs +++ /dev/null @@ -1,24 +0,0 @@ -(ns status-im.contexts.wallet.wallet-connect.utils.signing - (:require - [native-module.core :as native-module] - [promesa.core :as promesa] - [status-im.contexts.wallet.rpc :as wallet-rpc] - [status-im.contexts.wallet.wallet-connect.utils.data-store :as - data-store] - [utils.hex :as hex] - [utils.transforms :as transforms])) - -(defn eth-sign - [password address data] - (-> {:data data - :account address - :password password} - transforms/clj->json - native-module/sign-message - (promesa/then data-store/extract-native-call-signature))) - -(defn personal-sign - [password address data] - (-> (wallet-rpc/hash-message-eip-191 data) - (promesa/then #(wallet-rpc/sign-message % address password)) - (promesa/then hex/prefix-hex))) diff --git a/src/status_im/contexts/wallet/wallet_connect/utils/transactions.cljs b/src/status_im/contexts/wallet/wallet_connect/utils/transactions.cljs index 1bd55b57e2..e906ed22ae 100644 --- a/src/status_im/contexts/wallet/wallet_connect/utils/transactions.cljs +++ b/src/status_im/contexts/wallet/wallet_connect/utils/transactions.cljs @@ -14,8 +14,7 @@ (defn transaction-request? [event] (->> (data-store/get-request-method event) - (contains? #{constants/wallet-connect-eth-send-transaction-method - constants/wallet-connect-eth-sign-transaction-method}))) + (contains? constants/wallet-connect-transaction-methods))) ;; NOTE: Currently we don't allow the user to configure the tx priority as we don't ;; show the estimated time, but when we implement it, we should allow to change it @@ -136,22 +135,6 @@ :suggested-fees suggested-fees :estimated-time estimated-time})) -(defn sign-transaction - [password address tx-hash tx-args chain-id] - (promesa/let - [signature (wallet-rpc/sign-message tx-hash address password) - raw-tx (wallet-rpc/build-raw-transaction chain-id tx-args signature)] - raw-tx)) - -(defn send-transaction - [password address tx-hash tx-args chain-id] - (promesa/let - [signature (wallet-rpc/sign-message tx-hash address password) - tx (wallet-rpc/send-transaction-with-signature chain-id - tx-args - signature)] - tx)) - (defn transactions->display-array [data] (remove (fn [[k v]] diff --git a/src/status_im/subs/wallet/dapps/requests.cljs b/src/status_im/subs/wallet/dapps/requests.cljs index 12f8272cc3..5aad8215c6 100644 --- a/src/status_im/subs/wallet/dapps/requests.cljs +++ b/src/status_im/subs/wallet/dapps/requests.cljs @@ -1,5 +1,6 @@ (ns status-im.subs.wallet.dapps.requests (:require [re-frame.core :as rf] + [status-im.contexts.keycard.utils :as keycard] [status-im.contexts.wallet.common.utils :as wallet-utils] [status-im.contexts.wallet.wallet-connect.utils.data-store :as data-store] @@ -59,3 +60,10 @@ :wallet-connect/typed-data-request? :<- [:wallet-connect/current-request-method] typed-data/typed-data-request?) + +(rf/reg-sub + :wallet-connect/sign-on-keycard? + :<- [:wallet/keypairs] + :<- [:wallet-connect/current-request-address] + (fn [[keypairs address]] + (keycard/keycard-address? keypairs address)))