From c644ab35014950435ddd47a3b0f85f245064dc0a Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Fri, 7 Aug 2020 17:24:09 +0300 Subject: [PATCH] Resolve contract by ens name Do not show referrals if contract is not available Do not check contract for referral accept Rename invite event namespace require Remove dispatch from raw subs Do nothing if there is no contract Signed-off-by: Gheorghe Pinzaru --- src/status_im/acquisition/core.cljs | 31 +++++++++---- src/status_im/ethereum/contracts.cljs | 4 +- src/status_im/multiaccounts/login/core.cljs | 44 +++++++++--------- .../ui/components/invite/events.cljs | 45 +++++++++---------- src/status_im/ui/components/invite/views.cljs | 27 ++++++----- 5 files changed, 82 insertions(+), 69 deletions(-) diff --git a/src/status_im/acquisition/core.cljs b/src/status_im/acquisition/core.cljs index 4c90efbea7..5a7c7e88cc 100644 --- a/src/status_im/acquisition/core.cljs +++ b/src/status_im/acquisition/core.cljs @@ -1,6 +1,10 @@ (ns status-im.acquisition.core (:require [re-frame.core :as re-frame] + [clojure.string :as string] [status-im.utils.fx :as fx] + [status-im.ethereum.core :as ethereum] + [status-im.ethereum.ens :as ens] + [status-im.ethereum.contracts :as contracts] [status-im.acquisition.chat :as chat] [status-im.acquisition.advertiser :as advertiser] [status-im.acquisition.persistance :as persistence] @@ -84,12 +88,23 @@ (when-not (nil? tx) (re-frame/dispatch [::add-tx-watcher tx])))}))))) -(fx/defn create - {} - [_] - {::get-referrer nil}) +(re-frame/reg-fx + ::resolve-contract + (fn [{:keys [chain contract on-success]}] + (let [register (get ens/ens-registries chain)] + (when contract + (if (string/starts-with? contract "0x") + (on-success contract) + (ens/resolver register contract on-success)))))) -(fx/defn login - {} - [_] - {::check-referrer nil}) +(fx/defn create [{:keys [db]}] + {::resolve-contract {:chain (ethereum/chain-keyword db) + :contract (contracts/get-address db :status/acquisition) + :on-success #(re-frame/dispatch [:set-in [:acquisition :contract] %])} + ::get-referrer nil}) + +(fx/defn login [{:keys [db]}] + {::resolve-contract {:chain (ethereum/chain-keyword db) + :contract (contracts/get-address db :status/acquisition) + :on-success #(re-frame/dispatch [:set-in [:acquisition :contract] %])} + ::check-referrer nil}) diff --git a/src/status_im/ethereum/contracts.cljs b/src/status_im/ethereum/contracts.cljs index dbd467fc8f..b66b9f9878 100644 --- a/src/status_im/ethereum/contracts.cljs +++ b/src/status_im/ethereum/contracts.cljs @@ -17,8 +17,8 @@ {:testnet "0xf852198d0385c4b871e0b91804ecd47c6ba97351" :mainnet "0x110101156e8F0743948B2A61aFcf3994A8Fb172e"} :status/acquisition - {:rinkeby "0x719C016d16ff0396274d488Efc4D8aEaAA126b48" - :mainnet "0x81142267f927bffc6dba200a928c376fbf6675a8"}}) + {:rinkeby "0xf8Ea093cE1441ad51EDD4C0FD15410b457e88906" + :mainnet "statusreferrals.eth"}}) (defn get-address [db contract] diff --git a/src/status_im/multiaccounts/login/core.cljs b/src/status_im/multiaccounts/login/core.cljs index a031dfcf36..760d2f415c 100644 --- a/src/status_im/multiaccounts/login/core.cljs +++ b/src/status_im/multiaccounts/login/core.cljs @@ -180,6 +180,7 @@ (and platform/android? notifications-enabled?) (assoc ::notifications/enable nil)) + (acquisition/login) (initialize-appearance) ;; NOTE: initializing mailserver depends on user mailserver ;; preference which is why we wait for config callback @@ -228,24 +229,31 @@ (fx/defn create-only-events [{:keys [db] :as cofx}] - (let [{:keys [multiaccount :multiaccount/accounts]} db] + (let [{:keys [multiaccount multiaccounts :multiaccount/accounts]} db + {:keys [creating?]} (:multiaccounts/login db) + recovering? (get-in db [:intro-wizard :recovering?]) + first-account? (and creating? + (not recovering?) + (empty? multiaccounts))] (fx/merge cofx - {:db (-> db - (dissoc :multiaccounts/login) - (assoc - ;;NOTE when login the filters are initialized twice - ;;once for contacts and once for chats - ;;when creating an account we do it only once by calling - ;;load-filters directly because we don't have chats and contacts - ;;later on there is a check that filters have been initialized twice - ;;so here we set it at 1 already so that it passes the check once it has - ;;been initialized - :filters/initialized 1)) + {:db (-> db + (dissoc :multiaccounts/login) + (assoc + ;;NOTE when login the filters are initialized twice + ;;once for contacts and once for chats + ;;when creating an account we do it only once by calling + ;;load-filters directly because we don't have chats and contacts + ;;later on there is a check that filters have been initialized twice + ;;so here we set it at 1 already so that it passes the check once it has + ;;been initialized + :filters/initialized 1)) :filters/load-filters [[(:waku-enabled multiaccount) []]]} (finish-keycard-setup) - (protocol/initialize-protocol {:mailservers [] - :mailserver-ranges {} - :mailserver-topics {} + (when first-account? + (acquisition/create)) + (protocol/initialize-protocol {:mailservers [] + :mailserver-ranges {} + :mailserver-topics {} :default-mailserver true}) (multiaccounts/switch-preview-privacy-mode-flag) (logging/set-log-level (:log-level multiaccount)) @@ -259,9 +267,6 @@ (let [{:keys [key-uid password save-password? creating?]} (:multiaccounts/login db) multiaccounts (:multiaccounts/multiaccounts db) recovering? (get-in db [:intro-wizard :recovering?]) - first-account? (and creating? - (not recovering?) - (empty? multiaccounts)) login-only? (not (or creating? recovering? (keycard-setup? cofx))) @@ -288,9 +293,6 @@ (if login-only? (login-only-events key-uid password save-password?) (create-only-events)) - (if first-account? - (acquisition/create) - (acquisition/login)) (when recovering? (navigation/navigate-to-cofx :tabs {:screen :chat-stack :params {:screen :home}}))))) diff --git a/src/status_im/ui/components/invite/events.cljs b/src/status_im/ui/components/invite/events.cljs index 7d0a7295c6..7b9b2ee1b6 100644 --- a/src/status_im/ui/components/invite/events.cljs +++ b/src/status_im/ui/components/invite/events.cljs @@ -2,8 +2,8 @@ (:require [re-frame.core :as re-frame] [reagent.ratom :refer [make-reaction]] [status-im.utils.fx :as fx] + [status-im.utils.config :as config] [status-im.ethereum.json-rpc :as json-rpc] - [status-im.ethereum.contracts :as contracts] [status-im.ethereum.core :as ethereum] [status-im.ui.components.react :as react] [status-im.navigation :as navigation] @@ -53,7 +53,7 @@ (fx/defn go-to-invite {:events [::open-invite]} [{:keys [db] :as cofx}] - (let [contract (contracts/get-address db :status/acquisition) + (let [contract (get-in db [:acquisition :contract]) accounts (filter #(not= (:type %) :watch) (get db :multiaccount/accounts))] (fx/merge cofx {::get-rewards (mapv (fn [{:keys [address]}] @@ -135,18 +135,13 @@ (let [[address amount] data] {:db (assoc-in db [:acquisition :accounts account :tokens address] (money/wei->ether amount))}))) -(fx/defn get-default-reward - {:events [::get-default-reward]} - [{:keys [db]}] - {::get-rewards [{:contract (contracts/get-address db :status/acquisition) - :address (ethereum/default-address db) - :on-success (fn [type data] - (re-frame/dispatch [::default-reward-success type data]))}]}) - (re-frame/reg-sub-raw ::default-reward (fn [db] - (re-frame/dispatch [::get-default-reward]) + (get-reward (get-in @db [:acquisition :contract]) + (ethereum/default-address @db) + (fn [type data] + (re-frame/dispatch [::default-reward-success type data]))) (make-reaction (fn [] (get-in @db [:acquisition :referral-reward]))))) @@ -162,19 +157,21 @@ (map money/wei->ether tokens-amount)) :sticker-packs sticker-packs})}) -(fx/defn starter-pack - {:events [::starter-pack]} - [{:keys [db]}] - (let [contract (contracts/get-address db :status/acquisition)] - {::json-rpc/eth-call [{:contract contract - :method "getDefaultPack()" - :outputs ["address" "uint256" "address[]" "uint256[]" "uint256[]"] - :on-success #(re-frame/dispatch [::starter-pack-amount (vec %) (prn %)])}]})) - (re-frame/reg-sub-raw ::starter-pack (fn [db] - (re-frame/dispatch [::starter-pack]) - (make-reaction - (fn [] - (get-in @db [:acquisition :starter-pack :pack]))))) + (let [contract (get-in @db [:acquisition :contract])] + (json-rpc/eth-call + {:contract contract + :method "getDefaultPack()" + :outputs ["address" "uint256" "address[]" "uint256[]" "uint256[]"] + :on-success #(re-frame/dispatch [::starter-pack-amount (vec %)])}) + (make-reaction + (fn [] + (get-in @db [:acquisition :starter-pack :pack])))))) + +(re-frame/reg-sub + ::enabled + (fn [db] + (and config/referrals-invite-enabled? + (get-in db [:acquisition :contract])))) diff --git a/src/status_im/ui/components/invite/views.cljs b/src/status_im/ui/components/invite/views.cljs index a4bff8563f..5f887a5a20 100644 --- a/src/status_im/ui/components/invite/views.cljs +++ b/src/status_im/ui/components/invite/views.cljs @@ -11,9 +11,8 @@ [quo.design-system.colors :as colors] [status-im.ui.components.invite.style :as styles] [status-im.ui.components.topbar :as topbar] - [status-im.ui.components.invite.events :as events] + [status-im.ui.components.invite.events :as invite.events] [status-im.ui.components.invite.utils :refer [transform-tokens]] - [status-im.utils.config :as config] [quo.react-native :as rn] [clojure.string :as cstr])) @@ -191,8 +190,8 @@ (let [accounts @(re-frame/subscribe [:accounts-without-watch-only]) default-account @(re-frame/subscribe [:multiaccount/default-account]) account (or @account* default-account) - reward @(re-frame/subscribe [::events/default-reward]) - starter-pack @(re-frame/subscribe [::events/starter-pack])] + reward @(re-frame/subscribe [::invite.events/default-reward]) + starter-pack @(re-frame/subscribe [::invite.events/starter-pack])] [rn/view {:flex 1} [topbar/topbar {:modal? true :show-border? true @@ -210,27 +209,27 @@ (i18n/label :t/invite-privacy-policy1) " " [quo/text {:color :link - :on-press #(re-frame/dispatch [::events/terms-and-conditions])} + :on-press #(re-frame/dispatch [::invite.events/terms-and-conditions])} (i18n/label :t/invite-privacy-policy2)]]]] [toolbar/toolbar {:show-border? true :center [quo/button {:type :secondary - :on-press #(re-frame/dispatch [::events/generate-invite + :on-press #(re-frame/dispatch [::invite.events/generate-invite {:address (get account :address)}])} (i18n/label :t/invite-button)]}]])))) (defn button [] - (if-not config/referrals-invite-enabled? + (if-not @(re-frame/subscribe [::invite.events/enabled]) [rn/view {:style {:align-items :center}} [rn/view {:style (:tiny spacing/padding-vertical)} - [quo/button {:on-press #(re-frame/dispatch [::events/share-link nil]) + [quo/button {:on-press #(re-frame/dispatch [::invite.events/share-link nil]) :accessibility-label :invite-friends-button} (i18n/label :t/invite-friends)]]] - (let [reward @(re-frame/subscribe [::events/default-reward])] + (let [reward @(re-frame/subscribe [::invite.events/default-reward])] [rn/view {:style {:align-items :center}} [rn/view {:style (:tiny spacing/padding-vertical)} - [quo/button {:on-press #(re-frame/dispatch [::events/open-invite]) + [quo/button {:on-press #(re-frame/dispatch [::invite.events/open-invite]) :accessibility-label :invite-friends-button} (i18n/label :t/invite-friends)]] [rn/view {:style (merge (:tiny spacing/padding-vertical) @@ -248,7 +247,7 @@ (i18n/label :t/invite-reward {:value (str (get reward :eth-amount) " ETH")})]])]]))) (defn list-item [{:keys [accessibility-label]}] - (if-not config/referrals-invite-enabled? + (if-not @(re-frame/subscribe [::invite.events/enabled]) [quo/list-item {:theme :accent :title (i18n/label :t/invite-friends) @@ -257,8 +256,8 @@ :on-press (fn [] (re-frame/dispatch [:bottom-sheet/hide]) (js/setTimeout - #(re-frame/dispatch [::events/share-link nil]) 250))}] - (let [amount @(re-frame/subscribe [::events/default-reward])] + #(re-frame/dispatch [::invite.events/share-link nil]) 250))}] + (let [amount @(re-frame/subscribe [::invite.events/default-reward])] [quo/list-item {:theme :accent :title (i18n/label :t/invite-friends) @@ -267,7 +266,7 @@ :accessibility-label accessibility-label :on-press #(do (re-frame/dispatch [:bottom-sheet/hide]) - (re-frame/dispatch [::events/open-invite]))}]))) + (re-frame/dispatch [::invite.events/open-invite]))}])))