Compare commits

..
Author SHA1 Message Date
Alexander Pantiukhov 95670336ff Lint fix 2025-03-03 09:41:33 +01:00
Alexander Pantiukhov ac07213ba0 Swap and bridge improvements 2025-03-03 09:36:07 +01:00
jakub 9d5f6d0b06 nix: replace yet another openjdk with headless version
Signed-off-by: Jakub Sokołowski <jakub@status.im>
2025-02-27 14:21:18 +01:00
frank 48c83ef759 fix_: no log file (#22122)
* fix_: no log file

https://github.com/status-im/status-go/compare/c5e4eb1a...388fce10

* chore_: fix lint issue

* chore_: set error level for release build

https://github.com/status-im/status-go/compare/c5e4eb1a...ba8fd519
2025-02-27 19:46:28 +08:00
jakub c84fc71bf1 nix: use openjdk_headless to avoid pulling GTK
This saves a whole bunch of downloading.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
2025-02-26 18:56:10 +01:00
38 changed files with 334 additions and 325 deletions
+2 -2
View File
@@ -2,7 +2,7 @@ DEBUG_WEBVIEW=0
ETHEREUM_DEV_CLUSTER=0
EXTENSIONS=0
GROUP_CHATS_ENABLED=1
LOG_LEVEL=debug
LOG_LEVEL=error
MAILSERVER_CONFIRMATIONS_ENABLED=1
MAINNET_WARNING_ENABLED=1
PFS_ENCRYPTION_ENABLED=1
@@ -20,6 +20,6 @@ FAST_CREATE_COMMUNITY_ENABLED=0
TEST_NETWORKS_ENABLED=0
STATUS_PROXY_STAGE_NAME=prod
FLAG_WALLET_CONNECT_ENABLED=1
API_LOGGING_ENABLED=1
API_LOGGING_ENABLED=0
SENTRY_ENABLED=1
SENTRY_ENVIRONMENT=production
+1 -1
View File
@@ -1 +1 @@
2.33.0
2.32.0
@@ -1,15 +1,15 @@
(ns quo.components.buttons.slide-button.constants)
(def ^:constant small-dimensions
(def track-padding 4)
(def small-dimensions
{:track-height 40
:thumb 32})
(def ^:constant large-dimensions
(def large-dimensions
{:track-height 48
:thumb 40})
(def ^:constant track-padding 4)
(def ^:constant disable-opacity 0.3)
(def ^:constant default-width 300)
(def disable-opacity 0.3)
(def ^:constant reset-timeout-ms 500)
(def default-width 300)
@@ -27,8 +27,7 @@
(when (and reached-end? (not sliding-complete?))
(set-sliding-complete true)
(when on-complete
(js/setTimeout reset-fn constants/reset-timeout-ms)
(on-complete))))))
(on-complete reset-fn))))))
(gesture/on-end (fn [event]
(let [x-translation (oops/oget event "translationX")
reached-end? (>= x-translation track-width)]
@@ -56,9 +55,10 @@
on-track-layout (rn/use-callback
#(set-track-width (oops/oget % "nativeEvent.layout.width")))
reset-fn (rn/use-callback
(fn []
(fn [keep-at-end-after-slide?]
(set-sliding-complete false)
(animations/reset-track-position x-pos)))
(when-not keep-at-end-after-slide?
(animations/reset-track-position x-pos))))
dimensions (rn/use-callback
(partial utils/get-dimensions
(or track-width constants/default-width)
@@ -1,13 +0,0 @@
(ns quo.components.common.new-feature-dot
(:require [quo.components.common.new-feature-gradient :as new-feature-gradient]))
(def ^:const size 8)
(defn view
[{:keys [style accessibility-label]}]
[new-feature-gradient/view
{:style (merge {:width size
:height size
:border-radius (/ size 2)}
style)
:accessibility-label accessibility-label}])
@@ -1,16 +0,0 @@
(ns quo.components.common.new-feature-gradient
(:require [quo.foundations.colors :as colors]
[quo.theme]
[react-native.linear-gradient :as linear-gradient]))
(defn view
[{:keys [style accessibility-label]}]
(let [theme (quo.theme/use-theme)]
[linear-gradient/linear-gradient
{:style style
:accessibility-label accessibility-label
:colors [(colors/resolve-color :yellow theme)
colors/new-feature-gradient-pink]
:use-angle true
:angle 78
:angle-center {:x 0.5 :y 0.5}}]))
@@ -33,12 +33,4 @@
networks-list])
(h/is-truthy (h/query-by-label-text :network-dropdown))
(h/fire-event :press (h/query-by-label-text :network-dropdown))
(h/was-not-called on-press)))
(h/test "Should display new chain indicator"
(h/render [network-dropdown/view
{:state :default
:show-new-chain-indicator? true}
networks-list])
(h/is-truthy (h/query-by-label-text :network-dropdown))
(h/is-truthy (h/query-by-label-text :new-chain-indicator))))
(h/was-not-called on-press))))
@@ -23,7 +23,3 @@
:opacity (if (= state :disabled) 0.3 1)
:border-color (container-border-color props)
:align-items :center})
(def new-chain-indicator
{:position :absolute
:right 0})
@@ -1,13 +1,12 @@
(ns quo.components.dropdowns.network-dropdown.view
(:require
[quo.components.common.new-feature-dot :as new-feature-dot]
[quo.components.dropdowns.network-dropdown.style :as style]
[quo.components.list-items.preview-list.view :as preview-list]
[quo.theme :as quo.theme]
[react-native.core :as rn]))
(defn view
[{:keys [on-press state show-new-chain-indicator?] :as props} networks]
[{:keys [on-press state] :as props} networks]
(let [theme (quo.theme/use-theme)
[pressed? set-pressed] (rn/use-state false)
on-press-in (rn/use-callback #(set-pressed true))
@@ -19,10 +18,6 @@
:on-press on-press
:on-press-in on-press-in
:on-press-out on-press-out}
(when show-new-chain-indicator?
[new-feature-dot/view
{:style style/new-chain-indicator
:accessibility-label :new-chain-indicator}])
[preview-list/view
{:type :network
:list-size (count networks)
@@ -200,15 +200,12 @@
shown-name]]))
(defn- wallet-networks-center
[{:keys [networks networks-on-press show-new-chain-indicator? background
center-content-container-style]}]
[{:keys [networks networks-on-press background center-content-container-style]}]
[reanimated/view {:style center-content-container-style}
[network-dropdown/view
{:state :default
:on-press networks-on-press
:blur? (= background :blur)
:show-new-chain-indicator? show-new-chain-indicator?}
networks]])
{:state :default
:on-press networks-on-press
:blur? (= background :blur)} networks]])
(defn page-nav
"Props:
@@ -64,20 +64,3 @@
{:margin-top 7
:margin-bottom 2
:margin-left -1})
(def new-feature-tag-container
{:margin-left 6
:border-radius 12
:justify-content :center})
(def new-feature-tag-gradient
{:border-radius 12
:position :absolute
:left 0
:right 0
:top 0
:bottom 0})
(def new-feature-tag-text
{:color colors/white
:margin-horizontal 5})
@@ -4,7 +4,6 @@
[quo.components.avatars.icon-avatar :as icon-avatar]
[quo.components.avatars.user-avatar.view :as user-avatar]
[quo.components.buttons.button.view :as button]
[quo.components.common.new-feature-gradient :as new-feature-gradient]
[quo.components.icon :as icon]
[quo.components.list-items.preview-list.view :as preview-list]
[quo.components.markdown.text :as text]
@@ -116,9 +115,7 @@
nil)])
(defn view
[{:keys [title show-new-feature-tag? on-press action-props accessibility-label blur? container-style
content]
:as props}]
[{:keys [title on-press action-props accessibility-label blur? container-style content] :as props}]
[rn/pressable
{:style (merge style/container container-style)
:on-press (or on-press (:on-change action-props))
@@ -129,19 +126,10 @@
[rn/view {:style (style/left-sub-container props)}
[image-component props]
[rn/view {:style (style/left-container (:image props))}
[rn/view {:flex-direction :row}
[text/text
{:weight :medium
:style {:color (when blur? colors/white)}}
title]
(when show-new-feature-tag?
[rn/view {:style style/new-feature-tag-container}
[new-feature-gradient/view {:style style/new-feature-tag-gradient}]
[text/text
{:weight :semi-bold
:size :label
:style style/new-feature-tag-text}
(string/upper-case (i18n/label :t/new))]])]
[text/text
{:weight :medium
:style {:color (when blur? colors/white)}}
title]
[description-component props]
[tag-component props]]]
[rn/view {:style (style/sub-container (:alignment action-props))}
@@ -18,6 +18,5 @@
[:dropdown-on-press {:optional true} [:maybe fn?]]
[:networks {:optional true}
[:maybe [:sequential [:map [:source [:maybe :schema.common/image-source]]]]]]
[:dropdown-state {:optional true} [:maybe [:enum :default :disabled]]]
[:show-new-chain-indicator? {:optional true} [:maybe :boolean]]]]]
[:dropdown-state {:optional true} [:maybe [:enum :default :disabled]]]]]]
:any])
@@ -25,7 +25,7 @@
bars))
(defn- view-info-top
[{:keys [state balance networks dropdown-on-press dropdown-state show-new-chain-indicator?]}]
[{:keys [state balance networks dropdown-on-press dropdown-state]}]
(let [theme (quo.theme/use-theme)]
[rn/view {:style style/container-info-top}
(if (= state :loading)
@@ -36,10 +36,9 @@
:style (style/style-text-heading theme)}
balance])
[network-dropdown/view
{:state (or dropdown-state :default)
:blur? true
:on-press dropdown-on-press
:show-new-chain-indicator? show-new-chain-indicator?}
{:state (or dropdown-state :default)
:blur? true
:on-press dropdown-on-press}
networks]]))
(defn- view-metrics
-2
View File
@@ -315,8 +315,6 @@
networks-short-name
socials))
(def new-feature-gradient-pink "#FF33A3")
(defn hex-string?
[s]
(and (string? s) (string/starts-with? s "#")))
+7
View File
@@ -39,12 +39,19 @@
"wallet.suggested.routes"
{:fx [[:dispatch [:wallet/handle-suggested-routes (transforms/js->clj event-js)]]]}
"wallet.router.sending-transactions-started"
{:fx [[:dispatch
[:wallet/sending-transactions-started-signal-received (transforms/js->clj event-js)]]]}
"wallet.router.sign-transactions"
{:fx [[:dispatch [:wallet/sign-transactions-signal-received (transforms/js->clj event-js)]]]}
"wallet.router.transactions-sent"
{:fx [[:dispatch [:wallet/transactions-sent-signal-received (transforms/js->clj event-js)]]]}
"wallet.transaction.status-changed"
{:fx [[:dispatch [:wallet/status-changed-signal-received (transforms/js->clj event-js)]]]}
"envelope.sent"
(messages.transport/update-envelopes-status
cofx
@@ -26,7 +26,8 @@
:auth-button-label auth-button-label}]))
(vec (conj dependencies on-auth-success on-auth-fail)))
on-slider-complete (rn/use-callback
(fn []
(fn [reset-slider-fn]
(js/setTimeout #(reset-slider-fn false) 500)
(if (fn? on-complete)
(on-complete)
(on-complete-callback)))
+1 -2
View File
@@ -275,8 +275,7 @@
{:events [:chat/unmute-chat-community]}
[{:keys [db]} chat-id]
(let [{:keys [community-id]} (get-in db [:chats chat-id])]
(when community-id
{:db (assoc-in db [:communities community-id :muted] false)})))
{:db (assoc-in db [:communities community-id :muted] false)}))
(rf/defn mute-chat-failed
{:events [:chat/mute-failed]}
@@ -18,16 +18,11 @@
:padding-horizontal 36
:padding-vertical 30
:background-color (colors/theme-colors colors/white colors/neutral-95 theme)}}
[rn/text
{:style {:font-size 26
:color (colors/theme-colors "#8F8E94" "#9F9FA5" theme)
:margin-bottom 36}}
[rn/text {:style {:font-size 26 :color "#9F9FA5" :margin-bottom 36}}
(i18n/label :t/ready-to-scan)]
[rn/image {:source (resources/get-image :nfc-prompt)}]
[rn/text
{:style {:font-size 16
:color (colors/theme-colors "#09101C" :white theme)
:margin-vertical 36}}
[rn/image
{:source (resources/get-image :nfc-prompt)}]
[rn/text {:style {:font-size 16 :color :white :margin-vertical 36}}
(if connected?
(i18n/label :t/connected-dont-move)
(i18n/label :t/hold-phone-near-keycard))]
@@ -37,12 +32,6 @@
(rf/dispatch [:keycard/hide-connection-sheet]))
:style {:flex-direction :row}}
[rn/view
{:style {:background-color (colors/theme-colors "#D5D4DB" "#8E8E93" theme)
:flex 1
:align-items :center
:padding 18
:border-radius 10}}
[rn/text
{:style {:color (colors/theme-colors "#09101C" :white theme)
:font-size 16}}
{:style {:background-color "#8E8E93" :flex 1 :align-items :center :padding 18 :border-radius 10}}
[rn/text {:style {:color :white :font-size 16}}
(i18n/label :t/cancel)]]]]]))
@@ -7,7 +7,6 @@
[react-native.safe-area :as safe-area]
[status-im.common.floating-button-page.view :as floating-button-page]
[status-im.contexts.settings.wallet.saved-addresses.add-address-to-save.style :as style]
[status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.common.validation :as validation]
[utils.address :as utils-address]
[utils.debounce :as debounce]
@@ -160,7 +159,7 @@
(fn [clipboard-text]
(when-not (string/blank? clipboard-text)
(-> clipboard-text
utils/on-paste-address-or-ens
utils-address/extract-address-without-chains-info
on-change-text)))))
on-press-continue (rn/use-callback
(fn []
@@ -7,7 +7,6 @@
[reagent.core :as reagent]
[status-im.common.floating-button-page.view :as floating-button-page]
[status-im.contexts.wallet.add-account.add-address-to-watch.style :as style]
[status-im.contexts.wallet.common.utils :as utils]
[status-im.contexts.wallet.common.validation :as validation]
[status-im.subs.wallet.add-account.address-to-watch]
[utils.address :as utils-address]
@@ -43,7 +42,7 @@
paste-on-input #(clipboard/get-string
(fn [clipboard-text]
(-> clipboard-text
utils/on-paste-address-or-ens
utils.address/extract-address-without-chains-info
on-change-text)))]
(rn/use-effect (fn []
(when-not (string/blank? scanned-address)
@@ -1,7 +1,6 @@
(ns status-im.contexts.wallet.common.account-switcher.view
(:require
[quo.core :as quo]
[react-native.core :as rn]
[status-im.contexts.wallet.sheets.account-options.view :as account-options]
[status-im.contexts.wallet.sheets.network-filter.view :as network-filter]
[status-im.contexts.wallet.sheets.select-account.view :as select-account]
@@ -31,33 +30,25 @@
type :no-title}}]
(let [{:keys [color emoji watch-only?]} (rf/sub [:wallet/current-viewing-account])
networks (rf/sub [:wallet/selected-network-details])
sending-collectible? (rf/sub [:wallet/sending-collectible?])
show-new-chain-indicator? (rf/sub [:wallet/show-new-chain-indicator?])
on-press-networks (rn/use-callback
(fn []
(rf/dispatch [:wallet/hide-new-chain-indicator])
(rf/dispatch [:show-bottom-sheet
{:content network-filter/view}])))]
sending-collectible? (rf/sub [:wallet/sending-collectible?])]
[quo/page-nav
{:type type
:icon-name icon-name
:margin-top margin-top
:background :blur
:on-press on-press
:accessibility-label accessibility-label
:networks networks
:align-center? true
:networks-on-press on-press-networks
:show-new-chain-indicator? show-new-chain-indicator?
:right-side [(when (and (ff/enabled? ::ff/wallet.wallet-connect)
(not watch-only?)
show-dapps-button?)
{:icon-name :i/dapps
:on-press #(rf/dispatch [:navigate-to
:screen/wallet.connected-dapps])})
(when-not sending-collectible?
{:content-type :account-switcher
:customization-color color
:on-press #(on-switcher-press switcher-type params)
:emoji emoji
:type (when watch-only? :watch-only)})]}]))
{:type type
:icon-name icon-name
:margin-top margin-top
:background :blur
:on-press on-press
:accessibility-label accessibility-label
:networks networks
:align-center? true
:networks-on-press #(rf/dispatch [:show-bottom-sheet {:content network-filter/view}])
:right-side [(when (and (ff/enabled? ::ff/wallet.wallet-connect)
(not watch-only?)
show-dapps-button?)
{:icon-name :i/dapps
:on-press #(rf/dispatch [:navigate-to :screen/wallet.connected-dapps])})
(when-not sending-collectible?
{:content-type :account-switcher
:customization-color color
:on-press #(on-switcher-press switcher-type params)
:emoji emoji
:type (when watch-only? :watch-only)})]}]))
+97 -21
View File
@@ -4,7 +4,6 @@
[status-im.common.qr-codes.view :as qr-codes]
[status-im.constants :as constants]
[status-im.contexts.wallet.common.utils.networks :as network-utils]
[utils.address]
[utils.money :as money]
[utils.number :as number]
[utils.string]))
@@ -325,19 +324,20 @@
(defn make-network-item
"This function generates props for quo/category component item"
[{:keys [network-name color on-change networks label-props type blur?]}]
(cond-> {:title (string/capitalize (name network-name))
:image :icon-avatar
:image-props {:icon (resources/get-network network-name)
:size :size-20}
;; Remove the following line for v2.35
:show-new-feature-tag? (= network-name constants/base-network-name)
:action :selector
:action-props {:type (or type :checkbox)
:blur? blur?
:customization-color color
:checked? (contains? networks network-name)
:on-change on-change}}
[{:keys [network-name color on-change networks state label-props type blur?]}]
(cond-> {:title (string/capitalize (name network-name))
:image :icon-avatar
:image-props {:icon (resources/get-network network-name)
:size :size-20}
:action :selector
:action-props {:type (or type
(if (= :default state)
:filled-checkbox
:checkbox))
:blur? blur?
:customization-color color
:checked? (contains? networks network-name)
:on-change on-change}}
label-props
(assoc :label :text
@@ -481,10 +481,86 @@
(some positive-balance-in-any-chain? tokens))
operable-account))))
(defn on-paste-address-or-ens
"Check if the clipboard has any valid address and extract the address without any chain info.
If it does not contain an valid address or it is ENS, return the clipboard text as it is"
[clipboard-text]
(if (utils.address/supported-address? clipboard-text)
(utils.address/extract-address-without-chains-info clipboard-text)
clipboard-text))
(defn send-details-map
"Generates a new map with all the sen details using the original
details we've received from `status-go`. The new one contains only
the keys we need."
[send-details]
(let [{:keys [uuid
sendType
fromAddress
toAddress
fromChain
toChain
fromAmount
toAmount
fromAsset
toAsset
username
publicKey
packId]} send-details]
{:uuid uuid
:send-type sendType
:address-from fromAddress
:address-to toAddress
:tx-to ""
:from-chain fromChain
:to-chain toChain
:from-amount fromAmount
:to-amount toAmount
:from-asset fromAsset
:to-asset toAsset
:username username
:public-key publicKey
:pack-id packId
:tx-hash ""
:approval-tx? false}))
(defn details-map
"Generates map with all the transaction details based on what we've
got from status-go as `send-details` and `sent-transaction`."
[send-details sent-transaction]
(let [send-details (send-details-map send-details)
{:keys [toAddress fromChain toChain amountIn
amountOut fromToken toToken hash
approvalTx]} sent-transaction
amount-in (money/from-hex amountIn)
amount-out (money/from-hex amountOut)
sent-transaction? (and sent-transaction (> (-> sent-transaction :hash count) 0))]
(if sent-transaction?
(cond-> send-details
true (assoc :tx-to toAddress)
(> fromChain 0) (assoc :from-chain fromChain)
(> toChain 0) (assoc :to-chain toChain)
(not= amount-in "0") (assoc :from-amount amount-in)
(not= amount-out "0") (assoc :to-amount amount-out)
(> (count fromToken) 0) (assoc :from-asset fromToken)
(> (count toToken) 0) (assoc :to-asset toToken)
true (assoc :tx-hash hash)
true (assoc :approval-tx? approvalTx))
send-details)))
(defn contact-name-by-address
[db address]
(or (get-in db [:wallet :accounts address :name])
(get-in db [:contacts/contacts address :primary-name])))
(defn tx-to-name
"Returns the transaction name that will be used for certain types of transactions."
[send-type]
(cond
(= send-type constants/send-type-bridge) "Hop"
(= send-type constants/send-type-swap) "ParaSwap"
:else nil))
(defn transaction-approval-required?
"Indicates whether the transaction needs approval based on the information
from the database."
[transactions {:keys [swap-proposal approval-transaction-id]}]
(let [approval-transaction (when approval-transaction-id
(get transactions approval-transaction-id))
already-approved? (and approval-transaction
(= (:status approval-transaction)
:confirmed))]
(and (:approval-required swap-proposal)
(not already-approved?))))
@@ -3,7 +3,6 @@
[clojure.string :as string]
[native-module.core :as native-module]
[promesa.core :as promesa]
[react-native.async-storage :as async-storage]
[status-im.common.json-rpc.events :as json-rpc]
[status-im.contexts.profile.recover.effects :as profile.recover.effects]
[status-im.contexts.wallet.rpc :as wallet-rpc]
@@ -131,14 +130,3 @@
(-> (wallet-rpc/sign-message message address (security/safe-unmask-data password))
(promesa/then on-success)
(promesa/catch on-error))))
(rf/reg-fx
:effects.wallet/retrieve-base-chain-indicator-shown
(fn []
(async-storage/get-item :base-chain-indicator-shown
#(rf/dispatch [:wallet/retrieve-new-chain-indicator (not %)]))))
(rf/reg-fx
:effects.wallet/set-base-chain-indicator-shown
(fn [flag]
(async-storage/set-item! :base-chain-indicator-shown flag)))
+63 -19
View File
@@ -783,28 +783,72 @@
(rf/reg-event-fx
:wallet/transactions-sent-signal-received
(fn [{:keys [db]}
(fn [_
[{sent-transactions :sentTransactions
send-details :sendDetails}]]
(let [swap? (get-in db [:wallet :ui :swap])]
{:fx [[:dispatch
(if-let [error-response (:errorResponse send-details)]
[(if swap?
:wallet.swap/transaction-failure
:wallet/transaction-failure)
error-response]
[(if swap?
:wallet.swap/transaction-success
:wallet/transaction-success)
sent-transactions])]]})))
{:fx [[:dispatch
[:wallet/show-transaction-notification
{:status :sent
:send-details send-details
:sent-transaction (first sent-transactions)}]]
[:dispatch
(if (:errorResponse send-details)
[:wallet/transaction-failure send-details]
[(if (= (:sendType send-details) constants/send-type-swap)
:wallet.swap/transaction-success
:wallet/transaction-success)
sent-transactions])]]}))
(rf/reg-event-fx
:wallet/retrieve-new-chain-indicator
(fn [{:keys [db]} [flag]]
{:db (assoc-in db [:wallet :ui :show-new-chain-indicator?] flag)}))
:wallet/sending-transactions-started-signal-received
(fn [_
[{sent-transactions :sentTransactions
send-details :sendDetails}]]
{:fx [[:dispatch
[:wallet/show-transaction-notification
{:status :sending
:send-details send-details
:sent-transaction (first sent-transactions)}]]]}))
(rf/reg-event-fx
:wallet/hide-new-chain-indicator
(fn [{:keys [db]}]
{:db (assoc-in db [:wallet :ui :show-new-chain-indicator?] false)
:fx [[:effects.wallet/set-base-chain-indicator-shown true]]}))
:wallet/status-changed-signal-received
(fn [_
[{sent-transactions :sentTransactions
send-details :sendDetails}]]
{:fx [[:dispatch
[:wallet/show-transaction-notification
{:status :status-changed
:send-details send-details
:sent-transaction (first sent-transactions)}]]]}))
(rf/reg-event-fx
:wallet/show-transaction-notification
(fn [{:keys [db]} [{:keys [status send-details sent-transaction]}]]
(let [{:keys [error send-type]
:as details}
(as-> (utils/details-map send-details sent-transaction) $
(assoc $ :error (get-in send-details [:ErrorResponse :details]))
(assoc $ :account-from-name (utils/contact-name-by-address db (:address-from $)))
(assoc $ :account-to-name (utils/contact-name-by-address db (:address-to $)))
(assoc $
:tx-to-name
(or (utils/tx-to-name (:send-type $))
(utils/contact-name-by-address db (:tx-to $)))))]
(cond
;; handle errors and show notifications about errors
error
(do
(log/warn "Error when sending transaction" details)
{:fx [[:dispatch
[:toasts/upsert
{:id (keyword (str status "-failure"))
:type :negative
:text error}]]]})
;; handle swap notifications in a separate fx
(= send-type constants/send-type-swap)
{:fx [[:dispatch
[:wallet.swap/show-transaction-notification
{:status status
:send-details details}]]]}))))
+8 -15
View File
@@ -135,13 +135,7 @@
cards (conj account-cards-data (new-account-card-data))
[init-loaded? set-init-loaded] (rn/use-state false)
{:keys [formatted-balance]} (rf/sub [:wallet/aggregated-token-values-and-balance])
theme (quo.theme/use-theme)
show-new-chain-indicator? (rf/sub [:wallet/show-new-chain-indicator?])
on-press-network-selector (rn/use-callback
(fn []
(rf/dispatch [:wallet/hide-new-chain-indicator])
(rf/dispatch [:show-bottom-sheet
{:content network-filter/view}])))]
theme (quo.theme/use-theme)]
(rn/use-effect (fn []
(when (and @account-list-ref (pos? (count cards)))
(.scrollToOffset ^js @account-list-ref
@@ -163,14 +157,13 @@
:on-refresh #(rf/dispatch [:wallet/get-accounts])}]
:header [rn/view {:style (style/header-container theme)}
[quo/wallet-overview
{:state (if tokens-loading? :loading :default)
:time-frame :none
:metrics :none
:balance formatted-balance
:networks networks
:dropdown-on-press on-press-network-selector
:show-new-chain-indicator? (when (not-empty networks)
show-new-chain-indicator?)}]
{:state (if tokens-loading? :loading :default)
:time-frame :none
:metrics :none
:balance formatted-balance
:networks networks
:dropdown-on-press #(rf/dispatch [:show-bottom-sheet
{:content network-filter/view}])}]
(when (ff/enabled? ::ff/wallet.graph)
[quo/wallet-graph {:time-frame :empty}])
[render-cards cards account-list-ref]
+23 -24
View File
@@ -546,7 +546,6 @@
token-decimal (when token (:decimals token))
token-id (utils/format-token-id token collectible)
to-token-id ""
gas-rates constants/gas-rate-medium
to-hex (fn [v] (send-utils/amount-in-hex v (if token token-decimal 0)))
amount-in (to-hex amount)
amount-out (to-hex amount-out)
@@ -582,10 +581,11 @@
:amountIn amount-in
:amountOut amount-out
:tokenID token-id
:tokenIDIsOwnerToken false
:toTokenID to-token-id
:disabledFromChainIDs disabled-from-chain-ids
:disabledToChainIDs disabled-to-chain-ids
:gasFeeMode gas-rates
:gasFeeMode constants/gas-rate-medium
:fromLockedAmount {}
:username (:username args)
:publicKey (:publicKey args)
@@ -660,19 +660,20 @@
(update :best best-routes-fix)
(update :candidates candidates-fix)))
(rf/reg-event-fx
:wallet/handle-suggested-routes
(fn [{:keys [db]} [data]]
(let [{send :send swap? :swap} (-> db :wallet :ui)
skip-processing-routes? (:skip-processing-suggested-routes? send)
clean-user-tx-settings? (get-in db
[:wallet :ui :send :custom-tx-settings
:delete-on-routes-update?])]
(when (or swap? (not skip-processing-routes?))
(let [{:keys [send swap]} (-> db :wallet :ui)
skip-processing-routes? (:skip-processing-suggested-routes? send)
clean-user-tx-settings? (get-in db
[:wallet :ui :send :custom-tx-settings
:delete-on-routes-update?])]
(when (or swap (not skip-processing-routes?))
(let [{error-code :code
:as error} (:ErrorResponse data)
enough-assets? (not (and (:Best data) (= error-code "WR-002")))
failure? (and error enough-assets? (not swap?))
failure? (and error enough-assets? (not swap))
error-message (if (zero? error-code) "An error occurred" (:details error))]
(when failure?
(log/error "failed to get suggested routes (async)"
@@ -683,11 +684,11 @@
{:db (update-in db [:wallet :ui :send] dissoc :custom-tx-settings)})
{:fx [[:dispatch
(cond
(and failure? swap?) [:wallet/swap-proposal-error error]
failure? [:wallet/suggested-routes-error error-message]
swap? [:wallet/swap-proposal-success (fix-routes data)]
:else [:wallet/suggested-routes-success (fix-routes data)
enough-assets?])]]}))))))
(and failure? swap) [:wallet/swap-proposal-error error]
failure? [:wallet/suggested-routes-error error-message]
swap [:wallet/swap-proposal-success (fix-routes data)]
:else [:wallet/suggested-routes-success (fix-routes data)
enough-assets?])]]}))))))
(rf/reg-event-fx
:wallet/transaction-success
@@ -711,16 +712,14 @@
(rf/reg-event-fx
:wallet/transaction-failure
(fn [_ [{:keys [details]}]]
{:fx [[:dispatch [:wallet/end-transaction-flow]]
[:dispatch-later
[{:ms 2000
:dispatch [:wallet/stop-and-clean-suggested-routes]}]]
[:dispatch
[:toasts/upsert
{:id :send-transaction-failure
:type :negative
:text (or details "An error occured")}]]]}))
(fn [_ [send-details]]
(if (= (:sendType send-details) constants/send-type-swap)
{:fx [[:dispatch [:wallet.swap/track-transaction-execution-failed (:errorResponse send-details)]]
[:dispatch [:wallet.swap/end-transaction-flow]]]}
{:fx [[:dispatch [:wallet/end-transaction-flow]]
[:dispatch-later
[{:ms 2000
:dispatch [:wallet/stop-and-clean-suggested-routes]}]]]})))
(rf/reg-event-fx :wallet/clean-just-completed-transaction
(fn [{:keys [db]}]
@@ -18,7 +18,6 @@
:network-name :mainnet
:chain-id 1
:related-chain-id 5}]
:wallet/show-new-chain-indicator? false
:wallet/current-viewing-account-address "0x1"
:wallet/current-viewing-account {:path "m/44'/60'/0'/0/1"
:emoji "💎"
@@ -61,7 +61,7 @@
(fn [clipboard]
(when-not (empty? clipboard)
(-> clipboard
utils/on-paste-address-or-ens
utils-address/extract-address-without-chains-info
on-change)))))
:ens-regex constants/regx-ens
:scanned-value (or (when recipient-plain-address? send-address) scanned-address)
@@ -8,26 +8,41 @@
(defn view
[]
(let [selected-networks (rf/sub [:wallet/selected-networks])
selector-state (rf/sub [:wallet/network-filter-selector-state])
color (rf/sub [:profile/customization-color])
network-details (rf/sub [:wallet/network-details])]
network-details (rf/sub [:wallet/network-details])
viewing-account? (rf/sub [:wallet/viewing-account?])
balance-per-chain (if viewing-account?
(rf/sub [:wallet/current-viewing-account-fiat-balance-per-chain])
(rf/sub [:wallet/aggregated-fiat-balance-per-chain]))
mainnet (first network-details)
layer-2-networks (rest network-details)]
[:<>
[quo/drawer-top {:title (i18n/label :t/select-networks)}]
[quo/information-box
{:type :informative
:icon :i/info
:blur? false
:style {:margin-horizontal 20
:margin-bottom 4}}
(i18n/label :t/base-chain-available-info)]
[quo/category
{:list-type :settings
:data [(utils/make-network-item
{:state selector-state
:network-name (:network-name mainnet)
:color color
:networks selected-networks
:label-props (get balance-per-chain (:chain-id mainnet))
:on-change #(rf/dispatch
[:wallet/update-selected-networks
(:network-name
mainnet)])})]}]
[quo/category
{:list-type :settings
:label (i18n/label :t/layer-2)
:data (mapv (fn [network]
(utils/make-network-item
{:network-name (:network-name network)
{:state selector-state
:network-name (:network-name network)
:color color
:networks selected-networks
:label-props (get balance-per-chain (:chain-id network))
:on-change #(rf/dispatch
[:wallet/update-selected-networks
(:network-name
network)])}))
network-details)}]]))
layer-2-networks)}]]))
+42 -42
View File
@@ -249,13 +249,15 @@
(rf/reg-event-fx :wallet/stop-get-swap-proposal
(fn [{:keys [db]}]
{:db (update-in db [:wallet :ui :swap] dissoc :last-request-uuid)
:json-rpc/call [{:method "wallet_stopSuggestedRoutesAsyncCalculation"
:params []
:on-error (fn [error]
(log/error "failed to stop fetching swap proposals"
{:event :wallet/stop-get-swap-proposal
:error error}))}]}))
(let [route-request-ongoing? (some? (get-in db [:wallet :ui :swap :last-request-uuid]))]
(when route-request-ongoing?
{:db (update-in db [:wallet :ui :swap] dissoc :last-request-uuid)
:json-rpc/call [{:method "wallet_stopSuggestedRoutesAsyncCalculation"
:params []
:on-error (fn [error]
(log/error "failed to stop fetching swap proposals"
{:event :wallet/stop-get-swap-proposal
:error error}))}]}))))
(rf/reg-event-fx
:wallet/clean-swap-proposal
@@ -430,16 +432,6 @@
[:wallet.swap/set-sign-transactions-callback-fx
[:dispatch [:wallet/prepare-signatures-for-transactions :swap]]]]]})))
(defn transaction-approval-required?
[transactions {:keys [swap-proposal approval-transaction-id]}]
(let [approval-transaction (when approval-transaction-id
(get transactions approval-transaction-id))
already-approved? (and approval-transaction
(= (:status approval-transaction)
:confirmed))]
(and (:approval-required swap-proposal)
(not already-approved?))))
(rf/reg-event-fx
:wallet.swap/mark-as-pending
(fn [{:keys [db]} [transaction-id]]
@@ -466,7 +458,7 @@
(-> amount-out
(number/hex->whole receive-token-decimals)
(money/to-fixed receive-token-decimals)))
approval-required? (transaction-approval-required? transactions swap)]
approval-required? (utils/transaction-approval-required? transactions swap)]
{:fx [[:dispatch
[:centralized-metrics/track
(if approval-required?
@@ -494,23 +486,11 @@
[:dispatch [:wallet.swap/mark-as-pending (-> sent-transactions first :hash)]])
(when-not approval-required?
;; just end the whole transaction flow if no approval needed
[:dispatch [:wallet.swap/end-transaction-flow]])
(when-not approval-required?
[:dispatch-later
{:ms 500
:dispatch [:toasts/upsert
{:id :swap-transaction-pending
:icon :i/info
:type :neutral
:text (i18n/label :t/swapping-to
{:pay-amount amount
:pay-token-symbol token-id-from
:receive-token-symbol token-id-to
:receive-amount receive-amount})}]}])]})))
[:dispatch [:wallet.swap/end-transaction-flow]])]})))
(rf/reg-event-fx
:wallet.swap/transaction-failure
(fn [{:keys [db]} [{:keys [details] :as error}]]
:wallet.swap/track-transaction-execution-failed
(fn [{:keys [db]} [error]]
(let [transactions (get-in db [:wallet :transactions])
{:keys [asset-to-pay
asset-to-receive
@@ -519,7 +499,7 @@
swap-chain-id (:chain-id network)
token-id-from (:symbol asset-to-pay)
token-id-to (:symbol asset-to-receive)
approval-required? (transaction-approval-required? transactions swap)]
approval-required? (utils/transaction-approval-required? transactions swap)]
{:fx [[:centralized-metrics/track
(if approval-required?
:metric/swap-approval-execution-failed
@@ -528,20 +508,14 @@
:error error
:pay_token token-id-from}
(not approval-required?)
(assoc :receive_token token-id-to))]
[:dispatch [:wallet.swap/end-transaction-flow]]
[:dispatch
[:toasts/upsert
{:id :send-transaction-error
:type :negative
:text (or details "An error occured")}]]]})))
(assoc :receive_token token-id-to))]]})))
(rf/reg-event-fx
:wallet.swap/clean-up-transaction-flow
(fn [{:keys [db]}]
(let [transactions (get-in db [:wallet :transactions])
swap (get-in db [:wallet :ui :swap])
approval-required? (transaction-approval-required? transactions swap)]
approval-required? (utils/transaction-approval-required? transactions swap)]
{:db (update-in db [:wallet :ui] dissoc :swap)
:fx [[:dispatch
[:dismiss-modal
@@ -575,3 +549,29 @@
[:dispatch
[:navigate-to-within-stack
[:screen/wallet.swap-select-asset-to-pay :screen/wallet.swap-select-account]]]])})))
(rf/reg-event-fx
:wallet.swap/show-transaction-notification
(fn [{:keys [db]} [{:keys [status send-details]}]]
(let [transactions (get-in db [:wallet :transactions])
{:keys [asset-to-pay asset-to-receive] :as swap} (get-in db [:wallet :ui :swap])]
;; show toast when approval is not required
(when (and (= status :sent)
(not (utils/transaction-approval-required? transactions swap)))
{:fx [[:dispatch-later
{:ms 500
:dispatch [:toasts/upsert
{:id :swap-transaction-pending
:icon :i/info
:type :neutral
:text (i18n/label :t/swapping-to
{:pay-amount (-> send-details
:from-amount
(money/token->unit
(:decimals asset-to-pay)))
:receive-amount (-> send-details
:to-amount
(money/token->unit
(:decimals asset-to-receive)))
:pay-token-symbol (:from-asset send-details)
:receive-token-symbol (:to-asset send-details)})}]}]]}))))
+1 -3
View File
@@ -78,6 +78,4 @@
;;app starting flow continues in get-profiles-overview
:profile/get-profiles-overview #(rf/dispatch [:profile/get-profiles-overview-success %])
:effects.font/get-font-file-for-initials-avatar
#(rf/dispatch [:font/init-font-file-for-initials-avatar %])
;; show new chain indicator to highlight base chain. This will be be removed in v2.35.
:effects.wallet/retrieve-base-chain-indicator-shown nil}))
#(rf/dispatch [:font/init-font-file-for-initials-avatar %])}))
-5
View File
@@ -47,11 +47,6 @@
:<- [:wallet/ui]
:-> :last-updates-per-address)
(rf/reg-sub
:wallet/show-new-chain-indicator?
:<- [:wallet/ui]
:-> :show-new-chain-indicator?)
(rf/reg-sub
:wallet/latest-update
:<- [:wallet/last-updates-per-address]
+3 -3
View File
@@ -3,7 +3,7 @@
"_comment": "Instead use: scripts/update-status-go.sh <rev>",
"owner": "status-im",
"repo": "status-go",
"version": "v10.7.0+hotfix.2",
"commit-sha1": "595dc68e9ff5e6e57364818098616a97b83eabd5",
"src-sha256": "04dsmz70h3i738bj3i3ba8bckpw61vxb56m8sc4qw8agc9pdaxc0"
"version": "v10.8.0",
"commit-sha1": "ba8fd51958686aea45e34e684ac925a4e65927f8",
"src-sha256": "0kqn5rkfsn7aqc2n2flqvkm6cc53ssk0mc1l84f4czg0paci0717"
}
@@ -41,7 +41,7 @@ class TestWalletCollectibles(MultipleSharedDeviceTestCase):
@marks.testrail_id(741839)
def test_wallet_collectibles_balance(self):
self.wallet_view.collectibles_tab.click()
self.wallet_view.set_network_in_wallet(self.network_name + ', NEW')
self.wallet_view.set_network_in_wallet(self.network_name)
collectibles = {
"BVL": {"quantity": 2,
"info": {"Account": "Account 1",
@@ -52,7 +52,7 @@ class TestWalletOneDevice(MultipleSharedDeviceTestCase):
'Mainnet': self.mainnet_balance,
'Arbitrum': self.arb_balance,
'Optimism': self.optimism_balance,
'Base, NEW': self.base_balance
'Base': self.base_balance
}
for network in expected_balances:
+1 -1
View File
@@ -182,7 +182,7 @@ class WalletView(BaseView):
def set_network_in_wallet(self, network_name: str):
self.network_drop_down.click()
Button(self.driver, accessibility_id="%s, label-component" % network_name).click()
Button(self.driver, accessibility_id="%s, label-component" % network_name.capitalize()).click()
self.network_drop_down.click()
def get_account_element(self, account_name: str = 'Account 1'):
-1
View File
@@ -200,7 +200,6 @@
"bad-fees-description": "Your priority fee is below our suggested parameters.",
"balance": "Balance",
"base": "Base",
"base-chain-available-info": "Base chain is now on Status - view your assets, interact with dApps and swap tokens",
"be-safe-with-secure-cold-wallet": "Be safe with secure cold wallet",
"begin-set-up": "Begin setup",
"below-base-fee": "max fee below base fee",