From 7bfaa9255c84ee23d4dd7859070b5663e3efafee Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Mon, 16 Nov 2020 15:26:40 +0200 Subject: [PATCH] [wallet history] Stop watching each new block --- .../status/ethereum/module/StatusModule.java | 4 +- .../ios/RCTStatus/RCTStatus.m | 4 +- src/status_im/chat/models.cljs | 1 - src/status_im/chat/models/message.cljs | 15 +- src/status_im/ethereum/subscriptions.cljs | 5 +- src/status_im/ethereum/transactions/core.cljs | 6 + src/status_im/events.cljs | 15 +- src/status_im/multiaccounts/login/core.cljs | 5 +- src/status_im/multiaccounts/logout/core.cljs | 4 +- src/status_im/native_module/core.cljs | 6 +- src/status_im/signing/core.cljs | 91 +++++++- .../mobile_network_settings/events.cljs | 4 +- .../ui/screens/wallet/transactions/views.cljs | 18 +- src/status_im/utils/utils.cljs | 9 +- src/status_im/wallet/accounts/core.cljs | 2 +- src/status_im/wallet/core.cljs | 197 +++++++++--------- status-go-version.json | 6 +- translations/en.json | 3 +- 18 files changed, 261 insertions(+), 134 deletions(-) diff --git a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java index 74329ada03..ac207a6068 100644 --- a/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java +++ b/modules/react-native-status/android/src/main/java/im/status/ethereum/module/StatusModule.java @@ -1145,9 +1145,9 @@ class StatusModule extends ReactContextBaseJavaModule implements LifecycleEventL } @ReactMethod - public void startWallet() { + public void startWallet(final boolean watchNewBlocks) { Log.d(TAG, "StartWallet"); - Statusgo.startWallet(); + Statusgo.startWallet(watchNewBlocks); } @ReactMethod diff --git a/modules/react-native-status/ios/RCTStatus/RCTStatus.m b/modules/react-native-status/ios/RCTStatus/RCTStatus.m index 5d5dbd54ec..5ad3bfd609 100644 --- a/modules/react-native-status/ios/RCTStatus/RCTStatus.m +++ b/modules/react-native-status/ios/RCTStatus/RCTStatus.m @@ -747,11 +747,11 @@ RCT_EXPORT_METHOD(stopWallet) { StatusgoStopWallet(); } -RCT_EXPORT_METHOD(startWallet) { +RCT_EXPORT_METHOD(startWallet:(BOOL)watchNewBlocks) { #if DEBUG NSLog(@"StartWallet() method called"); #endif - StatusgoStartWallet(); + StatusgoStartWallet(watchNewBlocks); } RCT_EXPORT_METHOD(stopLocalNotifications) { diff --git a/src/status_im/chat/models.cljs b/src/status_im/chat/models.cljs index 8559ebaa3e..b035e50409 100644 --- a/src/status_im/chat/models.cljs +++ b/src/status_im/chat/models.cljs @@ -193,7 +193,6 @@ (or (:clock-value last-message) deleted-at-clock-value (utils.clocks/send 0)))] - (println :FOOO last-message-clock-value public? remove-chat?) (fx/merge cofx {:db (-> db diff --git a/src/status_im/chat/models/message.cljs b/src/status_im/chat/models/message.cljs index 4890502472..c96ef4d5dc 100644 --- a/src/status_im/chat/models/message.cljs +++ b/src/status_im/chat/models/message.cljs @@ -11,7 +11,8 @@ [status-im.ui.screens.chat.state :as view.state] [status-im.utils.fx :as fx] [taoensso.timbre :as log] - [status-im.chat.models.mentions :as mentions])) + [status-im.chat.models.mentions :as mentions] + [clojure.string :as string])) (defn- prepare-message [message current-chat?] @@ -147,6 +148,15 @@ assoc :unviewed-messages-count (inc current-count))})))) +(fx/defn check-for-incoming-tx + [cofx {{:keys [transaction-hash]} :command-parameters}] + (when (and transaction-hash + (not (string/blank? transaction-hash))) + ;; NOTE(rasom): dispatch later is needed because of circular dependency + {:dispatch-later + [{:dispatch [:watch-tx transaction-hash] + :ms 20}]})) + (fx/defn receive-one {:events [::receive-one]} [{:keys [db] :as cofx} {:keys [message-id] :as message}] @@ -165,7 +175,8 @@ (fx/merge cofx (add-received-message message-with-chat-id) (update-unviewed-count message-with-chat-id) - (chat-model/join-time-messages-checked chat-id)))))))) + (chat-model/join-time-messages-checked chat-id) + (check-for-incoming-tx message-with-chat-id)))))))) ;;TODO currently we process every message, we need to precess them by batches ;;or better move processing to status-go diff --git a/src/status_im/ethereum/subscriptions.cljs b/src/status_im/ethereum/subscriptions.cljs index 94cae830d4..cf477014b4 100644 --- a/src/status_im/ethereum/subscriptions.cljs +++ b/src/status_im/ethereum/subscriptions.cljs @@ -65,7 +65,8 @@ {:db (-> db (update-in [:wallet :accounts] wallet/remove-transactions-since-block blockNumber) - (transactions/update-fetching-status accounts :recent? false)) + (transactions/update-fetching-status accounts :recent? false) + (dissoc :wallet/waiting-for-recent-history?)) :transactions/get-transfers {:chain-tokens (:wallet/all-tokens db) :addresses (reduce @@ -80,7 +81,7 @@ :before-block blockNumber :limit 20 :historical? true}} - (wallet.core/restart-wallet-service))) + (wallet.core/restart-wallet-service false false))) (fx/defn new-wallet-event [cofx {:keys [type blockNumber accounts newTransactions] :as event}] diff --git a/src/status_im/ethereum/transactions/core.cljs b/src/status_im/ethereum/transactions/core.cljs index 1589adf73a..a399904fda 100644 --- a/src/status_im/ethereum/transactions/core.cljs +++ b/src/status_im/ethereum/transactions/core.cljs @@ -222,6 +222,12 @@ (seq transfers) (concat (mapv add-transfer transfers)) + (seq transfers) + (concat + (mapv (fn [{:keys [hash]}] + (wallet/stop-watching-tx hash)) + transfers)) + true (conj (wallet/update-balances (into [] (reduce (fn [acc {:keys [address block]}] diff --git a/src/status_im/events.cljs b/src/status_im/events.cljs index 5f58943afd..430c763671 100644 --- a/src/status_im/events.cljs +++ b/src/status_im/events.cljs @@ -1184,14 +1184,19 @@ (dissoc :app-in-background-since) (assoc :app-active-since now))} (mailserver/process-next-messages-request) + (wallet/restart-wallet-service true false) #(when requires-bio-auth (biometric/authenticate % on-biometric-auth-result authentication-options))))) -(fx/defn on-going-in-background [{:keys [db now]}] - {:db (-> db - (dissoc :app-active-since) - (assoc :app-in-background-since now)) - :dispatch-n [[:audio-recorder/on-background] [:audio-message/on-background]]}) +(fx/defn on-going-in-background + [{:keys [db now] :as cofx}] + (fx/merge + cofx + {:db (-> db + (dissoc :app-active-since) + (assoc :app-in-background-since now)) + :dispatch-n [[:audio-recorder/on-background] [:audio-message/on-background]]} + (wallet/clear-timeouts))) (defn app-state-change [state {:keys [db] :as cofx}] (let [app-coming-from-background? (= state "active") diff --git a/src/status_im/multiaccounts/login/core.cljs b/src/status_im/multiaccounts/login/core.cljs index 3d207b4c68..ffc7679c86 100644 --- a/src/status_im/multiaccounts/login/core.cljs +++ b/src/status_im/multiaccounts/login/core.cljs @@ -310,14 +310,15 @@ :card-read-in-progress? :pin :multiaccount) - (assoc :logged-in-since now)) + (assoc :logged-in-since now) + (assoc :wallet/waiting-for-recent-history? true)) ::json-rpc/call [{:method "web3_clientVersion" :on-success #(re-frame/dispatch [::initialize-web3-client-version %])}]} ;;FIXME (when nodes (fleet/set-nodes :eth.contract nodes)) - (wallet/restart-wallet-service) + (wallet/restart-wallet-service true false) (if login-only? (login-only-events key-uid password save-password?) (create-only-events)) diff --git a/src/status_im/multiaccounts/logout/core.cljs b/src/status_im/multiaccounts/logout/core.cljs index 497236764e..7580abba5d 100644 --- a/src/status_im/multiaccounts/logout/core.cljs +++ b/src/status_im/multiaccounts/logout/core.cljs @@ -8,7 +8,8 @@ [status-im.utils.fx :as fx] [status-im.multiaccounts.core :as multiaccounts] [status-im.utils.keychain.core :as keychain] - [status-im.notifications.core :as notifications])) + [status-im.notifications.core :as notifications] + [status-im.wallet.core :as wallet])) (fx/defn logout-method [{:keys [db] :as cofx} {:keys [auth-method logout?]}] @@ -22,6 +23,7 @@ (notifications/logout-disable) (keychain/save-auth-method key-uid auth-method) (transport/stop-whisper) + (wallet/clear-timeouts) (chaos-mode/stop-checking) (init/initialize-app-db)))) diff --git a/src/status_im/native_module/core.cljs b/src/status_im/native_module/core.cljs index 3f630d9c96..99f1a7b302 100644 --- a/src/status_im/native_module/core.cljs +++ b/src/status_im/native_module/core.cljs @@ -267,9 +267,9 @@ (log/debug "[native-module] stop-wallet") (.stopWallet ^js (status))) -(defn start-wallet [] - (log/debug "[native-module] start-wallet") - (.startWallet ^js (status))) +(defn start-wallet [watch-new-blocks?] + (log/debug "[native-module] start-wallet" watch-new-blocks?) + (.startWallet ^js (status) watch-new-blocks?)) (defn stop-local-notifications [] (log/debug "[native-module] stop-local-notifications") diff --git a/src/status_im/signing/core.cljs b/src/status_im/signing/core.cljs index 71f9af8df0..20826d8551 100644 --- a/src/status_im/signing/core.cljs +++ b/src/status_im/signing/core.cljs @@ -18,6 +18,7 @@ [status-im.utils.types :as types] [status-im.utils.utils :as utils] [status-im.wallet.prices :as prices] + [status-im.wallet.core :as wallet] [taoensso.timbre :as log])) (re-frame/reg-fx @@ -247,6 +248,7 @@ :signing/show-transaction-result nil} (prepare-unconfirmed-transaction result tx-obj symbol amount) (check-queue) + (wallet/watch-tx result) #(when on-result {:dispatch (conj on-result result)})))) @@ -259,6 +261,7 @@ (fx/merge cofx {:db (dissoc db :signing/tx :signing/sign)} + (wallet/watch-tx transaction-hash) (if (keycard.common/keycard-multiaccount? db) (signing.keycard/hash-message {:data data @@ -335,7 +338,6 @@ [cofx response tx-obj hashed-password] (let [cofx-in-progress-false (assoc-in cofx [:db :signing/sign :in-progress?] false) {:keys [result error]} (types/json->clj response)] - (log/debug "transaction-completed" error tx-obj) (if error (transaction-error cofx-in-progress-false error) (if (:command? tx-obj) @@ -379,3 +381,90 @@ :data (abi-spec/encode method params)} :on-result on-result :on-error on-error})) + +(fx/defn sign-transaction-button-clicked-from-chat + {:events [:wallet.ui/sign-transaction-button-clicked-from-chat]} + [{:keys [db] :as cofx} {:keys [to amount from token]}] + (let [{:keys [symbol address]} token + amount-hex (str "0x" (abi-spec/number-to-hex amount)) + to-norm (ethereum/normalized-hex (if (string? to) to (:address to))) + from-address (:address from) + identity (:current-chat-id db) + db (dissoc db :wallet/prepare-transaction)] + (if to-norm + (fx/merge + cofx + {:db db} + (sign {:tx-obj (if (= symbol :ETH) + {:to to-norm + :from from-address + :chat-id identity + :command? true + :value amount-hex} + {:to (ethereum/normalized-hex address) + :from from-address + :chat-id identity + :command? true + :data (abi-spec/encode + "transfer(address,uint256)" + [to-norm amount-hex])})})) + {:db db + ::json-rpc/call + [{:method (json-rpc/call-ext-method "requestAddressForTransaction") + :params [(:current-chat-id db) + from-address + amount + (when-not (= symbol :ETH) + address)] + :on-success #(re-frame/dispatch [:transport/message-sent % 1])}]}))) + +(fx/defn sign-transaction-button-clicked-from-request + {:events [:wallet.ui/sign-transaction-button-clicked-from-request]} + [{:keys [db] :as cofx} {:keys [amount from token]}] + (let [{:keys [request-parameters chat-id]} (:wallet/prepare-transaction db) + {:keys [symbol address]} token + amount-hex (str "0x" (abi-spec/number-to-hex amount)) + to-norm (:address request-parameters) + from-address (:address from)] + (fx/merge cofx + {:db (dissoc db :wallet/prepare-transaction)} + (fn [cofx] + (sign + cofx + {:tx-obj (if (= symbol :ETH) + {:to to-norm + :from from-address + :message-id (:id request-parameters) + :chat-id chat-id + :command? true + :value amount-hex} + {:to (ethereum/normalized-hex address) + :from from-address + :command? true + :message-id (:id request-parameters) + :chat-id chat-id + :data (abi-spec/encode + "transfer(address,uint256)" + [to-norm amount-hex])})}))))) + +(fx/defn sign-transaction-button-clicked + {:events [:wallet.ui/sign-transaction-button-clicked]} + [{:keys [db] :as cofx} {:keys [to amount from token gas gasPrice]}] + (let [{:keys [symbol address]} token + amount-hex (str "0x" (abi-spec/number-to-hex amount)) + to-norm (ethereum/normalized-hex (if (string? to) to (:address to))) + from-address (:address from)] + (fx/merge cofx + {:db (dissoc db :wallet/prepare-transaction)} + (sign + {:tx-obj (merge {:from from-address + ;;gas and gasPrice from qr (eip681) + :gas gas + :gasPrice gasPrice} + (if (= symbol :ETH) + {:to to-norm + :value amount-hex} + {:to (ethereum/normalized-hex address) + :data (abi-spec/encode + "transfer(address,uint256)" + [to-norm amount-hex])}))})))) diff --git a/src/status_im/ui/screens/mobile_network_settings/events.cljs b/src/status_im/ui/screens/mobile_network_settings/events.cljs index c077d79230..f7e19997b9 100644 --- a/src/status_im/ui/screens/mobile_network_settings/events.cljs +++ b/src/status_im/ui/screens/mobile_network_settings/events.cljs @@ -37,7 +37,7 @@ logged-in? [(mailserver/process-next-messages-request) (bottom-sheet/hide-bottom-sheet) - (wallet/restart-wallet-service)])))) + (wallet/restart-wallet-service false false)])))) (defn apply-settings ([sync?] (apply-settings sync? :default)) @@ -62,7 +62,7 @@ (bottom-sheet/hide-bottom-sheet) (when (and cellular? sync?) (mailserver/process-next-messages-request)) - (wallet/restart-wallet-service)))))) + (wallet/restart-wallet-service false false)))))) (handlers/register-handler-fx :mobile-network/continue-syncing diff --git a/src/status_im/ui/screens/wallet/transactions/views.cljs b/src/status_im/ui/screens/wallet/transactions/views.cljs index f56cdd256f..a894d2b8d3 100644 --- a/src/status_im/ui/screens/wallet/transactions/views.cljs +++ b/src/status_im/ui/screens/wallet/transactions/views.cljs @@ -10,7 +10,8 @@ [status-im.ui.components.topbar :as topbar] [status-im.ui.screens.wallet.transactions.styles :as styles] [quo.core :as quo] - [status-im.ui.components.toolbar :as toolbar]) + [status-im.ui.components.toolbar :as toolbar] + [status-im.wallet.core :as wallet]) (:require-macros [status-im.utils.views :refer [defview letsubs]])) (defn- transaction-icon @@ -95,6 +96,20 @@ {:style {:color colors/blue}} (i18n/label :t/check-on-etherscan)]]])) +(defn refresh [] + [react/touchable-highlight + {:on-press #(re-frame/dispatch [::wallet/restart])} + [react/view + {:style {:flex 1 + :padding-horizontal 14 + :flex-direction :row + :align-items :center + :background-color colors/blue-light + :height 52}} + [react/text + {:style {:color colors/blue}} + (i18n/label :t/refresh)]]]) + (defn history-list [transactions-history-sections address] (let [fetching-recent-history? @(re-frame/subscribe [:wallet/fetching-recent-tx-history? address]) @@ -102,6 +117,7 @@ all-fetched? @(re-frame/subscribe [:wallet/tx-history-fetched? address])] [react/view components.styles/flex [etherscan-link address] + [refresh] (when fetching-recent-history? [react/view {:style {:flex 1 diff --git a/src/status_im/utils/utils.cljs b/src/status_im/utils/utils.cljs index 70955496fa..8f8aef2b6e 100644 --- a/src/status_im/utils/utils.cljs +++ b/src/status_im/utils/utils.cljs @@ -103,6 +103,13 @@ (defn clear-timeout [id] (.clearTimeout background-timer id)) +(re-frame/reg-fx + ::clear-timeouts + (fn [ids] + (doseq [id ids] + (when id + (clear-timeout id))))) + (defn set-interval [cb ms] (.setInterval background-timer cb ms)) @@ -121,4 +128,4 @@ (defn safe-replace [s m r] (when (string? s) - (string/replace s m r))) \ No newline at end of file + (string/replace s m r))) diff --git a/src/status_im/wallet/accounts/core.cljs b/src/status_im/wallet/accounts/core.cljs index 3307bfc880..4c34529bfa 100644 --- a/src/status_im/wallet/accounts/core.cljs +++ b/src/status_im/wallet/accounts/core.cljs @@ -183,7 +183,7 @@ (fx/merge cofx {::json-rpc/call [{:method "accounts_saveAccounts" :params [[account]] - :on-success #()}] + :on-success #(re-frame/dispatch [::wallet/restart])}] :db (-> db (assoc :multiaccount/accounts new-accounts) (dissoc :add-account))} diff --git a/src/status_im/wallet/core.cljs b/src/status_im/wallet/core.cljs index 7466cb2505..fd0dc4d6b8 100644 --- a/src/status_im/wallet/core.cljs +++ b/src/status_im/wallet/core.cljs @@ -16,8 +16,6 @@ [status-im.utils.utils :as utils.utils] [taoensso.timbre :as log] [status-im.wallet.db :as wallet.db] - [status-im.ethereum.abi-spec :as abi-spec] - [status-im.signing.core :as signing] [clojure.string :as string] [status-im.contact.db :as contact.db] [status-im.ethereum.ens :as ens] @@ -350,42 +348,6 @@ [{:keys [db]} amount] {:db (assoc-in db [:wallet/prepare-transaction :amount-text] amount)}) -(fx/defn sign-transaction-button-clicked-from-chat - {:events [:wallet.ui/sign-transaction-button-clicked-from-chat]} - [{:keys [db] :as cofx} {:keys [to amount from token]}] - (let [{:keys [symbol address]} token - amount-hex (str "0x" (abi-spec/number-to-hex amount)) - to-norm (ethereum/normalized-hex (if (string? to) to (:address to))) - from-address (:address from) - identity (:current-chat-id db) - db (dissoc db :wallet/prepare-transaction)] - (if to-norm - (fx/merge - cofx - {:db db} - (signing/sign {:tx-obj (if (= symbol :ETH) - {:to to-norm - :from from-address - :chat-id identity - :command? true - :value amount-hex} - {:to (ethereum/normalized-hex address) - :from from-address - :chat-id identity - :command? true - :data (abi-spec/encode - "transfer(address,uint256)" - [to-norm amount-hex])})})) - {:db db - ::json-rpc/call - [{:method (json-rpc/call-ext-method "requestAddressForTransaction") - :params [(:current-chat-id db) - from-address - amount - (when-not (= symbol :ETH) - address)] - :on-success #(re-frame/dispatch [:transport/message-sent % 1])}]}))) - (fx/defn request-transaction-button-clicked-from-chat {:events [:wallet.ui/request-transaction-button-clicked]} [{:keys [db] :as cofx} {:keys [to amount from token]}] @@ -430,57 +392,6 @@ :from-chat? true}) :dispatch [:navigate-to :prepare-send-transaction]})) -(fx/defn sign-transaction-button-clicked-from-request - {:events [:wallet.ui/sign-transaction-button-clicked-from-request]} - [{:keys [db] :as cofx} {:keys [amount from token]}] - (let [{:keys [request-parameters chat-id]} (:wallet/prepare-transaction db) - {:keys [symbol address]} token - amount-hex (str "0x" (abi-spec/number-to-hex amount)) - to-norm (:address request-parameters) - from-address (:address from)] - (fx/merge cofx - {:db (dissoc db :wallet/prepare-transaction)} - (fn [cofx] - (signing/sign - cofx - {:tx-obj (if (= symbol :ETH) - {:to to-norm - :from from-address - :message-id (:id request-parameters) - :chat-id chat-id - :command? true - :value amount-hex} - {:to (ethereum/normalized-hex address) - :from from-address - :command? true - :message-id (:id request-parameters) - :chat-id chat-id - :data (abi-spec/encode - "transfer(address,uint256)" - [to-norm amount-hex])})}))))) - -(fx/defn sign-transaction-button-clicked - {:events [:wallet.ui/sign-transaction-button-clicked]} - [{:keys [db] :as cofx} {:keys [to amount from token gas gasPrice]}] - (let [{:keys [symbol address]} token - amount-hex (str "0x" (abi-spec/number-to-hex amount)) - to-norm (ethereum/normalized-hex (if (string? to) to (:address to))) - from-address (:address from)] - (fx/merge cofx - {:db (dissoc db :wallet/prepare-transaction)} - (signing/sign - {:tx-obj (merge {:from from-address - ;;gas and gasPrice from qr (eip681) - :gas gas - :gasPrice gasPrice} - (if (= symbol :ETH) - {:to to-norm - :value amount-hex} - {:to (ethereum/normalized-hex address) - :data (abi-spec/encode - "transfer(address,uint256)" - [to-norm amount-hex])}))})))) - (fx/defn set-and-validate-amount-request {:events [:wallet.request/set-and-validate-amount]} [{:keys [db]} amount symbol decimals] @@ -629,28 +540,106 @@ (re-frame/reg-fx ::start-wallet - (fn [] - (log/info "start-wallet fx") - (status/start-wallet))) + (fn [watch-new-blocks?] + (log/info "start-wallet fx" watch-new-blocks?) + (status/start-wallet watch-new-blocks?))) + +(def ms-10-min (* 10 60 1000)) +(def ms-20-min (* 20 60 1000)) (fx/defn stop-wallet [{:keys [db] :as cofx}] - (let [] - {:db (assoc db :wallet-service/state :stopped) + (let [state (get db :wallet-service/state) + old-timeout (get db :wallet-service/restart-timeout) + timeout (or + old-timeout + (utils.utils/set-timeout + #(re-frame.core/dispatch [::restart]) + ms-20-min))] + {:db (-> db + (assoc :wallet-service/state :stopped) + (assoc :wallet-service/restart-timeout timeout)) ::stop-wallet nil})) (fx/defn start-wallet - [{:keys [db] :as cofx}] - (let [] - {:db (assoc db :wallet-service/state :started) - ::start-wallet nil})) + [{:keys [db] :as cofx} watch-new-blocks?] + (let [old-timeout (get db :wallet-service/restart-timeout) + state (get db :wallet-service/state) + timeout (utils.utils/set-timeout + #(re-frame.core/dispatch [::restart]) + ms-20-min)] + {:db (-> db + (assoc :wallet-service/state :started) + (assoc :wallet-service/restart-timeout timeout)) + ::start-wallet watch-new-blocks? + ::utils.utils/clear-timeouts + [old-timeout]})) (fx/defn restart-wallet-service - [{:keys [db] :as cofx}] - (when (:multiaccount db) - (let [syncing-allowed? (mobile-network-utils/syncing-allowed? cofx)] + [{:keys [db] :as cofx} force-start? watch-new-blocks?] + (when (or force-start? (:multiaccount db)) + (let [watching-txs? (get db :wallet/watch-txs) + waiting? (get db :wallet/waiting-for-recent-history?) + syncing-allowed? (mobile-network-utils/syncing-allowed? cofx)] (log/info "restart-wallet-service" - "syncing-allowed" syncing-allowed?) - (if syncing-allowed? - (start-wallet cofx) + "force-start?" force-start? + "watching-txs?" watching-txs? + "syncing-allowed?" syncing-allowed? + "watch-new-blocks?" watch-new-blocks?) + (if (and syncing-allowed? + (or + waiting? + force-start? + watching-txs?)) + (start-wallet cofx (boolean (or watch-new-blocks? watching-txs?))) (stop-wallet cofx))))) + +(fx/defn restart + {:events [::restart]} + [{:keys [db] :as cofx}] + (fx/merge + {:db (dissoc db :wallet-service/restart-timeout)} + (restart-wallet-service true false))) + +(fx/defn watch-tx + {:events [:watch-tx]} + [{:keys [db] :as cofx} tx-id] + (let [txs (get db :wallet/watch-txs) + old-timeout (get db :wallet-service/restart-timeout) + timeout (utils.utils/set-timeout + (fn [] + (re-frame.core/dispatch [::stop-watching-txs])) + ms-10-min)] + (fx/merge + {:db (-> db + (update :wallet/watch-txs (fnil conj #{}) tx-id) + (assoc :wallet/watch-txs-timeout timeout)) + ::utils.utils/clear-timeouts + [old-timeout]} + (restart-wallet-service true true)))) + +(fx/defn stop-watching-txs + {:events [::stop-watching-txs]} + [{:keys [db] :as cofx}] + (fx/merge + {:db (dissoc db + :wallet/watch-txs + :wallet/watch-txs-timeout)} + (restart-wallet-service false false))) + +(fx/defn stop-watching-tx + [{:keys [db] :as cofx} tx] + (let [txs (get db :wallet/watch-txs) + new-txs ((fnil disj #{}) txs tx)] + (when (get txs tx) + (if (empty? new-txs) + (stop-watching-txs cofx) + {:db (assoc db :wallet/watch-txs new-txs)})))) + +(fx/defn clear-timeouts + [{:keys [db]}] + (let [watch-timeout-id (get db :wallet/watch-txs-timeout) + restart-timeout-id (get db :wallet-service/restart-timeout)] + {:db (dissoc db :wallet/watch-txs-timeout + :wallet-service/restart-timeout) + ::utils.utils/clear-timeouts [watch-timeout-id restart-timeout-id]})) diff --git a/status-go-version.json b/status-go-version.json index 86d8587822..3fe7ab01c1 100644 --- a/status-go-version.json +++ b/status-go-version.json @@ -2,7 +2,7 @@ "_comment": "DO NOT EDIT THIS FILE BY HAND. USE 'scripts/update-status-go.sh ' instead", "owner": "status-im", "repo": "status-go", - "version": "v0.63.11", - "commit-sha1": "9814a9a5e76b6fe7d312f45bac41990bc0467d4d", - "src-sha256": "01j365ja4z6rm2hs5ck5az7wrx35v1sfwly8i0gldrisnnrh26dh" + "version": "v0.64.0", + "commit-sha1": "002f9a55974ee49ba2e66f7cee5a6e27a668a59a", + "src-sha256": "0rfl9j3sjavic0sp3jxf4z2p20blaipdc3r6svbnr2grkiadgn3f" } diff --git a/translations/en.json b/translations/en.json index d3834bb6ae..c3eae925f0 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1326,5 +1326,6 @@ "timeline": "Timeline", "ethereum-account": "Ethereum account", "ethereum-address":"Ethereum address", - "default-assets": "Default ERC20 and ERC721" + "default-assets": "Default ERC20 and ERC721", + "refresh": "Refresh" }