From 24068fe0e9a8932c3caffc8b226fa1f7fd146808 Mon Sep 17 00:00:00 2001 From: Goran Jovic Date: Wed, 10 Oct 2018 13:07:48 +0200 Subject: [PATCH] feature #6239 - showing native currency symbol differently for non-mainnet chains Signed-off-by: Goran Jovic --- resources/images/assets/ethereum.png | Bin 18718 -> 0 bytes resources/images/tokens/default-native.png | Bin 0 -> 836 bytes resources/images/tokens/default-native@2x.png | Bin 0 -> 1970 bytes resources/images/tokens/default-native@3x.png | Bin 0 -> 3382 bytes .../tokens/{default.png => default-token.png} | Bin .../{default@2x.png => default-token@2x.png} | Bin .../{default@3x.png => default-token@3x.png} | Bin resources/images/tokens/mainnet/0-native.png | Bin 0 -> 836 bytes .../images/tokens/mainnet/0-native@2x.png | Bin 0 -> 1970 bytes .../images/tokens/mainnet/0-native@3x.png | Bin 0 -> 3382 bytes resources/images/tokens/testnet/0-native.png | Bin 0 -> 836 bytes .../images/tokens/testnet/0-native@2x.png | Bin 0 -> 1970 bytes .../images/tokens/testnet/0-native@3x.png | Bin 0 -> 3382 bytes .../chat/commands/impl/transactions.cljs | 37 ++++++------ src/status_im/react_native/resources.cljs | 3 - .../ui/screens/wallet/components/views.cljs | 8 +-- .../ui/screens/wallet/main/views.cljs | 4 +- .../ui/screens/wallet/request/views.cljs | 6 +- .../ui/screens/wallet/send/views.cljs | 17 +++--- src/status_im/ui/screens/wallet/subs.cljs | 7 ++- .../screens/wallet/transaction_fee/views.cljs | 15 +++-- .../ui/screens/wallet/transactions/subs.cljs | 12 ++-- .../ui/screens/wallet/transactions/views.cljs | 37 ++++++------ src/status_im/ui/screens/wallet/utils.cljs | 5 +- src/status_im/utils/ethereum/macros.clj | 24 ++++++-- src/status_im/utils/ethereum/tokens.cljs | 54 +++++++++++++----- src/status_im/utils/money.cljs | 6 +- 27 files changed, 149 insertions(+), 86 deletions(-) delete mode 100644 resources/images/assets/ethereum.png create mode 100644 resources/images/tokens/default-native.png create mode 100644 resources/images/tokens/default-native@2x.png create mode 100644 resources/images/tokens/default-native@3x.png rename resources/images/tokens/{default.png => default-token.png} (100%) rename resources/images/tokens/{default@2x.png => default-token@2x.png} (100%) rename resources/images/tokens/{default@3x.png => default-token@3x.png} (100%) create mode 100644 resources/images/tokens/mainnet/0-native.png create mode 100644 resources/images/tokens/mainnet/0-native@2x.png create mode 100644 resources/images/tokens/mainnet/0-native@3x.png create mode 100644 resources/images/tokens/testnet/0-native.png create mode 100644 resources/images/tokens/testnet/0-native@2x.png create mode 100644 resources/images/tokens/testnet/0-native@3x.png diff --git a/resources/images/assets/ethereum.png b/resources/images/assets/ethereum.png deleted file mode 100644 index 1a6146c2ec617d86b40b03b43b2e6fcd6ec6718f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18718 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 diff --git a/resources/images/tokens/default-native.png b/resources/images/tokens/default-native.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3c3b809bfca188af6b94fa7d162c5da61b6850 GIT binary patch literal 836 zcmV-K1H1f*P)6k!<0zwgX!GrDB{0MT%SP?tQEvw90dtV>3?-aJJAKp=H3-P6phbVvgR~6=yv7V}({&r9gJKU{!Eq-nWCUEL0wLm)$wc=QOgOj*U0V^>VY~_1aV9(D2A&lc#AhpEkLC8B#U9 z$Fi(;j^o=EueZlG0t15q003j`ZF(*Jt+cl0ERfIDz}(y%R84;d;I_-yc)icI+O~WY875fMLpp;JiZ=X^+ zm5aEX1*)2U7eMEkG43yOoh^!Tuiyf8Z7>}SGXNk60#d0IR#rktCX=9+l__=_0K8cS z49UTJBZ442ipS&F-VP%gjY5$$N?)v*=Hr41oOw5UWqEli z5)N-+e}5l>Ae^KGK|pwO6FkqSJq%G4ajCo<)z#Gv3-j}lf~1+65Uk>0f=_zTK5jhyxJ($I)Os9_M6P-cuAMWE#d+Hi44W8`Lx%Af%R3 z`W?VhWo1?G#Kic;Qn&m4=K4AaA-#3 zAL#D`fEGo01>oW74<4ANIbF1|Qq}YijIlcaAW2dp7<@xSQLH%K{R43zQ?fPX}JCRPRD0HjPv}&}0 z6-KvavAv04Ux%=%>&vutUDZO?5BoI1zHEFLZK0Zo6MXHI36kbTMWI!LorHw=E;#o- z`+yyFd24{mxr@(FvSj(5d;IwC=Q-y&Z&$&sK>!{E@F;-)02o1$A#U;hdvXGv2hazA zrGN{k0)QXD5P+^?6z^6AT%HTtP5={-+%RfRM3PcSBoc{4B9TZW5{X12kt_ucwHz+1 zTEG4_C)=nx**GHlHMdTcv;t5Doyq%zpw< zl6$=c0RQgqcbtHV(+oO!@}G$4(Ryayr6>xL$s~jjD_5*oarvWUvR$@;^LbxH2NT_H z+jhhBYs}oB`Fww2=AndP$Pk{5P$&p6H{kkm>2&U4=0+!p=QsiNX!9m!-Z$5EW`4oz z^=_6SJdLe&ucEegyu`BXFaY;FMcn|xUZ3xAGn2`5UAQ1UP>(j_Z^!q-vhV~mfAh=A zGq45B-|M5$6ecQIH z48wp|(~3{PP$-ZS0#N{EH&I0yfMx(l6r%?MKscg51>o_Uy`PyM^J>}-0H~?0EuJlgZV@Tu#%Zy>`W%%t*R=HG$tI;Ynb`Wj4avh#@N_ZT)g-RE?)curfK5i?ryj} z9+Z}pptQ6UF1H(&WzF;iA--Y6<7bw%fDt_kV)EFqW6Zoh?{NTNnkM@CdND9CfbsEh z2qB=TDn9P&f)E1C3{_Q8Qd)}TWo1wmWx8i}3L*T=JW}YQvFVt@;*o5ktwlm_=z^ARfy}g=Y#L?Z|4bwEII*nQXT_G@(PS4vDTb70K@$u_* z3E}d1JZslgRsFTEx3?gh-V2t-y!P7f?&$CDyVo>LsOne$wb^VI=~N0M!^5kF(&;+@ z3@*74-r)5vbGzN&X6CnX{g}l34fFy+_zMgX(T^r4Cr^xwjF?NV6KM+T;>jnsS?#gd zF(JfCB5DON_7zk;2B1|@l)F=@)UkV4ueLOwPb@hBRT3^C=qF)4x*^uqmT8a0c9IZ& z0#4j~{Ll#i{&YIMb8v7l2ho&8bxCC;)gh?dxFP529TFHYNt(h~iRbn1Vdf478UXA_7)Ey?r?(2~fzgPLKq!cCME`Ss4v>gG zAfo-{2$jL;YS`3SFT*qnE7P@`DK82 zlZnJLKA#WqczkJ(h2MPn5A=CvsDqjFiy9^o9amhg`ar`=!~RX16wYS12t|3L>->4B zs`?x=pH8RKmRHkmXXf7nr~~k|Tw7?|W?9vzJ39-0;IZJdF^8L5@Z4=@F={d8w1 zKU7^^B(pKPj$a0Y2uJii%>4Q+Q(8Sj5zhu28$ZZ(65nFxw*ah}rR)m{!+2fOG%Uv2 z$fB>xMfB(~+qUcG80Y?`we^TlRoDL6vlu#_FpMV_(|)mt!sXxYCZZwCa$uX8f5wd2 z#N*t^V|UI&i%-B%Fo5Qk7KDOWz5(Qtif#i@K=fn8VWHi2e#Q@BQLu zb1tj{uO<_TeNM335u1w+?E5K5h$a9F+3a#&QIw`N_uU66V1Ar@*Ift&8i$3V>>{G< zJVhso=(+gWv%?h?6;i;d_VA^jBNA;!DA0HczyZwu1P}(%uM&oF%ByKO+tJ|&0Uh>tt*#GNF)-8L?V$$Boc{4B9TZW5{X3eUvGm88AY|E#Q*>R07*qoM6N<$ Ef_qKAjQ{`u literal 0 HcmV?d00001 diff --git a/resources/images/tokens/default-native@3x.png b/resources/images/tokens/default-native@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8baab40e0fb0c9ca8dbee11167b45dbbb0a7eb9e GIT binary patch literal 3382 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 literal 0 HcmV?d00001 diff --git a/resources/images/tokens/default.png b/resources/images/tokens/default-token.png similarity index 100% rename from resources/images/tokens/default.png rename to resources/images/tokens/default-token.png diff --git a/resources/images/tokens/default@2x.png b/resources/images/tokens/default-token@2x.png similarity index 100% rename from resources/images/tokens/default@2x.png rename to resources/images/tokens/default-token@2x.png diff --git a/resources/images/tokens/default@3x.png b/resources/images/tokens/default-token@3x.png similarity index 100% rename from resources/images/tokens/default@3x.png rename to resources/images/tokens/default-token@3x.png diff --git a/resources/images/tokens/mainnet/0-native.png b/resources/images/tokens/mainnet/0-native.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3c3b809bfca188af6b94fa7d162c5da61b6850 GIT binary patch literal 836 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 Ef_qKAjQ{`u literal 0 HcmV?d00001 diff --git a/resources/images/tokens/mainnet/0-native@3x.png b/resources/images/tokens/mainnet/0-native@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8baab40e0fb0c9ca8dbee11167b45dbbb0a7eb9e GIT binary patch literal 3382 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 literal 0 HcmV?d00001 diff --git a/resources/images/tokens/testnet/0-native.png b/resources/images/tokens/testnet/0-native.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3c3b809bfca188af6b94fa7d162c5da61b6850 GIT binary patch literal 836 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 Ef_qKAjQ{`u literal 0 HcmV?d00001 diff --git a/resources/images/tokens/testnet/0-native@3x.png b/resources/images/tokens/testnet/0-native@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8baab40e0fb0c9ca8dbee11167b45dbbb0a7eb9e GIT binary patch literal 3382 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 literal 0 HcmV?d00001 diff --git a/src/status_im/chat/commands/impl/transactions.cljs b/src/status_im/chat/commands/impl/transactions.cljs index 0aa4161d32..ab525d31f8 100644 --- a/src/status_im/chat/commands/impl/transactions.cljs +++ b/src/status_im/chat/commands/impl/transactions.cljs @@ -26,19 +26,21 @@ [status-im.ui.screens.currency-settings.subs :as currency-settings.subs] [status-im.models.transactions :as wallet.transactions] [status-im.ui.screens.navigation :as navigation] - status-im.chat.commands.impl.transactions.subs)) + status-im.chat.commands.impl.transactions.subs + [status-im.ui.screens.wallet.utils :as wallet.utils])) ;; common `send/request` functionality (defn- render-asset [selected-event-creator] (fn [{:keys [name symbol amount decimals] :as asset}] [react/touchable-highlight - {:on-press #(re-frame/dispatch (selected-event-creator (clojure.core/name symbol)))} + {:on-press #(re-frame/dispatch (selected-event-creator (wallet.utils/display-symbol asset)))} [react/view transactions-styles/asset-container [react/view transactions-styles/asset-main [react/image {:source (-> asset :icon :source) :style transactions-styles/asset-icon}] - [react/text {:style transactions-styles/asset-symbol} symbol] + [react/text {:style transactions-styles/asset-symbol} + (wallet.utils/display-symbol asset)] [react/text {:style transactions-styles/asset-name} name]] ;;TODO(goranjovic) : temporarily disabled to fix https://github.com/status-im/status-react/issues/4963 ;;until the resolution of https://github.com/status-im/status-react/issues/4972 @@ -85,10 +87,11 @@ (defn personal-send-request-short-preview [label-key {:keys [content]}] - (let [{:keys [amount asset]} (:params content)] + (let [{:keys [amount asset network]} (:params content) + token (tokens/asset-for (keyword network) (keyword asset))] [chat-preview/text {} (i18n/label label-key {:amount (i18n/label-number amount) - :asset asset})])) + :asset (wallet.utils/display-symbol token)})])) (def personal-send-request-params [{:id :asset @@ -143,9 +146,10 @@ ;; because balances are only fetched for them. Revisit this decision with regard to battery/network consequences ;; if we were to update all balances. (defn- allowed-assets [{:account/keys [account] :keys [chain]}] - (let [chain-keyword (keyword chain) - visible-tokens (get-in account [:settings :wallet :visible-tokens chain-keyword])] - (into {"ETH" 18} + (let [chain-keyword (keyword chain) + {:keys [symbol symbol-display decimals]} (tokens/native-currency chain-keyword) + visible-tokens (get-in account [:settings :wallet :visible-tokens chain-keyword])] + (into {(name (or symbol-display symbol)) decimals} (comp (filter #(and (not (:nft? %)) (contains? visible-tokens (:symbol %)))) (map (juxt (comp name :symbol) :decimals))) @@ -208,7 +212,8 @@ (letsubs [network [:network-name]] (let [{{:keys [amount fiat-amount tx-hash asset currency] send-network :network} :params} content recipient-name (get-in content [:params :bot-db :public :recipient]) - network-mismatch? (and (seq send-network) (not= network send-network))] + network-mismatch? (and (seq send-network) (not= network send-network)) + token (tokens/asset-for (keyword send-network) (keyword asset))] [react/view transactions-styles/command-send-message-view [react/view [react/view transactions-styles/command-send-amount-row @@ -220,7 +225,7 @@ "."] [react/text {:style (transactions-styles/command-send-currency-text outgoing) :font :default} - asset]]]] + (wallet.utils/display-symbol token)]]]] (when (and fiat-amount platform/mobile?) [react/view transactions-styles/command-send-fiat-amount @@ -297,12 +302,12 @@ (let [recipient-contact (get-in db [:contacts/contacts (:current-chat-id db)]) sender-account (:account/account db) chain (keyword (:chain db)) - symbol (keyword asset) - {:keys [decimals]} (tokens/asset-for chain symbol) - {:keys [value error]} (wallet.db/parse-amount amount decimals) - next-view-id (if (:wallet-set-up-passed? sender-account) - :wallet-send-transaction-modal - :wallet-onboarding-setup)] + symbol-param (keyword asset) + {:keys [symbol decimals]} (tokens/asset-for chain symbol-param) + {:keys [value error]} (wallet.db/parse-amount amount decimals) + next-view-id (if (:wallet-set-up-passed? sender-account) + :wallet-send-transaction-modal + :wallet-onboarding-setup)] (fx/merge cofx {:db (-> db (update-in [:wallet :send-transaction] diff --git a/src/status_im/react_native/resources.cljs b/src/status_im/react_native/resources.cljs index 6c3ccb9058..6c0f5f247e 100644 --- a/src/status_im/react_native/resources.cljs +++ b/src/status_im/react_native/resources.cljs @@ -47,9 +47,6 @@ :console (js/require "./resources/images/contacts/console.png")}) -(def assets - {:ethereum (js/require "./resources/images/assets/ethereum.png")}) - (def ui {:empty-hashtags (js/require "./resources/images/ui/empty-hashtags.png") :empty-recent (js/require "./resources/images/ui/empty-recent.png") diff --git a/src/status_im/ui/screens/wallet/components/views.cljs b/src/status_im/ui/screens/wallet/components/views.cljs index a8f4a81e45..c2bc77cbf6 100644 --- a/src/status_im/ui/screens/wallet/components/views.cljs +++ b/src/status_im/ui/screens/wallet/components/views.cljs @@ -116,7 +116,7 @@ :request :wallet.request/set-symbol (throw (str "Unknown type: " k)))) -(defn- render-token [{:keys [symbol name icon decimals amount]} type] +(defn- render-token [{:keys [symbol name icon decimals amount] :as token} type] [list/touchable-item #(do (re-frame/dispatch [(type->handler type) symbol]) (re-frame/dispatch [:navigate-back])) [react/view @@ -127,7 +127,7 @@ [react/text {:style styles/text-list-primary-content} name] [react/text {:force-uppercase? true} - (clojure.core/name symbol)]] + (wallet.utils/display-symbol token)]] [list/item-secondary (wallet.utils/format-amount amount decimals)]]]]]) (views/defview assets [type] @@ -155,7 +155,7 @@ (views/defview asset-selector [{:keys [disabled? type symbol error]}] (views/letsubs [balance [:balance] network [:network]] - (let [{:keys [name icon decimals]} (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] + (let [{:keys [name icon decimals] :as token} (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] (when name [react/view [cartouche {:disabled? disabled? :on-press #(re-frame/dispatch [:navigate-to (type->view type)])} @@ -168,7 +168,7 @@ [react/text {:style (merge styles/text-content styles/asset-label)} name] [react/text {:style styles/text-secondary-content} - (clojure.core/name symbol)]] + (wallet.utils/display-symbol token)]] [react/text {:style (merge styles/text-secondary-content styles/asset-label)} (str (wallet.utils/format-amount (get balance symbol) decimals))]]]] (when error diff --git a/src/status_im/ui/screens/wallet/main/views.cljs b/src/status_im/ui/screens/wallet/main/views.cljs index 11777b8e98..70e98dbee1 100644 --- a/src/status_im/ui/screens/wallet/main/views.cljs +++ b/src/status_im/ui/screens/wallet/main/views.cljs @@ -89,7 +89,7 @@ :action #(re-frame/dispatch [:navigate-to :transactions-history])}]) (defn- render-asset [currency] - (fn [{:keys [symbol icon decimals amount]}] + (fn [{:keys [symbol symbol-display icon decimals amount] :as token}] (let [asset-value (re-frame/subscribe [:asset-value symbol decimals (-> currency :code keyword)])] [react/view {:style styles/asset-item-container} [list/item @@ -103,7 +103,7 @@ [react/text {:style styles/asset-item-currency :uppercase? true :number-of-lines 1} - (clojure.core/name symbol)]] + (wallet.utils/display-symbol token)]] [react/text {:style styles/asset-item-price :uppercase? true :number-of-lines 1} diff --git a/src/status_im/ui/screens/wallet/request/views.cljs b/src/status_im/ui/screens/wallet/request/views.cljs index b5dde27545..9886eb833a 100644 --- a/src/status_im/ui/screens/wallet/request/views.cljs +++ b/src/status_im/ui/screens/wallet/request/views.cljs @@ -20,7 +20,8 @@ [status-im.utils.ethereum.core :as ethereum] [status-im.utils.ethereum.eip681 :as eip681] [status-im.utils.utils :as utils] - [status-im.utils.ethereum.tokens :as tokens])) + [status-im.utils.ethereum.tokens :as tokens] + [status-im.ui.screens.wallet.utils :as wallet.utils])) ;; Request screen @@ -56,7 +57,8 @@ [bottom-buttons/bottom-buttons styles/bottom-buttons nil ;; Force a phantom button to ensure consistency with other transaction screens which define 2 buttons [button/button {:disabled? (or amount-error (not (and to amount))) - :on-press #(re-frame/dispatch [:wallet-send-request whisper-identity amount symbol decimals]) + :on-press #(re-frame/dispatch [:wallet-send-request whisper-identity amount + (wallet.utils/display-symbol token) decimals]) :text-style {:padding-horizontal 0} :accessibility-label :sent-request-button} (i18n/label :t/send-request) diff --git a/src/status_im/ui/screens/wallet/send/views.cljs b/src/status_im/ui/screens/wallet/send/views.cljs index b817f47e82..6004f08c0e 100644 --- a/src/status_im/ui/screens/wallet/send/views.cljs +++ b/src/status_im/ui/screens/wallet/send/views.cljs @@ -28,7 +28,8 @@ [status-im.transport.utils :as transport.utils] [taoensso.timbre :as log] [reagent.core :as reagent] - [status-im.ui.components.colors :as colors])) + [status-im.ui.components.colors :as colors] + [status-im.ui.screens.wallet.utils :as wallet.utils])) (defn- toolbar [modal? title] (let [action (if modal? actions/close-white actions/back-white)] @@ -38,7 +39,7 @@ #(actions/default-handler)))] [toolbar/content-title {:color :white} title]])) -(defn- advanced-cartouche [{:keys [max-fee gas gas-price]}] +(defn- advanced-cartouche [native-currency {:keys [max-fee gas gas-price]}] [react/view [wallet.components/cartouche {:on-press #(do (re-frame/dispatch [:wallet.send/clear-gas]) (re-frame/dispatch [:navigate-to :wallet-transaction-fee]))} @@ -46,11 +47,11 @@ [react/view {:style styles/advanced-options-text-wrapper :accessibility-label :transaction-fee-button} [react/text {:style styles/advanced-fees-text} - (str max-fee " " (i18n/label :t/eth))] + (str max-fee " " (wallet.utils/display-symbol native-currency))] [react/text {:style styles/advanced-fees-details-text} (str (money/to-fixed gas) " * " (money/to-fixed (money/wei-> :gwei gas-price)) (i18n/label :t/gwei))]]]]) -(defn- advanced-options [advanced? transaction scroll] +(defn- advanced-options [advanced? native-currency transaction scroll] [react/view {:style styles/advanced-wrapper} [react/touchable-highlight {:on-press (fn [] (re-frame/dispatch [:wallet.send/toggle-advanced (not advanced?)]) @@ -63,7 +64,7 @@ :key :wallet-advanced}] [vector-icons/icon (if advanced? :icons/up :icons/down) {:color :white}]]]] (when advanced? - [advanced-cartouche transaction])]) + [advanced-cartouche native-currency transaction])]) (defview password-input-panel [message-label spinning?] (letsubs [account [:get-current-account] @@ -140,7 +141,9 @@ (defn- render-send-transaction-view [{:keys [modal? transaction scroll advanced? network amount-input network-status]}] (let [{:keys [amount amount-text amount-error asset-error show-password-input? to to-name sufficient-funds? sufficient-gas? in-progress? from-chat? symbol]} transaction - {:keys [decimals] :as token} (tokens/asset-for (ethereum/network->chain-keyword network) symbol) + chain (ethereum/network->chain-keyword network) + native-currency (tokens/native-currency chain) + {:keys [decimals] :as token} (tokens/asset-for chain symbol) online? (= :online network-status)] [wallet.components/simple-screen {:avoid-keyboard? (not modal?) :status-bar-type (if modal? :modal-wallet :wallet)} @@ -170,7 +173,7 @@ :amount-text amount-text :input-options {:on-change-text #(re-frame/dispatch [:wallet.send/set-and-validate-amount % symbol decimals]) :ref (partial reset! amount-input)}} token] - [advanced-options advanced? transaction scroll]]] + [advanced-options advanced? native-currency transaction scroll]]] (if show-password-input? [enter-password-buttons in-progress? #(re-frame/dispatch [:wallet/cancel-entering-password]) diff --git a/src/status_im/ui/screens/wallet/subs.cljs b/src/status_im/ui/screens/wallet/subs.cljs index d58a7aac6b..3b0b351777 100644 --- a/src/status_im/ui/screens/wallet/subs.cljs +++ b/src/status_im/ui/screens/wallet/subs.cljs @@ -103,9 +103,10 @@ :<- [:network] :<- [:wallet/visible-tokens-symbols] (fn [[network visible-tokens-symbols]] - (conj (filter #(contains? visible-tokens-symbols (:symbol %)) - (tokens/sorted-tokens-for (ethereum/network->chain-keyword network))) - tokens/ethereum))) + (let [chain (ethereum/network->chain-keyword network)] + (conj (filter #(contains? visible-tokens-symbols (:symbol %)) + (tokens/sorted-tokens-for (ethereum/network->chain-keyword network))) + (tokens/native-currency chain))))) (re-frame/reg-sub :wallet/visible-assets-with-amount :<- [:balance] diff --git a/src/status_im/ui/screens/wallet/transaction_fee/views.cljs b/src/status_im/ui/screens/wallet/transaction_fee/views.cljs index 0420a8bca5..21e5e20d21 100644 --- a/src/status_im/ui/screens/wallet/transaction_fee/views.cljs +++ b/src/status_im/ui/screens/wallet/transaction_fee/views.cljs @@ -14,7 +14,8 @@ [status-im.ui.screens.wallet.styles :as wallet.styles] [status-im.utils.money :as money] [status-im.utils.ethereum.tokens :as tokens] - [status-im.utils.ethereum.core :as ethereum])) + [status-im.utils.ethereum.core :as ethereum] + [status-im.ui.screens.wallet.utils :as wallet.utils])) (defn- toolbar [title] [toolbar/toolbar {:style wallet.styles/toolbar} @@ -28,9 +29,11 @@ max-fee :max-fee gas-price-edit :gas-price} [:wallet/edit]] (let [{:keys [amount symbol]} send-transaction - gas (:value gas-edit) - gas-price (:value gas-price-edit) - {:keys [decimals]} (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] + gas (:value gas-edit) + gas-price (:value gas-price-edit) + chain (ethereum/network->chain-keyword network) + native-currency (tokens/native-currency chain) + {:keys [decimals] :as token} (tokens/asset-for chain symbol)] [components/simple-screen {:status-bar-type :modal-wallet} [toolbar (i18n/label :t/wallet-transaction-fee)] [react/view components.styles/flex @@ -77,12 +80,12 @@ [react/view {:accessibility-label :amount-input} [components/cartouche-text-content (str (money/to-fixed (money/internal->formatted amount symbol decimals))) - (name symbol)]]] + (wallet.utils/display-symbol token)]]] [components/cartouche {:disabled? true} (i18n/label :t/wallet-transaction-total-fee) [react/view {:accessibility-label :total-fee-input} [components/cartouche-text-content - (str max-fee " " (i18n/label :t/eth))]]]] + (str max-fee " " (wallet.utils/display-symbol native-currency))]]]] [bottom-buttons/bottom-buttons styles/fee-buttons [button/button {:on-press #(re-frame/dispatch [:wallet.send/reset-gas-default]) diff --git a/src/status_im/ui/screens/wallet/transactions/subs.cljs b/src/status_im/ui/screens/wallet/transactions/subs.cljs index c409e22ddd..703a8f160a 100644 --- a/src/status_im/ui/screens/wallet/transactions/subs.cljs +++ b/src/status_im/ui/screens/wallet/transactions/subs.cljs @@ -5,7 +5,9 @@ [status-im.utils.hex :as utils.hex] [status-im.utils.money :as money] [status-im.utils.transactions :as transactions] - [status-im.utils.ethereum.core :as ethereum])) + [status-im.utils.ethereum.core :as ethereum] + [status-im.utils.ethereum.tokens :as tokens] + [status-im.ui.screens.wallet.utils :as wallet.utils])) (reg-sub :wallet.transactions/transactions-loading? :<- [:wallet] @@ -92,10 +94,12 @@ :<- [:network] (fn [[transactions current-transaction network]] (let [{:keys [gas-used gas-price hash timestamp type] :as transaction} (get transactions current-transaction) - chain (ethereum/network->chain-keyword network)] + chain (ethereum/network->chain-keyword network) + native-currency (tokens/native-currency chain) + display-unit (wallet.utils/display-symbol native-currency)] (when transaction (merge transaction - {:gas-price-eth (if gas-price (money/wei->str :eth gas-price) "-") + {:gas-price-eth (if gas-price (money/wei->str :eth gas-price display-unit) "-") :gas-price-gwei (if gas-price (money/wei->str :gwei gas-price) "-") :date (datetime/timestamp->long-date timestamp)} (if (= type :unsigned) @@ -106,7 +110,7 @@ :nonce (i18n/label :not-applicable) :hash (i18n/label :not-applicable)} {:cost (when gas-used - (money/wei->str :eth (money/fee-value gas-used gas-price))) + (money/wei->str :eth (money/fee-value gas-used gas-price) display-unit)) :url (transactions/get-transaction-details-url chain hash)})))))) (reg-sub :wallet.transactions.details/confirmations diff --git a/src/status_im/ui/screens/wallet/transactions/views.cljs b/src/status_im/ui/screens/wallet/transactions/views.cljs index 127a3df670..f626a6b982 100644 --- a/src/status_im/ui/screens/wallet/transactions/views.cljs +++ b/src/status_im/ui/screens/wallet/transactions/views.cljs @@ -13,7 +13,8 @@ [status-im.ui.screens.wallet.transactions.styles :as styles] [status-im.utils.money :as money] [status-im.utils.ethereum.tokens :as tokens] - [status-im.utils.ethereum.core :as ethereum])) + [status-im.utils.ethereum.core :as ethereum] + [status-im.ui.screens.wallet.utils :as wallet.utils])) (defn history-action [filter?] (cond-> @@ -55,7 +56,7 @@ address-accessibility-label] (if (inbound? type) [(i18n/label :t/from) from-contact from :sender-text :sender-address-text] [(i18n/label :t/to) to-contact to :recipient-name-text :recipient-address-text]) - {:keys [decimals]} (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] + {:keys [decimals] :as token} (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] [list/touchable-item #(when-not hide-details? (re-frame/dispatch [:show-transaction-details hash])) [react/view {:accessibility-label :transaction-item} [list/item @@ -70,7 +71,7 @@ (-> value (money/internal->formatted symbol decimals) money/to-fixed str)] " " [react/text {:accessibility-label :currency-text} - (clojure.string/upper-case (name symbol))]] + (wallet.utils/display-symbol token)]] [react/text {:style styles/tx-time} time-formatted]] [react/view {:style styles/address-row} @@ -162,18 +163,19 @@ (-> amount (money/token->unit (:decimals token)) money/to-fixed str)) "...")) -(defn details-header [{:keys [value date type symbol token]}] - [react/view {:style styles/details-header} - [react/view {:style styles/details-header-icon} - [list/item-icon (transaction-type->icon type)]] - [react/view {:style styles/details-header-infos} - [react/text {:style styles/details-header-value} - [react/text {:accessibility-label :amount-text} - (pretty-print-asset symbol value token)] - " " - [react/text {:accessibility-label :currency-text} - (clojure.string/upper-case (name symbol))]] - [react/text {:style styles/details-header-date} date]]]) +(defn details-header [network {:keys [value date type symbol token]}] + (let [asset (tokens/asset-for (ethereum/network->chain-keyword network) symbol)] + [react/view {:style styles/details-header} + [react/view {:style styles/details-header-icon} + [list/item-icon (transaction-type->icon type)]] + [react/view {:style styles/details-header-infos} + [react/text {:style styles/details-header-value} + [react/text {:accessibility-label :amount-text} + (pretty-print-asset symbol value token)] + " " + [react/text {:accessibility-label :currency-text} + (wallet.utils/display-symbol asset)]] + [react/text {:style styles/details-header-date} date]]])) (defn progress-bar [progress failed?] [react/view {:style styles/progress-bar} @@ -242,7 +244,8 @@ (defview transaction-details [] (letsubs [{:keys [hash url type] :as transaction} [:wallet.transactions/transaction-details] confirmations [:wallet.transactions.details/confirmations] - confirmations-progress [:wallet.transactions.details/confirmations-progress]] + confirmations-progress [:wallet.transactions.details/confirmations-progress] + network [:get-current-account-network]] [react/view {:style components.styles/flex} [status-bar/status-bar] [toolbar/toolbar {} @@ -250,7 +253,7 @@ [toolbar/content-title (i18n/label :t/transaction-details)] (when transaction [toolbar/actions (details-action hash url)])] [react/scroll-view {:style components.styles/main-container} - [details-header transaction] + [details-header network transaction] [details-confirmations confirmations confirmations-progress type] [react/view {:style styles/details-separator}] [details-list transaction]]])) diff --git a/src/status_im/ui/screens/wallet/utils.cljs b/src/status_im/ui/screens/wallet/utils.cljs index e6c0bf8efb..3a91246605 100644 --- a/src/status_im/ui/screens/wallet/utils.cljs +++ b/src/status_im/ui/screens/wallet/utils.cljs @@ -5,4 +5,7 @@ (-> amount (or (money/bignumber 0)) (money/token->unit decimals) - money/to-fixed)) \ No newline at end of file + money/to-fixed)) + +(defn display-symbol [{:keys [symbol-display symbol]}] + (clojure.core/name (or symbol-display symbol))) \ No newline at end of file diff --git a/src/status_im/utils/ethereum/macros.clj b/src/status_im/utils/ethereum/macros.clj index 24cebaf5e7..64de746e3b 100644 --- a/src/status_im/utils/ethereum/macros.clj +++ b/src/status_im/utils/ethereum/macros.clj @@ -2,20 +2,36 @@ (:require [clojure.string :as string] [clojure.java.io :as io])) -(defn icon-path +(defn token-icon-path [network symbol] (let [s (str "./resources/images/tokens/" (name network) "/" (name symbol) ".png")] (if (.exists (io/file s)) `(js/require ~s) - `(js/require "./resources/images/tokens/default.png")))) + `(js/require "./resources/images/tokens/default-token.png")))) (defn- token->icon [network {:keys [icon symbol]}] ;; Tokens can define their own icons. ;; If not try to make one using a local image as resource, if it does not exist fallback to default. - (or icon (icon-path network symbol))) + (or icon (token-icon-path network symbol))) (defmacro resolve-icons "In react-native arguments to require must be static strings. Resolve all icons at compilation time so no variable is used." [network tokens] - (mapv #(assoc-in % [:icon :source] (token->icon network %)) tokens)) \ No newline at end of file + (mapv #(assoc-in % [:icon :source] (token->icon network %)) tokens)) + +(defn network->icon [network] + (let [s (str "./resources/images/tokens/" (name network) "/0-native.png")] + (if (.exists (io/file s)) + `(js/require ~s) + `(js/require "./resources/images/tokens/default-native.png")))) + +(defmacro resolve-native-currency-icons + "In react-native arguments to require must be static strings. + Resolve all icons at compilation time so no variable is used." + [all-native-currencies] + (into {} + (map (fn [[network native-currency]] + [network (assoc-in native-currency + [:icon :source] + (network->icon network))]) all-native-currencies))) \ No newline at end of file diff --git a/src/status_im/utils/ethereum/tokens.cljs b/src/status_im/utils/ethereum/tokens.cljs index b9eeb01b2c..dd04e8ead0 100644 --- a/src/status_im/utils/ethereum/tokens.cljs +++ b/src/status_im/utils/ethereum/tokens.cljs @@ -1,22 +1,40 @@ (ns status-im.utils.ethereum.tokens - (:require-macros [status-im.utils.ethereum.macros :refer [resolve-icons]]) + (:require-macros [status-im.utils.ethereum.macros :refer [resolve-icons] :as ethereum.macros]) (:require [clojure.string :as string] [status-im.utils.config :as config])) (defn- asset-border [color] {:border-color color :border-width 1 :border-radius 32}) -(def ethereum {:name "Ether" - :symbol :ETH - :decimals 18 - :icon {:source (js/require "./resources/images/assets/ethereum.png") - ;; TODO(goranjovic) find a better place to set UI info - ;; like colors. Removed the reference to component.styles to - ;; avoid circular dependency between namespaces. - :style (asset-border "#628fe333")}}) +(def default-native-currency + {:name "Native" + :symbol :ETH + :decimals 18 + :icon {:source (js/require "./resources/images/tokens/default-native.png")}}) -(defn ethereum? [k] - (= k (:symbol ethereum))) +(def all-native-currencies + (ethereum.macros/resolve-native-currency-icons + {:mainnet {:name "Ether" + :symbol :ETH + :decimals 18 + :icon {:style (asset-border "#628fe333")}} + :testnet {:name "Ropsten Ether" + :symbol :ETH + :symbol-display :ETHro + :decimals 18} + :rinkeby {:name "Rinkeby Ether" + :symbol :ETH + :symbol-display :ETHri + :decimals 18}})) + +(def native-currency-symbols + (set (map #(-> % val :symbol) all-native-currencies))) + +(defn native-currency [chain] + (-> (get all-native-currencies chain default-native-currency))) + +(defn ethereum? [symbol] + (native-currency-symbols symbol)) ;; symbol are used as global identifier (per network) so they must be unique @@ -466,11 +484,15 @@ :name "KudosToken" :address "0x93bB0AFbd0627Bbd3a6C72Bc318341D3A22e254a"}]) - :custom []}) + :custom []}) (defn tokens-for [chain] (get all chain)) +(defn all-assets-for [chain] + (concat [(native-currency chain)] + (tokens-for chain))) + (defn nfts-for [chain] (filter :nft? (tokens-for chain))) @@ -488,6 +510,8 @@ (string/lower-case (:address %))) %) (tokens-for chain))) (defn asset-for [chain symbol] - (if (= (:symbol ethereum) symbol) - ethereum - (symbol->token chain symbol))) + (let [native-coin (native-currency chain)] + (if (or (= (:symbol-display native-coin) symbol) + (= (:symbol native-coin) symbol)) + native-coin + (symbol->token chain symbol)))) diff --git a/src/status_im/utils/money.cljs b/src/status_im/utils/money.cljs index e912d884f7..feaba86486 100644 --- a/src/status_im/utils/money.cljs +++ b/src/status_im/utils/money.cljs @@ -80,8 +80,10 @@ (when bn (.toNumber bn))) -(defn wei->str [unit n] - (str (to-fixed (wei-> unit n)) " " (string/upper-case (name unit)))) +(defn wei->str + ([unit n display-unit] + (str (to-fixed (wei-> unit n)) " " display-unit)) + ([unit n] (wei->str unit n (string/upper-case (name unit))))) (defn wei->ether [n] (wei-> :eth n))