[#9280] Add retries on error when fetching balances

This commit is contained in:
Roman Volosovskyi 2020-01-24 16:10:58 +02:00
parent 5a64745fce
commit ea02f8e3cf
No known key found for this signature in database
GPG Key ID: 0238A4B5ECEE70DE
1 changed files with 44 additions and 25 deletions

View File

@ -27,24 +27,31 @@
[status-im.ethereum.stateofus :as stateofus] [status-im.ethereum.stateofus :as stateofus]
[status-im.ui.components.bottom-sheet.core :as bottom-sheet])) [status-im.ui.components.bottom-sheet.core :as bottom-sheet]))
(re-frame/reg-fx (defn get-balance
:wallet/get-balance [{:keys [address on-success on-error number-of-retries]
(fn [{:keys [account-address on-success on-error]}] :as params
(json-rpc/call :or {number-of-retries 4}}]
{:method "eth_getBalance" (log/debug "[wallet] get-balance"
:params [account-address "latest"] "address" address
:on-success on-success "number-of-retries" number-of-retries)
:on-error on-error}))) (json-rpc/call
{:method "eth_getBalance"
:params [address "latest"]
:on-success on-success
:on-error (fn [error]
(if (zero? number-of-retries)
(on-error error)
(get-balance
(update params :number-of-retries dec))))}))
(re-frame/reg-fx (re-frame/reg-fx
:wallet/get-balances :wallet/get-balances
(fn [addresses] (fn [addresses]
(doseq [address addresses] (doseq [address addresses]
(json-rpc/call (get-balance
{:method "eth_getBalance" {:address address
:params [address "latest"]
:on-success #(re-frame/dispatch [::update-balance-success address %]) :on-success #(re-frame/dispatch [::update-balance-success address %])
:on-error #(re-frame/dispatch [::update-balance-fail %])})))) :on-error #(re-frame/dispatch [::update-balance-fail %])}))))
;; TODO(oskarth): At some point we want to get list of relevant ;; TODO(oskarth): At some point we want to get list of relevant
;; assets to get prices for ;; assets to get prices for
@ -175,21 +182,33 @@
(when (not-empty balances) (when (not-empty balances)
balances))) balances)))
(defn get-token-balances
[{:keys [addresses tokens init? assets number-of-retries]
:as params
:or {number-of-retries 4}}]
(log/debug "[wallet] get-token-balances"
"addresses" addresses
"number-of-retries" number-of-retries)
(json-rpc/call
{:method "wallet_getTokensBalances"
:params [addresses (keys tokens)]
:on-success
(fn [results]
(when-let [balances (clean-up-results results tokens (if init? nil assets))]
(re-frame/dispatch (if init?
;; NOTE: when there it is not a visible
;; assets we make an initialization round
[::tokens-found balances]
[::update-tokens-balances-success balances]))))
:on-error
(fn [error]
(if (zero? number-of-retries)
(re-frame/dispatch [::update-token-balance-fail error])
(get-token-balances (update params :number-of-retries dec))))}))
(re-frame/reg-fx (re-frame/reg-fx
:wallet/get-tokens-balances :wallet/get-tokens-balances
(fn [{:keys [addresses tokens init? assets]}] get-token-balances)
(json-rpc/call
{:method "wallet_getTokensBalances"
:params [addresses (keys tokens)]
:on-success
(fn [results]
(when-let [balances (clean-up-results results tokens (if init? nil assets))]
(re-frame/dispatch (if init?
;; NOTE: when there it is not a visible
;; assets we make an initialization round
[::tokens-found balances]
[::update-tokens-balances-success balances]))))
:on-error #(re-frame/dispatch [::update-token-balance-fail %])})))
(defn clear-error-message [db error-type] (defn clear-error-message [db error-type]
(update-in db [:wallet :errors] dissoc error-type)) (update-in db [:wallet :errors] dissoc error-type))