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

[#21335] feat: add dapp analytics - 2 #21379

Draft
wants to merge 1 commit into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/status_im/contexts/centralized_metrics/events.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,7 @@
#(rf/dispatch [:profile.login/login-with-biometric-if-available
(get-in db [:profile/login :key-uid])]))
:shell? true}]]]})))

(rf/reg-event-fx :centralized-metrics/track-event
"Track an event, :centralized-metrics/track-event event-name {:kebab_case_key value}"
(fn [_ _] {}))
15 changes: 9 additions & 6 deletions src/status_im/contexts/centralized_metrics/tracking.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
[react-native.platform :as platform]))

(defn key-value-event
[event-name val-key value]
[event-name event-value]
{:metric
{:eventName event-name
:platform platform/os
:appVersion build/app-short-version
:eventValue {val-key value}}})
:eventValue event-value}})

(defn user-journey-event
[action]
(key-value-event "user-journey" :action action))
(key-value-event "user-journey" {:action action}))

(defn navigation-event
[view-id]
(key-value-event "navigation" :viewId view-id))
(key-value-event "navigation" {:viewId view-id}))

(def ^:const app-started-event "app-started")

Expand Down Expand Up @@ -51,15 +51,18 @@
(navigation-event (name view-id))))

(defn tracked-event
[[event-name second-parameter]]
[[event-name second-parameter extra-data]]
(case event-name
:profile/get-profiles-overview-success
(user-journey-event app-started-event)

:centralized-metrics/toggle-centralized-metrics
(key-value-event "events.metrics-enabled" :enabled second-parameter)
(key-value-event "events.metrics-enabled" {:enabled second-parameter})

:set-view-id
(track-view-id-event second-parameter)

:centralized-metrics/track-event
(key-value-event second-parameter extra-data)

nil))
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
:platform platform-os
:appVersion app-version
:eventValue {val-key value}}}]
(is (= expected (tracking/key-value-event event-name val-key value))))))
(is (= expected (tracking/key-value-event event-name {val-key value}))))))

(deftest user-journey-event-test
(testing "creates correct user journey event"
Expand Down
1 change: 1 addition & 0 deletions src/status_im/contexts/wallet/connected_dapps/view.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
(rf/dispatch
[:wallet-connect/disconnect-dapp
{:topic topic
:name name
:on-success (fn []
(rf/dispatch [:toasts/upsert
{:id :dapp-disconnect-success
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,34 +135,72 @@
:proposal-request current-proposal
:session-networks session-networks
:address current-address
:on-success #(rf/dispatch [:wallet-connect/approve-session-success %])
:on-fail #(rf/dispatch [:wallet-connect/approve-session-error %])}])
:on-success #(rf/dispatch [:wallet-connect/approve-session-success %
current-proposal])
:on-fail #(rf/dispatch [:wallet-connect/approve-session-error %
current-proposal])}])
[:dispatch [:dismiss-modal :screen/wallet.wallet-connect-session-proposal]]]}
{:fx [[:dispatch [:wallet-connect/no-internet-toast]]]}))))

(rf/reg-event-fx :wallet-connect/approve-session-success
(fn [_ [session]]
(log/info "Wallet Connect session approved")
{:fx [[:dispatch [:wallet-connect/on-new-session session]]
[:dispatch [:wallet-connect/reset-current-session-proposal]]
[:dispatch [:wallet-connect/redirect-to-dapp (data-store/get-dapp-redirect-url session)]]]}))
(fn [{:keys [db]} [session proposal]]
(let [[dapp-name networks] (data-store/get-dapp-name-and-networks db proposal)
total-connected-dapps (-> db
:wallet-connect/sessions
count
inc)]
(log/info "Wallet Connect session approved")
{:fx [[:dispatch [:wallet-connect/on-new-session session]]
[:dispatch [:wallet-connect/reset-current-session-proposal]]
[:dispatch [:wallet-connect/redirect-to-dapp (data-store/get-dapp-redirect-url session)]]
[:dispatch
[:centralized-metrics/track-event "dapp-session"
{:dapp_name dapp-name
:networks networks
:action :approved
:result :success}]]
[:dispatch
[:centralized-metrics/track-event "dapp-connected"
{:dapp_name dapp-name
:networks networks
:total_connected_dapps total-connected-dapps}]]]})))

(rf/reg-event-fx :wallet-connect/approve-session-error
(fn [_ [error]]
(log/error "Wallet Connect session approval failed"
{:error error
:event :wallet-connect/approve-session})
{:fx [[:dispatch [:wallet-connect/reset-current-session-proposal]]]}))
(fn [{:keys [db]} [error proposal]]
(let [[dapp-name networks] (data-store/get-dapp-name-and-networks db proposal)]
(log/error "Wallet Connect session approval failed"
{:error error
:event :wallet-connect/approve-session})
{:fx [[:dispatch [:wallet-connect/reset-current-session-proposal]]
[:dispatch
[:centralized-metrics/track-event "dapp-session"
{:dapp_name dapp-name
:networks networks
:action :approved
:result :fail}]]]})))

(rf/reg-event-fx
:wallet-connect/reject-session-proposal
(fn [{:keys [db]} [proposal]]
(let [web3-wallet (get db :wallet-connect/web3-wallet)
{:keys [request response-sent?]} (:wallet-connect/current-proposal db)]
{:keys [request response-sent?]} (:wallet-connect/current-proposal db)
[dapp-name networks] (data-store/get-dapp-name-and-networks db proposal)]
{:fx [(when-not response-sent?
[:effects.wallet-connect/reject-session-proposal
{:web3-wallet web3-wallet
:proposal (or proposal request)
:on-success #(log/info "Wallet Connect session proposal rejected")
:on-error #(log/error "Wallet Connect unable to reject session proposal")}])
:on-success (fn []
(log/info "Wallet Connect session proposal rejected")
(rf/dispatch [:centralized-metrics/track-event "dapp-session"
{:dapp_name dapp-name
:networks networks
:action :rejected
:result :success}]))
:on-error (fn []
(log/error "Wallet Connect unable to reject session proposal")
(rf/dispatch [:centralized-metrics/track-event "dapp-session"
{:dapp_name dapp-name
:networks networks
:action :rejected
:result :fail}]))}])
[:dispatch [:wallet-connect/reset-current-session-proposal]]]})))
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
(ns status-im.contexts.wallet.wallet-connect.events.session-responses
(:require [re-frame.core :as rf]
(:require [clojure.string :as string]
[re-frame.core :as rf]
[react-native.wallet-connect :as wallet-connect]
[status-im.constants :as constants]
[status-im.contexts.wallet.wallet-connect.utils.data-store :as
Expand Down Expand Up @@ -52,7 +53,7 @@
:data raw-data
:rpc-method rpc-method
:on-error #(rf/dispatch [:wallet-connect/on-sign-error %])
:on-success #(rf/dispatch [:wallet-connect/finish-session-request %])}]]})))
:on-success #(rf/dispatch [:wallet-connect/respond-sign-message-success %])}]]})))

(rf/reg-event-fx
:wallet-connect/respond-sign-typed-data
Expand All @@ -66,7 +67,7 @@
:chain-id chain-id
:version typed-data-version
:on-error #(rf/dispatch [:wallet-connect/on-sign-error %])
:on-success #(rf/dispatch [:wallet-connect/finish-session-request %])}]]})))
:on-success #(rf/dispatch [:wallet-connect/respond-sign-message-success %])}]]})))

(rf/reg-event-fx
:wallet-connect/respond-send-transaction-data
Expand All @@ -79,8 +80,8 @@
:chain-id chain-id
:tx-hash tx-hash
:tx-args tx-args
:on-error #(rf/dispatch [:wallet-connect/on-sign-error %])
:on-success #(rf/dispatch [:wallet-connect/finish-session-request %])}]]})))
:on-error #(rf/dispatch [:wallet-connect/respond-send-transaction-error %])
:on-success #(rf/dispatch [:wallet-connect/respond-send-transaction-success %])}]]})))

(rf/reg-event-fx
:wallet-connect/respond-sign-transaction-data
Expand All @@ -94,13 +95,25 @@
:tx-hash tx-hash
:tx-params tx-args
:on-error #(rf/dispatch [:wallet-connect/on-sign-error %])
:on-success #(rf/dispatch [:wallet-connect/finish-session-request %])}]]})))
:on-success #(rf/dispatch [:wallet-connect/respond-sign-message-success %])}]]})))

(rf/reg-event-fx :wallet-connect/respond-sign-message-success
(fn [{:keys [db]} [result]]
(let [[dapp-name networks] (data-store/get-dapp-name-and-networks db)]
(log/info "Successfully signed Wallet Connect request")
{:fx [[:dispatch [:wallet-connect/finish-session-request result]]
[:dispatch
[:centralized-metrics/track-event "dapp-sign"
{:dapp_name dapp-name
:networks networks
:result :success}]]]})))

(rf/reg-event-fx
:wallet-connect/on-sign-error
(fn [{:keys [db]} [error]]
(let [{:keys [raw-data address event]} (get db :wallet-connect/current-request)
method (data-store/get-request-method event)]
method (data-store/get-request-method event)
[dapp-name networks] (data-store/get-dapp-name-and-networks db)]
(log/error "Failed to sign Wallet Connect request"
{:error error
:address address
Expand All @@ -112,7 +125,39 @@
[:dispatch
[:toasts/upsert
{:type :negative
:text (i18n/label :t/something-went-wrong)}]]]})))
:text (i18n/label :t/something-went-wrong)}]]
[:dispatch
[:centralized-metrics/track-event "dapp-sign"
{:dapp_name dapp-name
:networks networks
:result :fail}]]]})))

(rf/reg-event-fx
:wallet-connect/respond-send-transaction-error
(fn [{:keys [db]}]
(let [[dapp-name networks] (data-store/get-dapp-name-and-networks db)]
(log/error "Failed to send transaction to Wallet Connect")
{:fx [[:dispatch [:wallet-connect/dismiss-request-modal]]
[:dispatch
[:toasts/upsert
{:type :negative
:text (i18n/label :t/something-went-wrong)}]]
[:dispatch
[:centralized-metrics/track-event "dapp-send"
{:dapp_name dapp-name
:networks networks
:result :fail}]]]})))

(rf/reg-event-fx :wallet-connect/respond-send-transaction-success
(fn [{:keys [db]} [result]]
(let [[dapp-name networks] (data-store/get-dapp-name-and-networks db)]
(log/info "Successfully sent transaction request to Wallet connect")
{:fx [[:dispatch
[:centralized-metrics/track-event "dapp-send"
{:dapp_name dapp-name
:networks networks
:result :success}]]
[:dispatch [:wallet-connect/finish-session-request result]]]})))

(rf/reg-event-fx
:wallet-connect/send-response
Expand Down Expand Up @@ -176,9 +221,27 @@
(rf/reg-event-fx
:wallet-connect/on-request-modal-dismissed
(fn [{:keys [db]}]
{:fx [(when-not (get-in db [:wallet-connect/current-request :response-sent?])
[:dispatch
[:wallet-connect/send-response
{:error (wallet-connect/get-sdk-error
constants/wallet-connect-user-rejected-error-key)}]])
[:dispatch [:wallet-connect/reset-current-request]]]}))
(let [{:keys [response-sent? event]} (get db :wallet-connect/current-request)]
{:fx [(when-not response-sent?
(let [send-method? (-> event
(data-store/get-request-method)
(string/includes? "send"))
[dapp-name networks] (data-store/get-dapp-name-and-networks db)]
[:dispatch
[:wallet-connect/send-response
{:error (wallet-connect/get-sdk-error
constants/wallet-connect-user-rejected-error-key)}]]
(if send-method?
[:dispatch
[:centralized-metrics/track-event "dapp-send"
{:dapp_name dapp-name
:networks networks
:action :rejected
:result :success}]]
[:dispatch
[:centralized-metrics/track-event "dapp-sign"
{:dapp_name dapp-name
:networks networks
:action :rejected
:result :success}]])))
[:dispatch [:wallet-connect/reset-current-request]]]})))
12 changes: 10 additions & 2 deletions src/status_im/contexts/wallet/wallet_connect/events/sessions.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,26 @@

(rf/reg-event-fx
:wallet-connect/disconnect-dapp
(fn [{:keys [db]} [{:keys [topic on-success on-fail]}]]
(fn [{:keys [db]} [{:keys [topic name on-success on-fail]}]]
(let [web3-wallet (get db :wallet-connect/web3-wallet)
network-status (:network/status db)]
(log/info "Disconnecting dApp session" topic)
(if (= network-status :online)
{:fx [[:effects.wallet-connect/disconnect
{:web3-wallet web3-wallet
:topic topic
:on-fail on-fail
:on-fail (fn []
(rf/dispatch [:centralized-metrics/track-event "dapp-disconnected"
{:dapp_name name
:result :fail}])
(when on-fail
(on-fail)))
:on-success (fn []
(log/info "Successfully disconnected dApp session" topic)
(rf/dispatch [:wallet-connect/delete-session topic])
(rf/dispatch [:centralized-metrics/track-event "dapp-disconnected"
{:dapp_name name
:result :success}])
(when on-success
(on-success)))}]]}
{:fx [[:dispatch [:wallet-connect/no-internet-toast]]]}))))
Expand Down
45 changes: 45 additions & 0 deletions src/status_im/contexts/wallet/wallet_connect/utils/data_store.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,48 @@
(-> db
get-db-current-request-event
get-request-params))

(defn- find-networks
[current-request current-proposal request db]
(cond
current-request
(get-in current-request [:params :chainId])

current-proposal
(->> (get-in db [:wallet-connect/current-proposal :session-networks])
vec
(string/join ","))

request
(->> (or (get-in request [:params :requiredNamespaces :eip155 :chains])
(get-in request [:requiredNamespaces :eip155 :chains]))
vec
(string/join ","))

:else
[]))

(defn- find-url
[current-request current-proposal request]
(cond
current-request
(get-in current-request [:verifyContext :verified :origin])

current-proposal
(get-in current-proposal [:params :proposer :metadata :url])

request
(or (get-in request [:params :proposer :metadata :url])
(get-in request [:peer :metadata :url]))

:else
nil))

(defn get-dapp-name-and-networks
[db & [request]]
(let [current-request (get-in db [:wallet-connect/current-request :event])
current-proposal (get-in db [:wallet-connect/current-proposal :request])
session-networks (find-networks current-request current-proposal request db)
dapp-url (find-url current-request current-proposal request)
dapp-name (compute-dapp-name nil dapp-url)]
[dapp-name session-networks]))