From 8aa16520c643ad9e20faaf8526b0d735d588c732 Mon Sep 17 00:00:00 2001 From: Julien Eluard Date: Mon, 3 Jun 2019 09:42:29 +0200 Subject: [PATCH] [Fixes #8066] Added native ENS registration Signed-off-by: Andrey Shovkoplyas --- resources/images/ui/ens-header.png | Bin 0 -> 25023 bytes resources/images/ui/ens-header@2x.png | Bin 0 -> 49319 bytes resources/images/ui/ens-header@3x.png | Bin 0 -> 82721 bytes .../realm/schemas/base/account.cljs | 2 + .../data_store/realm/schemas/base/core.cljs | 8 + src/status_im/ens/core.cljs | 150 +++++ src/status_im/ethereum/core.cljs | 8 + src/status_im/ethereum/ens.cljs | 3 +- src/status_im/ethereum/stateofus.cljs | 24 + src/status_im/events.cljs | 12 +- src/status_im/react_native/resources.cljs | 3 +- src/status_im/subs.cljs | 46 +- src/status_im/ui/components/list/styles.cljs | 16 +- src/status_im/ui/components/list/views.cljs | 10 +- src/status_im/ui/screens/ens/views.cljs | 521 ++++++++++++++++++ .../ui/screens/profile/user/views.cljs | 24 +- .../ui/screens/routing/profile_stack.cljs | 4 + src/status_im/ui/screens/routing/screens.cljs | 5 + .../status_im/test/ethereum/stateofus.cljs | 9 + test/cljs/status_im/test/runner.cljs | 2 + translations/en.json | 66 ++- 21 files changed, 882 insertions(+), 31 deletions(-) create mode 100644 resources/images/ui/ens-header.png create mode 100644 resources/images/ui/ens-header@2x.png create mode 100644 resources/images/ui/ens-header@3x.png create mode 100644 src/status_im/ens/core.cljs create mode 100644 src/status_im/ethereum/stateofus.cljs create mode 100644 src/status_im/ui/screens/ens/views.cljs create mode 100644 test/cljs/status_im/test/ethereum/stateofus.cljs diff --git a/resources/images/ui/ens-header.png b/resources/images/ui/ens-header.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8dfa4f2a635b8c7d306f4d33f4893bec52900b GIT binary patch literal 25023 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 literal 0 HcmV?d00001 diff --git a/resources/images/ui/ens-header@2x.png b/resources/images/ui/ens-header@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ab3a0ed13c9a6703b8054b56e7efac5a2e2c4c8c GIT binary patch literal 49319 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 literal 0 HcmV?d00001 diff --git a/resources/images/ui/ens-header@3x.png b/resources/images/ui/ens-header@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..162d7e8a4f8db196ac6f7759542f5d1df236d57f GIT binary patch literal 82721 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 blu?>>q1@OM$y^ulXx2jc$$e}TDa literal 0 HcmV?d00001 diff --git a/src/status_im/data_store/realm/schemas/base/account.cljs b/src/status_im/data_store/realm/schemas/base/account.cljs index 2f56534355..1e8de824cd 100644 --- a/src/status_im/data_store/realm/schemas/base/account.cljs +++ b/src/status_im/data_store/realm/schemas/base/account.cljs @@ -246,3 +246,5 @@ (def v23 (assoc-in v22 [:properties :keycard-key-uid] {:type :string :optional true})) + +(def v24 (update v23 :properties merge {:usernames {:type "string[]" :optional true}})) diff --git a/src/status_im/data_store/realm/schemas/base/core.cljs b/src/status_im/data_store/realm/schemas/base/core.cljs index a653401a5a..880f646285 100644 --- a/src/status_im/data_store/realm/schemas/base/core.cljs +++ b/src/status_im/data_store/realm/schemas/base/core.cljs @@ -113,6 +113,11 @@ extension/v12 account/v23]) +(def v29 [network/v1 + bootnode/v4 + extension/v12 + account/v24]) + ;; put schemas ordered by version (def schemas [{:schema v1 :schemaVersion 1 @@ -197,4 +202,7 @@ :migration (constantly nil)} {:schema v28 :schemaVersion 28 + :migration (constantly nil)} + {:schema v29 + :schemaVersion 29 :migration (constantly nil)}]) diff --git a/src/status_im/ens/core.cljs b/src/status_im/ens/core.cljs new file mode 100644 index 0000000000..09445591f8 --- /dev/null +++ b/src/status_im/ens/core.cljs @@ -0,0 +1,150 @@ +(ns status-im.ens.core + (:require [clojure.string :as string] + [re-frame.core :as re-frame] + [status-im.accounts.update.core :as accounts.update] + [status-im.ethereum.abi-spec :as abi-spec] + [status-im.ethereum.contracts :as contracts] + [status-im.ethereum.core :as ethereum] + [status-im.ethereum.ens :as ens] + [status-im.ethereum.resolver :as resolver] + [status-im.ethereum.stateofus :as stateofus] + [status-im.ui.screens.navigation :as navigation] + [status-im.utils.fx :as fx] + [status-im.utils.money :as money] + [status-im.signing.core :as signing]) + (:refer-clojure :exclude [name])) + +(defn fullname [custom-domain? username] + (if custom-domain? + username + (stateofus/subdomain username))) + +(re-frame/reg-fx + :ens/resolve-address + (fn [[registry name cb]] + (ens/get-addr registry name cb))) + +(re-frame/reg-fx + :ens/resolve-pubkey + (fn [[registry name cb]] + (resolver/pubkey registry name cb))) + +(defn assoc-state-for [db username state] + (assoc-in db [:ens/registration :states username] state)) + +(defn assoc-details-for [db username k v] + (assoc-in db [:ens/names :details username k] v)) + +(defn assoc-username-candidate [db username] + (assoc-in db [:ens/registration :username-candidate] username)) + +(defn empty-username-candidate [db] (assoc-username-candidate db "")) + +(fx/defn set-state + {:events [:ens/set-state]} + [{:keys [db]} username state] + {:db (assoc-state-for db username state)}) + +(defn- on-resolve [registry custom-domain? username address public-key s] + (cond + (= (ethereum/normalized-address address) (ethereum/normalized-address s)) + (resolver/pubkey registry (fullname custom-domain? username) + #(re-frame/dispatch [:ens/set-state username (if (= % public-key) :connected :owned)])) + + (and (nil? s) (not custom-domain?)) ;; No address for a stateofus subdomain: it can be registered + (re-frame/dispatch [:ens/set-state username :registrable]) + + :else + (re-frame/dispatch [:ens/set-state username :unregistrable]))) + +(fx/defn register-name + [{:keys [db] :as cofx} contract custom-domain? username address public-key] + (let [{:keys [x y]} (ethereum/coordinates public-key)] + (signing/eth-transaction-call + cofx + {:contract (contracts/get-address db :status/snt) + :method "approveAndCall(address,uint256,bytes)" + :params [contract + (money/unit->token 10 18) + (abi-spec/encode "register(bytes32,address,bytes32,bytes32)" + [(ethereum/sha3 username) address x y])] + :on-result [:ens/save-username custom-domain? username] + :on-error [:ens/on-registration-failure]}))) + +(defn- valid-custom-domain? [username] + (and (ens/is-valid-eth-name? username) + (stateofus/lower-case? username))) + +(defn- valid-username? [custom-domain? username] + (if custom-domain? + (valid-custom-domain? username) + (stateofus/valid-username? username))) + +(defn- state [custom-domain? username] + (cond + (string/blank? username) :initial + (> 4 (count username)) :too-short + (valid-username? custom-domain? username) :valid + :else :invalid)) + +(fx/defn set-username-candidate + {:events [:ens/set-username-candidate]} + [{:keys [db]} custom-domain? username] + (let [state (state custom-domain? username) + valid? (valid-username? custom-domain? username) + name (fullname custom-domain? username)] + (merge + {:db (-> db + (assoc-username-candidate username) + (assoc-state-for username state))} + (when (and name (= :valid state)) + (let [{:keys [account/account]} db + {:keys [address public-key]} account + registry (get ens/ens-registries (ethereum/chain-keyword db))] + {:ens/resolve-address [registry name #(on-resolve registry custom-domain? username address public-key %)]}))))) + +(fx/defn clear-cache-and-navigate-back + {:events [:ens/clear-cache-and-navigate-back]} + [{:keys [db] :as cofx} _] + (fx/merge cofx + {:db (assoc db :ens/registration nil)} ;; Clear cache + (navigation/navigate-back))) + +(fx/defn switch-domain-type + {:events [:ens/switch-domain-type]} + [{:keys [db]} _] + {:db (-> (update-in db [:ens/registration :custom-domain?] not) + (empty-username-candidate))}) + +(fx/defn save-username + {:events [:ens/save-username]} + [{:keys [db] :as cofx} custom-domain? username] + (let [name (fullname custom-domain? username) + db (update-in db [:account/account :usernames] #((fnil conj []) %1 %2) name)] + (accounts.update/account-update cofx + {:usernames (get-in db [:account/account :usernames])} + {:success-event [:ens/set-state username :saved]}))) + +(fx/defn on-registration-failure + {:events [:ens/on-registration-failure]} + [{:keys [db]} username] + {:db (assoc-state-for db username :registration-failed)}) + +(fx/defn register + {:events [:ens/register]} + [cofx {:keys [contract custom-domain? username address public-key]}] + (register-name cofx contract custom-domain? username address public-key)) + +(fx/defn store-name-detail + {:events [:ens/store-name-detail]} + [{:keys [db]} name k v] + {:db (assoc-details-for db name k v)}) + +(fx/defn navigate-to-name + {:events [:ens/navigate-to-name]} + [{:keys [db] :as cofx} name] + (let [registry (get ens/ens-registries (ethereum/chain-keyword db))] + (fx/merge cofx + {:ens/resolve-address [registry name #(re-frame/dispatch [:ens/store-name-detail name :address %])] + :ens/resolve-pubkey [registry name #(re-frame/dispatch [:ens/store-name-detail name :public-key %])]} + (navigation/navigate-to-cofx :ens-name-details name)))) diff --git a/src/status_im/ethereum/core.cljs b/src/status_im/ethereum/core.cljs index 221564dcdb..ca062dee10 100644 --- a/src/status_im/ethereum/core.cljs +++ b/src/status_im/ethereum/core.cljs @@ -65,6 +65,14 @@ (when s (string/replace s hex-prefix ""))) +(def ^:const public-key-length 128) + +(defn coordinates [public-key] + (when-let [hex (naked-address public-key)] + (when (= public-key-length (count (subs hex 2))) + {:x (normalized-address (subs hex 1 65)) + :y (normalized-address (subs hex 66))}))) + (defn address? [s] (when s (.isAddress (utils) s))) diff --git a/src/status_im/ethereum/ens.cljs b/src/status_im/ethereum/ens.cljs index e98122c7e6..0640dc3a2f 100644 --- a/src/status_im/ethereum/ens.cljs +++ b/src/status_im/ethereum/ens.cljs @@ -41,8 +41,7 @@ :outputs ["address"] :on-success (fn [[address]] - (when-not (= address default-address) - (cb address)))})) + (cb (when-not (= address default-address) address)))})) (defn owner [registry ens-name cb] diff --git a/src/status_im/ethereum/stateofus.cljs b/src/status_im/ethereum/stateofus.cljs new file mode 100644 index 0000000000..d26bf6eb08 --- /dev/null +++ b/src/status_im/ethereum/stateofus.cljs @@ -0,0 +1,24 @@ +(ns status-im.ethereum.stateofus + (:require [clojure.string :as string])) + +(def domain "stateofus.eth") + +(defn subdomain [username] + (str username "." domain)) + +(defn username [name] + (when (string/ends-with? name domain) + (first (string/split name ".")))) + +(def registrars + {:mainnet "0xDB5ac1a559b02E12F29fC0eC0e37Be8E046DEF49" + :testnet "0x11d9F481effd20D76cEE832559bd9Aca25405841"}) + +(defn lower-case? [s] + (when s + (= s (string/lower-case s)))) + +(defn valid-username? [username] + (boolean + (and (lower-case? username) + (re-find #"^[a-z0-9]+$" username)))) \ No newline at end of file diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index 524ebf2f28..28956bd788 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -1,5 +1,6 @@ (ns status-im.events - (:require [re-frame.core :as re-frame] + (:require [clojure.string :as string] + [re-frame.core :as re-frame] [status-im.accounts.core :as accounts] [status-im.accounts.create.core :as accounts.create] [status-im.accounts.login.core :as accounts.login] @@ -21,6 +22,8 @@ [status-im.contact-recovery.core :as contact-recovery] [status-im.contact.block :as contact.block] [status-im.contact.core :as contact] + [status-im.ethereum.core :as ethereum] + [status-im.ethereum.ens :as ethereum.ens] [status-im.ethereum.subscriptions :as ethereum.subscriptions] [status-im.ethereum.transactions.core :as ethereum.transactions] [status-im.fleet.core :as fleet] @@ -1548,11 +1551,6 @@ ;; profile module -(handlers/register-handler-fx - :profile.ui/ens-names-button-pressed - (fn [cofx] - (browser/open-url cofx "names.statusnet.eth"))) - (handlers/register-handler-fx :profile.ui/keycard-settings-button-pressed (fn [cofx] @@ -1997,4 +1995,4 @@ (re-frame/reg-fx :dismiss-keyboard (fn [] - (react/dismiss-keyboard!))) \ No newline at end of file + (react/dismiss-keyboard!))) diff --git a/src/status_im/react_native/resources.cljs b/src/status_im/react_native/resources.cljs index c097b1fee4..2d8c84fe6c 100644 --- a/src/status_im/react_native/resources.cljs +++ b/src/status_im/react_native/resources.cljs @@ -16,7 +16,8 @@ :warning-sign (js-require/js-require "./resources/images/ui/warning-sign.png") :phone-nfc-on (js-require/js-require "./resources/images/ui/phone-nfc-on.png") :phone-nfc-off (js-require/js-require "./resources/images/ui/phone-nfc-off.png") - :dapp-store (js-require/js-require "./resources/images/ui/dapp-store.png")}) + :dapp-store (js-require/js-require "./resources/images/ui/dapp-store.png") + :ens-header (js-require/js-require "./resources/images/ui/ens-header.png")}) (def loaded-images (atom {})) diff --git a/src/status_im/subs.cljs b/src/status_im/subs.cljs index 0a9464324e..f701874cdc 100644 --- a/src/status_im/subs.cljs +++ b/src/status_im/subs.cljs @@ -12,10 +12,11 @@ [status-im.chat.models :as chat.models] [status-im.constants :as constants] [status-im.contact.db :as contact.db] + [status-im.ethereum.core :as ethereum] + [status-im.ethereum.stateofus :as stateofus] [status-im.ethereum.tokens :as tokens] [status-im.ethereum.transactions.core :as transactions] [status-im.ethereum.transactions.etherscan :as transactions.etherscan] - [status-im.ethereum.core :as ethereum] [status-im.fleet.core :as fleet] [status-im.group-chats.db :as group-chats.db] [status-im.i18n :as i18n] @@ -34,6 +35,7 @@ [status-im.utils.build :as build] [status-im.utils.config :as config] [status-im.utils.datetime :as datetime] + [status-im.utils.hex :as utils.hex] [status-im.utils.identicon :as identicon] [status-im.utils.money :as money] [status-im.utils.platform :as platform] @@ -165,6 +167,10 @@ ;;ethereum (reg-root-key-sub :ethereum/current-block :ethereum/current-block) +;;ens +(reg-root-key-sub :ens/registration :ens/registration) +(reg-root-key-sub :ens/names :ens/names) + ;;signing (reg-root-key-sub :signing/tx :signing/tx) (reg-root-key-sub :signing/sign :signing/sign) @@ -1787,6 +1793,44 @@ (#{"0" "0.0" "0.00"} screen-snt-amount) (string/ends-with? screen-snt-amount "."))))))))) +;;ENS ================================================================================================================== + +(re-frame/reg-sub + :ens.stateofus/registrar + :<- [:account/network] + (fn [network] + (let [chain (ethereum/network->chain-keyword network)] + (get stateofus/registrars chain)))) + +(re-frame/reg-sub + :account/usernames + :<- [:account/account] + (fn [account] + (:usernames account))) + +(re-frame/reg-sub + :ens.registration/screen + :<- [:ens/registration] + :<- [:ens.stateofus/registrar] + :<- [:account/account] + (fn [[{:keys [custom-domain? username-candidate] :as ens} registrar {:keys [address public-key]}] _] + {:state (get-in ens [:states username-candidate]) + :username username-candidate + :custom-domain? (or custom-domain? false) + :contract registrar + :address address + :public-key public-key})) + +(re-frame/reg-sub + :ens.name/screen + :<- [:get-screen-params :ens-name-details] + :<- [:ens/names] + (fn [[name ens] _] + (let [{:keys [address public-key]} (get-in ens [:details name])] + {:name name + :address address + :public-key public-key}))) + ;;SIGNING ============================================================================================================= (re-frame/reg-sub diff --git a/src/status_im/ui/components/list/styles.cljs b/src/status_im/ui/components/list/styles.cljs index cdc718e030..f37a257bae 100644 --- a/src/status_im/ui/components/list/styles.cljs +++ b/src/status_im/ui/components/list/styles.cljs @@ -75,14 +75,13 @@ (def settings-item-separator {:margin-left 16}) -(defn settings-item - [large?] - {:padding-left 16 - :padding-right 8 - :flex 1 - :flex-direction :row - :align-items :center - :height (if large? 82 52)}) +(def settings-item + {:padding-left 16 + :padding-right 8 + :flex 1 + :flex-direction :row + :align-items :center + :height 64}) (defn settings-item-icon [icon-color large?] @@ -111,7 +110,6 @@ (def settings-item-main-text-container {:flex-direction :row - :height 18 :align-items :center}) (def settings-item-subtext diff --git a/src/status_im/ui/components/list/views.cljs b/src/status_im/ui/components/list/views.cljs index 85724ac7e9..487a3fcacd 100644 --- a/src/status_im/ui/components/list/views.cljs +++ b/src/status_im/ui/components/list/views.cljs @@ -114,7 +114,7 @@ :icon-opts {:color colors/white}}]) (defn big-list-item - [{:keys [style text text-color subtext value action-fn active? destructive? hide-chevron? + [{:keys [style text text-color text-style subtext value action-fn active? destructive? hide-chevron? accessory-value text-color new? activity-indicator accessibility-label icon icon-color image-source icon-content] :or {icon-color colors/blue @@ -123,14 +123,14 @@ active? true style {}}}] {:pre [(or icon image-source activity-indicator) - (and action-fn text) + text (or (nil? accessibility-label) (keyword? accessibility-label))]} [react/touchable-highlight {:on-press action-fn :style style :accessibility-label accessibility-label :disabled (not active?)} - [react/view (styles/settings-item subtext) + [react/view styles/settings-item (cond icon [react/view (styles/settings-item-icon icon-color subtext) @@ -148,14 +148,14 @@ [react/view {:style styles/new-label} [react/text {:style styles/new-label-text} (string/upper-case (i18n/label :t/new))]]) - [react/text {:style (styles/settings-item-text text-color)} + [react/text {:style (merge (styles/settings-item-text text-color) text-style)} text]] [react/view {:style {:margin-top 2 :justify-content :flex-start}} [react/text {:style styles/settings-item-subtext :number-of-lines 2} subtext]]] - [react/text {:style (styles/settings-item-text text-color) + [react/text {:style (merge (styles/settings-item-text text-color) text-style) :number-of-lines 1} text]) (when accessory-value diff --git a/src/status_im/ui/screens/ens/views.cljs b/src/status_im/ui/screens/ens/views.cljs new file mode 100644 index 0000000000..6fc449be82 --- /dev/null +++ b/src/status_im/ui/screens/ens/views.cljs @@ -0,0 +1,521 @@ +(ns status-im.ui.screens.ens.views + " + + +-------------+ + | Initial | + +-----+-------+ + | + | Typing + | + v + +--------------+ +----------------+ + | Valid | | Invalid/reason | + +------+-------+ +-------+--------+ + | | + +----------+----------+ + | + | Checking + | + | + v ++------------------------------------------+ +| +--------------+ +----------------+ | +| | Unregistrable| | Registrable | | +-----------------------------------+ +-------------+ +| +--------------+ +----------------+ | | Connected/details | | Not owned | +| | | (none, address, public+key, all) | +-------------+ +| | +----------+------------------------+ +| Name available | | ++-------------------+----------------------+ | + | | + | | + | | + | Registering | Connecting + | (on-chain, 1 tx) | (on-chain, 1tx per info to connect) + | | + +-----------------------+------------------+ + | + | + | Saving + | + | + +-------+-----+ + | Saved | + +-------------+ + + " + (:require [re-frame.core :as re-frame] + [reagent.core :as reagent] + [status-im.ens.core :as ens] + [status-im.ethereum.core :as ethereum] + [status-im.ethereum.ens :as ethereum.ens] + [status-im.ethereum.stateofus :as stateofus] + [status-im.i18n :as i18n] + [status-im.react-native.resources :as resources] + [status-im.ui.components.checkbox.view :as checkbox] + [status-im.ui.components.colors :as colors] + [status-im.ui.components.common.common :as components.common] + [status-im.ui.components.icons.vector-icons :as vector-icons] + [status-im.ui.components.list.views :as list] + [status-im.ui.components.react :as react] + [status-im.ui.components.status-bar.view :as status-bar] + [status-im.ui.components.toolbar.actions :as actions] + [status-im.ui.components.toolbar.view :as toolbar]) + + (:require-macros [status-im.utils.views :as views])) + +;; Components + +(defn- button [{:keys [on-press] :as m} label] + [components.common/button (merge {:button-style {:margin-vertical 8 + :padding-horizontal 32 + :justify-content :center + :align-items :center} + :on-press on-press + :label label} + m)]) + +(defn- link [{:keys [on-press]} label] + [react/touchable-opacity {:on-press on-press :style {:justify-content :center}} + [react/text {:style {:color colors/blue}} + label]]) + +(defn- section [{:keys [title content]}] + [react/view {:style {:margin-horizontal 16 :align-items :flex-start}} + [react/text {:style {:color colors/gray :font-size 15}} + title] + [react/view {:margin-top 8 :padding-horizontal 16 :padding-vertical 12 :border-width 1 :border-radius 12 + :border-color colors/gray-lighter} + [react/text {:style {:font-size 15}} + content]]]) + +;; Name details + +(views/defview name-details [] + (views/letsubs [{:keys [name address public-key]} [:ens.name/screen]] + (let [pending? (nil? address)] + [react/view {:style {:flex 1}} + [status-bar/status-bar {:type :main}] + [toolbar/simple-toolbar + name] + [react/scroll-view {:style {:flex 1}} + [react/view {:style {:flex 1 :margin-horizontal 16}} + [react/view {:flex-direction :row :align-items :center :margin-top 20} + [react/view {:style {:margin-right 16}} + [components.common/logo + {:size 40 + :icon-size 16}]] + [react/text {:style {:typography :title}} + (if pending? + (i18n/label :t/ens-transaction-pending) + (str (i18n/label :t/ens-10-SNT) ", deposit unlocked"))]]] + [react/view {:style {:margin-top 22}} + (when-not pending? + [section {:title (i18n/label :t/ens-wallet-address) + :content (ethereum/normalized-address address)}]) + (when-not pending? + [react/view {:style {:margin-top 14}} + [section {:title (i18n/label :t/key) + :content public-key}]]) + [react/view {:style {:margin-top 16 :margin-bottom 32}} + [list/big-list-item {:text (i18n/label :t/ens-remove-username) + :subtext (i18n/label :t/ens-remove-hints) + :text-color colors/gray + :text-style {:font-weight "500"} + :icon :main-icons/close + :icon-color colors/gray + :hide-chevron? true}] + [react/view {:style {:margin-top 10}} + [list/big-list-item {:text (i18n/label :t/ens-release-username) + :text-color colors/gray + :text-style {:font-weight "500"} + :subtext (i18n/label :t/ens-locked) + :action-fn #(re-frame/dispatch [:navigate-to :ens-register]) + :icon :main-icons/delete + :icon-color colors/gray + :active? false + :hide-chevron? true}]]]]]]))) + +;; Terms + +(defn- term-point [content] + [react/view {:style {:flex 1 :margin-top 24 :margin-horizontal 16 :flex-direction :row}} + [react/view {:style {:width 16 :margin-top 8}} + [react/view {:style {:background-color colors/gray :width 4 :height 4 :border-radius 25}}]] + [react/text {:style {:flex 1 :font-size 15}} + content]]) + +(defn- etherscan-url [address] + (str "https://etherscan.io/address/" address)) + +(views/defview terms [] + (views/letsubs [{:keys [contract]} [:get-screen-params :ens-terms]] + [react/scroll-view {:style {:flex 1}} + [status-bar/status-bar {:type :main}] + [toolbar/simple-toolbar + (i18n/label :t/ens-terms-registration)] + [react/view {:style {:height 136 :background-color colors/gray-lighter :justify-content :center :align-items :center}} + [react/text {:style {:text-align :center :typography :header :letter-spacing -0.275}} + (i18n/label :t/ens-terms-header)]] + [react/view + [term-point + (i18n/label :t/ens-terms-point-1)] + [term-point + (i18n/label :t/ens-terms-point-2)] + [term-point + (i18n/label :t/ens-terms-point-3)] + [term-point + (i18n/label :t/ens-terms-point-4)] + [term-point + (i18n/label :t/ens-terms-point-5)] + [term-point + (i18n/label :t/ens-terms-point-6)] + [term-point + (i18n/label :t/ens-terms-point-7)]] + [react/view + [react/text {:style {:font-size 15 :margin-top 24 :margin-horizontal 16 :font-weight "700"}} + (i18n/label :t/ens-terms-point-8)] + [term-point + (i18n/label :t/ens-terms-point-9 {:address contract})] + [react/view {:style {:align-items :center :margin-top 16 :margin-bottom 8}} + [link {:on-press #(.openURL (react/linking) (etherscan-url contract))} + (i18n/label :t/etherscan-lookup)]] + [term-point + (i18n/label :t/ens-terms-point-10)] + [react/view {:style {:align-items :center :margin-top 16 :margin-bottom 8}} + [link {:on-press #(.openURL (react/linking) (etherscan-url (:mainnet ethereum.ens/ens-registries)))} + (i18n/label :t/etherscan-lookup)]]]])) + +;; Registration + +(defn- valid-domain? [state] + (#{:registrable :owned :connected} state)) + +(defn- final-state? [state] + (#{:saved :registered :registration-failed} state)) + +(defn- main-icon [state] + (cond + (valid-domain? state) :main-icons/check + (= state :unregistrable) :main-icons/cancel + :else :main-icons/username)) + +(defn- icon-wrapper [color icon] + [react/view {:style {:margin-right 10 :width 32 :height 32 :border-radius 25 + :align-items :center :justify-content :center :background-color color}} + icon]) + +(defn- input-action [{:keys [state custom-domain? username]}] + (if (= :connected state) + ;; Already registered, just need to save the contact + [:ens/save-username custom-domain? username] + [:ens/set-state username :registering])) + +(defn- disabled-input-action [] + [icon-wrapper colors/gray + [vector-icons/icon :main-icons/arrow-right {:color colors/white}]]) + +(defn- input-icon [{:keys [state custom-domain? username] :as props} usernames] + (cond + (= state :registering) + nil + + (= state :valid) + [icon-wrapper colors/blue + [react/activity-indicator {:color colors/white}]] + + (valid-domain? state) + (let [name (ens/fullname custom-domain? username)] + (if (contains? (set usernames) name) + [disabled-input-action] + [react/touchable-highlight {:on-press #(re-frame/dispatch (input-action props))} + [icon-wrapper colors/blue + [vector-icons/icon :main-icons/arrow-right {:color colors/white}]]])) + + :else + [disabled-input-action])) + +(defn- default-name [custom-domain?] + (if custom-domain? + "vitalik94.domain.eth" + "vitalik94")) + +(defn- domain-label [custom-domain?] + (if custom-domain? + (i18n/label :t/ens-custom-domain) + (str "." stateofus/domain))) + +(defn- domain-switch-label [custom-domain?] + (if custom-domain? + (i18n/label :t/ens-want-domain) + (i18n/label :t/ens-want-custom-domain))) + +(defn- help-message [state custom-domain?] + (case state + (:initial :too-short) + (if custom-domain? + (i18n/label :t/ens-custom-username-hints) + (i18n/label :t/ens-username-hints)) + :invalid + (if custom-domain? + (i18n/label :t/ens-custom-username-hints) + (i18n/label :t/ens-username-invalid)) + :unregistrable + (if custom-domain? + (i18n/label :t/ens-custom-username-unregistrable) + (i18n/label :t/ens-username-unregistrable)) + :registrable + (i18n/label :t/ens-username-registrable) + :owned + (i18n/label :t/ens-username-owned) + :connected + (i18n/label :t/ens-username-connected) + "")) + +(defn- on-username-change [custom-domain? username] + (re-frame/dispatch [:ens/set-username-candidate custom-domain? username])) + +(defn- on-registration [props] + (re-frame/dispatch [:ens/register props])) + +(defn- agreement [{:keys [checked contract]}] + [react/view {:flex-direction :row :margin-horizontal 20 :margin-top 14 :align-items :flex-start :justify-content :center} + [checkbox/checkbox {:checked? @checked + :style {:padding 0} + :on-value-change #(reset! checked %)}] + [react/view {:style {:padding-left 10}} + [react/view {:style {:flex-direction :row}} + [react/text + (i18n/label :t/ens-agree-to)] + [link {:on-press #(re-frame/dispatch [:navigate-to :ens-terms {:contract contract}])} + (i18n/label :t/ens-terms-registration)]] + [react/text + (i18n/label :t/ens-understand)]]]) + +(defn- registration-bottom-bar [{:keys [checked] :as props}] + [react/view {:style {:height 60 + :background-color colors/white + :border-top-width 1 + :border-top-color colors/gray-lighter}} + [react/view {:style {:margin-horizontal 16 + :flex-direction :row + :justify-content :space-between}} + [react/view {:flex-direction :row} + [react/view {:style {:margin-top 12 :margin-right 8}} + [components.common/logo + {:size 36 + :icon-size 16}]] + [react/view {:flex-direction :column :margin-vertical 8} + [react/text {:style {:font-size 15}} + (i18n/label :t/ens-10-SNT)] + [react/text {:style {:color colors/gray :font-size 15}} + (i18n/label :t/ens-deposit)]]] + [button {:disabled? (not @checked) + :label-style (when (not @checked) {:color colors/gray}) + :on-press #(on-registration props)} + (i18n/label :t/ens-register)]]]) + +(defn- registration [{:keys [address public-key] :as props}] + [react/view {:style {:flex 1 :margin-top 24}} + [section {:title (i18n/label :t/ens-wallet-address) + :content address}] + [react/view {:style {:margin-top 14}} + [section {:title (i18n/label :t/key) + :content public-key}]] + [agreement props]]) + +(defn- icon [{:keys [state]}] + [react/view {:style {:margin-top 68 :margin-bottom 24 :width 60 :height 60 :border-radius 30 + :background-color colors/blue :align-items :center :justify-content :center}} + [vector-icons/icon (main-icon state) {:color colors/white}]]) + +(defn- username-input [{:keys [custom-domain? username state] :as props} usernames] + [react/view {:flex-direction :row :justify-content :center} + [react/text-input {:on-change-text #(on-username-change custom-domain? %) + :on-submit-editing #(on-registration props) + :auto-capitalize :none + :auto-correct false + :default-value username + :auto-focus true + :text-align :center + :placeholder (default-name custom-domain?) + :style {:flex 1 :font-size 22 + (if (= state :registering) :padding-horizontal :padding-left) 48}}] + [input-icon props usernames]]) + +(defn- final-state-label [state] + (case state + :registered + (i18n/label :t/ens-registered-title) + :saved + (i18n/label :t/ens-saved-title) + :registration-failed + (i18n/label :t/ens-registration-failed-title) + "")) + +(defn- final-state-details [{:keys [state username]}] + (case state + :registered + [react/text {:style {:color colors/gray :font-size 14}} + (i18n/label :t/ens-registered)] + :registration-failed + [react/text {:style {:color colors/gray :font-size 14}} + (i18n/label :t/ens-registration-failed)] + :saved + [react/view {:style {:flex-direction :row :align-items :center}} + [react/nested-text + {:style {}} + (stateofus/subdomain username) + [{:style {:color colors/gray}} + (i18n/label :t/ens-saved)]]] + [react/view {:flex-direction :row :margin-left 6 :margin-top 14 :align-items :center} + [react/text + (str (i18n/label :t/ens-terms-registration) " ->")]])) + +(defn- finalized-icon [{:keys [state]}] + (case state + :registration-failed + [react/view {:style {:width 40 :height 40 :border-radius 30 :background-color colors/red-light + :align-items :center :justify-content :center}} + [vector-icons/icon :main-icons/warning {:color colors/red}]] + [react/view {:style {:width 40 :height 40 :border-radius 30 :background-color colors/gray-lighter + :align-items :center :justify-content :center}} + [vector-icons/icon :main-icons/check {:color colors/blue}]])) + +(defn- registration-finalized [{:keys [state username] :as props}] + [react/view {:style {:flex 1 :align-items :center :justify-content :center}} + [finalized-icon props] + [react/text {:style {:typography :header :margin-top 32 :margin-horizontal 32 :text-align :center}} + (final-state-label state)] + [react/view {:align-items :center :margin-horizontal 32 :margin-top 12 :margin-bottom 20 :justify-content :center} + [final-state-details props]] + (if (= state :registration-failed) + [react/view + [button {:on-press #(re-frame/dispatch [:ens/set-state username :registering])} + (i18n/label :t/retry)] + [button {:background? false + :on-press #(re-frame/dispatch [:ens/clear-cache-and-navigate-back])} + (i18n/label :t/cancel)]] + [button {:on-press #(re-frame/dispatch [:ens/clear-cache-and-navigate-back])} + (i18n/label :t/ens-got-it)])]) + +(views/defview registration-pending [{:keys [state custom-domain?] :as props} usernames] + (views/letsubs [usernames [:account/usernames]] + [react/view {:style {:flex 1}} + [react/scroll-view {:style {:flex 1}} + [react/view {:style {:flex 1}} + [react/view {:style {:flex 1 :align-items :center :justify-content :center}} + [icon props] + [username-input props usernames] + [react/view {:style {:height 36 :align-items :center :justify-content :space-between :padding-horizontal 12 + :margin-top 24 :margin-horizontal 16 :border-color colors/gray-lighter :border-radius 20 + :border-width 1 :flex-direction :row}} + [react/text {:style {:font-size 12 :typography :main-medium}} + (domain-label custom-domain?)] + [react/view {:flex 1 :min-width 24}] + (when-not (= state :registering) + ;; Domain type is not shown during registration + [react/touchable-highlight {:on-press #(re-frame/dispatch [:ens/switch-domain-type])} + [react/text {:style {:color colors/blue :font-size 12 :typography :main-medium} :number-of-lines 2} + (domain-switch-label custom-domain?)]])]] + (if (= state :registering) + [registration props] + [react/text {:style {:flex 1 :margin-top 16 :margin-horizontal 16 :font-size 14 :text-align :center}} + (help-message state custom-domain?)])]] + (when (= state :registering) + [registration-bottom-bar props])])) + +(defn- toolbar [] + [toolbar/toolbar nil + [toolbar/nav-button (actions/back #(re-frame/dispatch [:ens/clear-cache-and-navigate-back]))] + [toolbar/content-title (i18n/label :t/ens-your-username)]]) + +(views/defview register [] + (views/letsubs [{:keys [address state] :as props} [:ens.registration/screen]] + (let [checked (reagent/atom false) + props (merge props {:checked checked :address (ethereum/normalized-address address)})] + [react/keyboard-avoiding-view {:flex 1} + [status-bar/status-bar {:type :main}] + [toolbar] + (if (final-state? state) + [registration-finalized props] + [registration-pending props])]))) + +;; Welcome + +(defn- welcome-item [{:keys [icon-label title]} content] + [react/view {:style {:flex 1 :margin-top 24 :margin-left 16 :flex-direction :row}} + [react/view {:style {:height 40 :width 40 :border-radius 25 :border-width 1 :border-color colors/gray-lighter + :align-items :center :justify-content :center}} + [react/text {:style {:typography :title}} + icon-label]] + [react/view {:style {:flex 1 :margin-horizontal 16}} + [react/text {:style {:font-size 15 :typography :main-semibold}} + title] + content]]) + +(defn- welcome [] + [react/view {:style {:flex 1}} + [react/scroll-view {:content-container-style {:align-items :center}} + [react/image {:source (:ens-header resources/ui) + :style {:margin-top 32}}] + [react/text {:style {:margin-top 32 :margin-bottom 8 :typography :header}} + (i18n/label :t/ens-get-name)] + [react/text {:style {:margin-top 8 :margin-bottom 24 :color colors/gray :font-size 15 :margin-horizontal 16 + :text-align :center}} + (i18n/label :t/ens-welcome-hints)] + [welcome-item {:icon-label "1" :title (i18n/label :t/ens-welcome-point-1-title)} + [react/view {:flex-direction :row} + [react/nested-text + {:style {:color colors/gray}} + (i18n/label :t/ens-welcome-point-1) + [{:style {:text-decoration-line :underline :color colors/black}} + (stateofus/subdomain "myname")]]]] + [welcome-item {:icon-label "2" :title (i18n/label :t/ens-welcome-point-2-title)} + [react/text {:style {:color colors/gray}} + (i18n/label :t/ens-welcome-point-2)]] + [welcome-item {:icon-label "3" :title (i18n/label :t/ens-welcome-point-3-title)} + [react/text {:style {:color colors/gray}} + (i18n/label :t/ens-welcome-point-3)]] + [welcome-item {:icon-label "@" :title (i18n/label :t/ens-welcome-point-4-title)} + [react/text {:style {:color colors/gray}} + (i18n/label :t/ens-welcome-point-4)]] + [react/text {:style {:margin-top 16 :text-align :center :color colors/gray :typography :caption :padding-bottom 96}} + (i18n/label :t/ens-powered-by)]] + [react/view {:align-items :center :background-color colors/white + :position :absolute :left 0 :right 0 :bottom 0 + :border-top-width 1 :border-top-color colors/gray-lighter} + [button {:on-press #(re-frame/dispatch [:navigate-to :ens-register]) + :label (i18n/label :t/get-started)}]]]) + +(defn- registered [names] + [react/scroll-view {:style {:flex 1}} + [react/view {:style {:flex 1 :margin-top 8}} + [list/big-list-item {:text (i18n/label :t/ens-add-username) + :action-fn #(re-frame/dispatch [:navigate-to :ens-register]) + :icon :main-icons/add}]] + [react/view {:style {:margin-top 22}} + [react/text {:style {:color colors/gray :margin-horizontal 16}} + (i18n/label :t/ens-your-usernames)] + (if (seq names) + [react/view {:style {:margin-top 8}} + (for [name names] + ^{:key name} + [react/view + (let [stateofus-username (stateofus/username name) + s (or stateofus-username name)] + [list/big-list-item {:text s + :subtext (when stateofus-username stateofus/domain) + :action-fn #(re-frame/dispatch [:ens/navigate-to-name name]) + :icon :main-icons/username}])])] + [react/text {:style {:color colors/gray :font-size 15}} + (i18n/label :t/ens-no-usernames)])]]) + +(views/defview main [] + (views/letsubs [names [:account/usernames]] + [react/view {:style {:flex 1}} + [status-bar/status-bar {:type :main}] + [toolbar/simple-toolbar + (i18n/label :t/ens-usernames)] + (if (seq names) + [registered names] + [welcome])])) diff --git a/src/status_im/ui/screens/profile/user/views.cljs b/src/status_im/ui/screens/profile/user/views.cljs index 23d4249c67..44294508ec 100644 --- a/src/status_im/ui/screens/profile/user/views.cljs +++ b/src/status_im/ui/screens/profile/user/views.cljs @@ -112,10 +112,6 @@ extensions-settings (vals (get extensions :settings))] [react/view [profile.components/settings-title (i18n/label :t/settings)] - [profile.components/settings-item {:label-kw :t/ens-names - :action-fn #(re-frame/dispatch [:profile.ui/ens-names-button-pressed]) - :accessibility-label :ens-names-button}] - [profile.components/settings-item-separator] [profile.components/settings-item {:label-kw :t/main-currency :value (:code currency) :action-fn #(re-frame/dispatch [:navigate-to :currency-settings]) @@ -286,6 +282,22 @@ :accessory-value active-contacts-count :action-fn #(re-frame/dispatch [:navigate-to :contacts-list])}]) +(defn- ens-item [ens {:keys [registrar] :as props}] + [list.views/big-list-item + (let [enabled? (not (nil? registrar))] + (merge + {:text (or ens (i18n/label :t/ens-usernames)) + :subtext (if enabled? + (if ens (i18n/label :t/ens-your-your-name) (i18n/label :t/ens-usernames-details)) + (i18n/label :t/ens-network-restriction)) + :icon :main-icons/username + :accessibility-label :ens-button} + (if enabled? + {:action-fn #(re-frame/dispatch [:navigate-to :ens-main props])} + {:icon-color colors/gray + :active? false + :hide-chevron? (not enabled?)})))]) + (defn tribute-to-talk-item [opts] [list.views/big-list-item @@ -312,7 +324,8 @@ login-data [:accounts/login] scroll (reagent/atom nil) active-contacts-count [:contacts/active-count] - tribute-to-talk [:tribute-to-talk/profile]] + tribute-to-talk [:tribute-to-talk/profile] + stateofus-registrar [:ens.stateofus/registrar]] (let [shown-account (merge current-account changed-account) ;; We scroll on the component once rendered. setTimeout is necessary, ;; likely to allow the animation to finish. @@ -344,6 +357,7 @@ profile-icon-options) :on-change-text-event :my-profile/update-name}]] [share-profile-item (dissoc current-account :mnemonic)] + [ens-item nil {:registrar stateofus-registrar}] [contacts-list-item active-contacts-count] (when tribute-to-talk [tribute-to-talk-item tribute-to-talk]) diff --git a/src/status_im/ui/screens/routing/profile_stack.cljs b/src/status_im/ui/screens/routing/profile_stack.cljs index fa8ad5227b..49c5a22f1f 100644 --- a/src/status_im/ui/screens/routing/profile_stack.cljs +++ b/src/status_im/ui/screens/routing/profile_stack.cljs @@ -5,6 +5,10 @@ {:name :profile-stack :screens (cond-> [:my-profile :contacts-list + :ens-main + :ens-register + :ens-terms + :ens-name-details :blocked-users-list :profile-photo-capture :about-app diff --git a/src/status_im/ui/screens/routing/screens.cljs b/src/status_im/ui/screens/routing/screens.cljs index 33bbd0a1ab..73dfec6c5a 100644 --- a/src/status_im/ui/screens/routing/screens.cljs +++ b/src/status_im/ui/screens/routing/screens.cljs @@ -15,6 +15,7 @@ [status-im.ui.screens.browser.open-dapp.views :as open-dapp] [status-im.ui.screens.browser.views :as browser] [status-im.ui.screens.chat.views :as chat] + [status-im.ui.screens.ens.views :as ens] [status-im.ui.screens.contacts-list.views :as contacts-list] [status-im.ui.screens.currency-settings.views :as currency-settings] [status-im.ui.screens.dapps-permissions.views :as dapps-permissions] @@ -126,6 +127,10 @@ :my-profile profile.user/my-profile :my-profile-ext-settings profile.user/extensions-settings :contacts-list contacts-list/contacts-list + :ens-main ens/main + :ens-register ens/register + :ens-terms ens/terms + :ens-name-details ens/name-details :blocked-users-list contacts-list/blocked-users-list :profile-photo-capture photo-capture/profile-photo-capture :about-app about-app/about-app diff --git a/test/cljs/status_im/test/ethereum/stateofus.cljs b/test/cljs/status_im/test/ethereum/stateofus.cljs new file mode 100644 index 0000000000..c7fae598f3 --- /dev/null +++ b/test/cljs/status_im/test/ethereum/stateofus.cljs @@ -0,0 +1,9 @@ +(ns status-im.test.ethereum.stateofus + (:require [cljs.test :refer-macros [deftest is testing]] + [status-im.ethereum.stateofus :as stateofus])) + +(deftest valid-username? + (is (false? (stateofus/valid-username? nil))) + (is (true? (stateofus/valid-username? "andrey"))) + (is (false? (stateofus/valid-username? "Andrey"))) + (is (true? (stateofus/valid-username? "andrey12")))) diff --git a/test/cljs/status_im/test/runner.cljs b/test/cljs/status_im/test/runner.cljs index 547013ed79..b37ba896a9 100644 --- a/test/cljs/status_im/test/runner.cljs +++ b/test/cljs/status_im/test/runner.cljs @@ -26,6 +26,7 @@ [status-im.test.ethereum.ens] [status-im.test.ethereum.mnemonic] [status-im.test.extensions.core] + [status-im.test.ethereum.stateofus] [status-im.test.extensions.ethereum] [status-im.test.fleet.core] [status-im.test.group-chats.core] @@ -105,6 +106,7 @@ 'status-im.test.ethereum.eip681 'status-im.test.ethereum.ens 'status-im.test.ethereum.mnemonic + 'status-im.test.ethereum.stateofus 'status-im.test.extensions.core 'status-im.test.extensions.ethereum 'status-im.test.fleet.core diff --git a/translations/en.json b/translations/en.json index 7fd03bdec6..3cbd77924e 100644 --- a/translations/en.json +++ b/translations/en.json @@ -294,6 +294,7 @@ "network-id": "Network ID", "connection-problem": "Messages connection problem", "contact-code": "Contact code", + "key": "Key", "enter-ens-or-contact-code": "Enter ENS username or contact code", "transactions-delete-content": "Transaction will be removed from 'Unsigned' list", "home": "Home", @@ -1073,5 +1074,68 @@ "signing-phrase" : "Signing phrase", "network-fee" : "Network fee", "sign-with-password" : "Sign with password", - "signing-a-message" : "Signing a message" + "signing-a-message" : "Signing a message", + "etherscan-lookup": "Look up on Etherscan", + "retry": "Retry", + "ens-deposit": "Deposit", + "ens-register": "Register", + "ens-wallet-address": "Wallet address", + "ens-terms-registration": "Terms of name registration.", + "ens-terms-header": "Terms of name registration", + "ens-terms-point-1": "Funds are deposited for 1 year. Your SNT will be locked, but not spent.", + "ens-terms-point-2": "After 1 year, you can release the name and get your deposit back, or take no action to keep the name.", + "ens-terms-point-3": "If terms of the contract change — e.g. Status makes contract upgrades — user has the right to release the username regardless of time held.", + "ens-terms-point-4": "The contract controller cannot access your deposited funds. They can only be moved back to the address that sent them.", + "ens-terms-point-5": "Your address(es) will be publicly associated with your ENS name.", + "ens-terms-point-6": "Usernames are created as subdomain nodes of stateofus.eth and are subject to the ENS smart contract terms.", + "ens-terms-point-7": "You authorize the contract to transfer SNT on your behalf. This can only occur when you approve a transaction to authorize the transfer.", + "ens-terms-point-8": "These terms are guaranteed by the smart contract logic at addresses:", + "ens-terms-point-9": "{{address}} (Status UsernameRegistrar) ", + "ens-terms-point-10": "0x314159265dd8dbb310642f98f50c066173c1259b (ENS Registry).", + "ens-usernames": "ENS usernames", + "ens-your-username": "Your username", + "ens-your-your-name": "Your ENS name", + "ens-usernames-details": "Register a universal username to be easily recognized by other users", + "ens-network-restriction": "Only available on Mainnet or ropsten", + "ens-custom-domain": "Custom domain", + "ens-want-domain": "I want a stateofus.eth domain", + "ens-want-custom-domain": "I own a name on another domain", + "ens-got-it": "Ok, got it", + "ens-agree-to": "Agree to ", + "ens-10-SNT": "10 SNT", + "ens-username-hints": "At least 4 characters. Latin letters, numbers, and lowercase only.", + "ens-username-invalid": "Letters and numbers only", + "ens-username-registrable": "✓ Username available!", + "ens-username-unregistrable": "Username already taken:(", + "ens-username-owned": "✓ Username is owned by you. ", + "ens-username-owned-continue": "Continuing will connect this username with your key.", + "ens-username-connected": "This user name is owned by you and connected with your Chat key.", + "ens-custom-username-unregistrable": "Username doesn’t belong to you :(", + "ens-custom-username-hints": "Type the entire username including the custom domain like username.domain.eth", + "ens-welcome-hints": "ENS names transform those crazy-long addresses into unique usernames.", + "ens-welcome-point-1-title": "Simplify your ETH address", + "ens-welcome-point-1": "Your complex wallet address (0x...) becomes an easy to read, remember & share URL: ", + "ens-welcome-point-2-title": "10 SNT to register", + "ens-welcome-point-2": "Register once to keep the name forever. After 1 year, you can release the name and get your SNT back.", + "ens-welcome-point-3-title": "Connect & get paid", + "ens-welcome-point-3": "Share your name to chat on Status or receive ETH and tokens", + "ens-welcome-point-4-title": "Already own a username?", + "ens-welcome-point-4": "You can verify and add any usernames you own in the next steps.", + "ens-get-name": "Get a universal username", + "ens-registered-title": "Nice!\nThe name is yours once the transaction is complete.", + "ens-saved-title": "Username added", + "ens-registration-failed-title": "Transaction failed", + "ens-registered": "You can follow the progress in the Transaction History section of your wallet.", + "ens-saved": " is now connected with your key and can be used in Status.", + "ens-registration-failed": "To register the username, please try again.", + "ens-powered-by": "Powered by Ethereum Name Services", + "ens-add-username": "Add username", + "ens-remove-username": "Remove username", + "ens-remove-hints": "Removing will detach the username from your key.", + "ens-locked": "Username locked. You won’t be able to release it until 25.05.2020", + "ens-release-username": "Release username", + "ens-your-usernames": "Your usernames", + "ens-no-usernames": "You don't have any username connected", + "ens-understand": "I understand that my wallet address will be publicly connected to my username.", + "ens-transaction-pending": "Transaction pending..." }