discover token from status-go
Signed-off-by: andrey <motor4ik@gmail.com>
This commit is contained in:
parent
c3e599721f
commit
2d6872976e
1
.env
1
.env
|
@ -2,7 +2,6 @@ CACHED_WEBVIEWS_ENABLED=1
|
|||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
DEV_BUILD=1
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
|
|
1
.env.e2e
1
.env.e2e
|
@ -1,6 +1,5 @@
|
|||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=testnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=1
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.staging
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
CACHED_WEBVIEWS_ENABLED=1
|
||||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=testnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
DEBUG_WEBVIEW=0
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=0
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
|
|
|
@ -94,37 +94,25 @@
|
|||
(common/set-on-card-connected :keycard/sign-typed-data)
|
||||
{:db (assoc-in db [:signing/sign :keycard-step] :signing)}))))
|
||||
|
||||
(fx/defn fetch-currency-symbol-on-success
|
||||
{:events [:keycard/fetch-currency-symbol-on-success]}
|
||||
[{:keys [db] :as cofx} currency]
|
||||
{:db (assoc-in db [:signing/sign :formatted-data :message :formatted-currency] currency)})
|
||||
|
||||
(fx/defn fetch-currency-decimals-on-success
|
||||
{:events [:keycard/fetch-currency-decimals-on-success]}
|
||||
[{:keys [db] :as cofx} decimals]
|
||||
{:db (update-in db [:signing/sign :formatted-data :message]
|
||||
#(assoc % :formatted-amount (.dividedBy ^js (money/bignumber (:amount %))
|
||||
(money/bignumber (money/from-decimal decimals)))))})
|
||||
(fx/defn fetch-currency-token-on-success
|
||||
{:events [:keycard/fetch-currency-token-on-success]}
|
||||
[{:keys [db]} {:keys [decimals symbol]}]
|
||||
{:db (-> db
|
||||
(assoc-in [:signing/sign :formatted-data :message :formatted-currency] symbol)
|
||||
(update-in [:signing/sign :formatted-data :message]
|
||||
#(assoc % :formatted-amount (.dividedBy ^js (money/bignumber (:amount %))
|
||||
(money/bignumber (money/from-decimal decimals))))))})
|
||||
|
||||
(fx/defn store-hash-and-sign-typed
|
||||
{:events [:keycard/store-hash-and-sign-typed]}
|
||||
[{:keys [db] :as cofx} result]
|
||||
(let [{:keys [result error]} (types/json->clj result)
|
||||
(let [{:keys [result]} (types/json->clj result)
|
||||
message (get-in db [:signing/sign :formatted-data :message])
|
||||
currency-contract (:currency message)]
|
||||
(when currency-contract
|
||||
(json-rpc/eth-call {:contract currency-contract
|
||||
:method "decimals()"
|
||||
:outputs ["uint8"]
|
||||
:on-success (fn [[decimals]]
|
||||
(re-frame/dispatch [:keycard/fetch-currency-decimals-on-success decimals]))})
|
||||
|
||||
(json-rpc/eth-call {:contract currency-contract
|
||||
:method "symbol()"
|
||||
:outputs ["string"]
|
||||
:on-success (fn [[currency]]
|
||||
(re-frame/dispatch [:keycard/fetch-currency-symbol-on-success currency]))}))
|
||||
|
||||
{::json-rpc/call [{:method "wallet_discoverToken"
|
||||
:params [(ethereum/chain-id db) currency-contract]
|
||||
:on-success #(re-frame/dispatch [:keycard/fetch-currency-token-on-success %])}]})
|
||||
(fx/merge cofx
|
||||
{:db (assoc-in db [:keycard :hash] result)}
|
||||
sign-typed-data)))
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
(def cached-webviews-enabled? (enabled? (get-config :CACHED_WEBVIEWS_ENABLED 0)))
|
||||
(def snoopy-enabled? (enabled? (get-config :SNOOPY 0)))
|
||||
(def dev-build? (enabled? (get-config :DEV_BUILD 0)))
|
||||
(def erc20-contract-warnings-enabled? (enabled? (get-config :ERC20_CONTRACT_WARNINGS)))
|
||||
(def tr-to-talk-enabled? (enabled? (get-config :TRIBUTE_TO_TALK 0)))
|
||||
(def max-message-delivery-attempts (js/parseInt (get-config :MAX_MESSAGE_DELIVERY_ATTEMPTS "6")))
|
||||
(def max-images-batch (js/parseInt (get-config :MAX_IMAGES_BATCH "1")))
|
||||
|
|
|
@ -87,82 +87,11 @@
|
|||
[cofx hash address]
|
||||
(navigation/navigate-to-cofx cofx :wallet-transaction-details {:hash hash :address address}))
|
||||
|
||||
(defn- validate-token-name!
|
||||
[{:keys [address symbol name]}]
|
||||
(json-rpc/eth-call
|
||||
{:contract address
|
||||
:method "name()"
|
||||
:outputs ["string"]
|
||||
:on-success
|
||||
(fn [[contract-name]]
|
||||
(when (and (seq contract-name)
|
||||
(not= name contract-name))
|
||||
(let [message (i18n/label :t/token-auto-validate-name-error
|
||||
{:symbol symbol
|
||||
:expected name
|
||||
:actual contract-name
|
||||
:address address})]
|
||||
(log/warn message)
|
||||
(utils.utils/show-popup (i18n/label :t/warning) message))))}))
|
||||
|
||||
(defn- validate-token-symbol!
|
||||
[{:keys [address symbol]}]
|
||||
(when-not (or (= symbol :DCN) (= symbol :SUPRR)) ;; ignore this symbol because it has weird symbol
|
||||
(json-rpc/eth-call
|
||||
{:contract address
|
||||
:method "symbol()"
|
||||
:outputs ["string"]
|
||||
:on-success
|
||||
(fn [[contract-symbol]]
|
||||
;;NOTE(goranjovic): skipping check if field not set in contract
|
||||
(when (and (seq contract-symbol)
|
||||
(not= (clojure.core/name symbol) contract-symbol))
|
||||
(let [message (i18n/label :t/token-auto-validate-symbol-error
|
||||
{:symbol symbol
|
||||
:expected (clojure.core/name symbol)
|
||||
:actual contract-symbol
|
||||
:address address})]
|
||||
(log/warn message)
|
||||
(utils.utils/show-popup (i18n/label :t/warning) message))))})))
|
||||
|
||||
(defn- validate-token-decimals!
|
||||
[{:keys [address symbol decimals nft?]}]
|
||||
(when-not nft?
|
||||
(json-rpc/eth-call
|
||||
{:contract address
|
||||
:method "decimals()"
|
||||
:outputs ["uint256"]
|
||||
:on-success
|
||||
(fn [[contract-decimals]]
|
||||
(when (and (not (nil? contract-decimals))
|
||||
(not= decimals contract-decimals))
|
||||
(let [message (i18n/label :t/token-auto-validate-decimals-error
|
||||
{:symbol symbol
|
||||
:expected decimals
|
||||
:actual contract-decimals
|
||||
:address address})]
|
||||
(log/warn message)
|
||||
(utils.utils/show-popup (i18n/label :t/warning) message))))})))
|
||||
|
||||
(defn dups [seq]
|
||||
(for [[id freq] (frequencies seq)
|
||||
:when (> freq 1)]
|
||||
id))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet/validate-tokens
|
||||
(fn [[tokens all-default-tokens]]
|
||||
(let [symb-dups (dups (map :symbol all-default-tokens))
|
||||
addr-dups (dups (map :address all-default-tokens))]
|
||||
(when (seq symb-dups)
|
||||
(utils.utils/show-popup (i18n/label :t/warning) (str "Duplicated tokens symbols" symb-dups)))
|
||||
(when (seq addr-dups)
|
||||
(utils.utils/show-popup (i18n/label :t/warning) (str "Duplicated tokens addresses" addr-dups)))
|
||||
(doseq [token (vals tokens)]
|
||||
(validate-token-decimals! token)
|
||||
(validate-token-symbol! token)
|
||||
(validate-token-name! token)))))
|
||||
|
||||
(defn- clean-up-results
|
||||
"remove empty balances
|
||||
if there is no visible assets, returns all positive balances
|
||||
|
@ -277,10 +206,7 @@
|
|||
(let [default-tokens (utils.core/index-by :address tokens)
|
||||
;;we want to override custom-tokens by default
|
||||
all-tokens (merge (rpc->token custom-tokens) default-tokens)]
|
||||
(merge
|
||||
{:db (assoc db :wallet/all-tokens all-tokens)}
|
||||
(when config/erc20-contract-warnings-enabled?
|
||||
{:wallet/validate-tokens [default-tokens tokens]}))))
|
||||
{:db (assoc db :wallet/all-tokens all-tokens)}))
|
||||
|
||||
(fx/defn initialize-favourites
|
||||
[{:keys [db]} favourites]
|
||||
|
|
|
@ -7,101 +7,21 @@
|
|||
[quo.design-system.colors :as colors]
|
||||
[status-im.ui.components.react :as react]
|
||||
[status-im.utils.fx :as fx]
|
||||
[status-im.utils.money :as money]
|
||||
[status-im.wallet.core :as wallet]
|
||||
[status-im.navigation :as navigation]
|
||||
[status-im.wallet.prices :as prices]))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/get-decimals
|
||||
(fn [contract]
|
||||
(json-rpc/eth-call
|
||||
{:contract contract
|
||||
:method "decimals()"
|
||||
:outputs ["uint256"]
|
||||
:on-error #(re-frame/dispatch [:wallet.custom-token/not-supported])
|
||||
:on-success
|
||||
(fn [[contract-decimals]]
|
||||
(re-frame/dispatch [:wallet.custom-token/decimals-result
|
||||
contract-decimals]))})))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/get-symbol
|
||||
(fn [contract]
|
||||
(json-rpc/eth-call
|
||||
{:contract contract
|
||||
:method "symbol()"
|
||||
:outputs ["string"]
|
||||
:on-error #(re-frame/dispatch [:wallet.custom-token/not-supported])
|
||||
:on-success
|
||||
(fn [[contract-symbol]]
|
||||
(re-frame/dispatch [:wallet.custom-token/symbol-result
|
||||
contract
|
||||
contract-symbol]))})))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/get-balance
|
||||
(fn [[contract wallet-address]]
|
||||
(json-rpc/eth-call
|
||||
{:contract contract
|
||||
:method "balanceOf(address)"
|
||||
:params [wallet-address]
|
||||
:outputs ["uint256"]
|
||||
:on-success
|
||||
(fn [[balance]]
|
||||
(re-frame/dispatch [:wallet.custom-token/balance-result
|
||||
contract
|
||||
(money/bignumber balance)]))})))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/get-name
|
||||
(fn [contract]
|
||||
(json-rpc/eth-call
|
||||
{:contract contract
|
||||
:method "name()"
|
||||
:outputs ["string"]
|
||||
:on-error #(re-frame/dispatch [:wallet.custom-token/not-supported])
|
||||
:on-success
|
||||
(fn [[contract-name]]
|
||||
(re-frame/dispatch [:wallet.custom-token/name-result
|
||||
contract
|
||||
contract-name]))})))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/get-total-supply
|
||||
(fn [contract]
|
||||
(json-rpc/eth-call
|
||||
{:contract contract
|
||||
:method "totalSupply()"
|
||||
:outputs ["uint256"]
|
||||
:on-success
|
||||
(fn [[contract-total-supply]]
|
||||
(re-frame/dispatch [:wallet.custom-token/total-supply-result
|
||||
contract
|
||||
(money/bignumber contract-total-supply)]))})))
|
||||
|
||||
(re-frame/reg-fx
|
||||
:wallet.custom-token/contract-address-paste
|
||||
(fn []
|
||||
(react/get-from-clipboard
|
||||
#(re-frame/dispatch [:wallet.custom-token/contract-address-is-pasted
|
||||
(string/trim %)]))))
|
||||
#(re-frame/dispatch [:wallet.custom-token/contract-address-is-pasted (string/trim %)]))))
|
||||
|
||||
(defn field-exists?
|
||||
[{:wallet/keys [all-tokens]} field-key field-value]
|
||||
(some #(= field-value (get % field-key))
|
||||
(vals all-tokens)))
|
||||
|
||||
(fx/defn total-supply-result
|
||||
{:events [:wallet.custom-token/total-supply-result]}
|
||||
[{:keys [db]} contract total-supply]
|
||||
(if (money/valid? total-supply)
|
||||
{:wallet.custom-token/get-name contract}
|
||||
{:db (update db
|
||||
:wallet/custom-token-screen
|
||||
merge {:in-progress? nil
|
||||
:error (i18n/label :t/wrong-contract)})}))
|
||||
|
||||
(defn token-in-list?
|
||||
[{:wallet/keys [all-tokens]} contract]
|
||||
(not (nil? (get all-tokens (string/lower-case contract)))))
|
||||
|
@ -117,40 +37,27 @@
|
|||
{:db (assoc db
|
||||
:wallet/custom-token-screen
|
||||
{:contract contract :in-progress? true})
|
||||
:wallet.custom-token/get-total-supply contract})
|
||||
::json-rpc/call [{:method "wallet_discoverToken"
|
||||
:params [(ethereum/chain-id db) contract]
|
||||
:on-success #(re-frame/dispatch [:wallet.custom-token/token-discover-result %])
|
||||
:on-error #(re-frame/dispatch [:wallet.custom-token/not-supported])}]})
|
||||
{:db (assoc db
|
||||
:wallet/custom-token-screen
|
||||
{:contract contract
|
||||
:error (i18n/label :t/wrong-address)})}))
|
||||
|
||||
(fx/defn decimals-result
|
||||
{:events [:wallet.custom-token/decimals-result]}
|
||||
[{:keys [db]} result]
|
||||
{:db (update db
|
||||
:wallet/custom-token-screen
|
||||
merge
|
||||
{:decimals (str result)
|
||||
:in-progress? nil})})
|
||||
|
||||
(fx/defn symbol-result
|
||||
{:events [:wallet.custom-token/symbol-result]}
|
||||
[{:keys [db]} contract token-symbol]
|
||||
(let [symbol-exists? (field-exists? db :symbol (keyword token-symbol))]
|
||||
{:db
|
||||
(update db
|
||||
:wallet/custom-token-screen merge
|
||||
{:symbol token-symbol
|
||||
:error-symbol (when symbol-exists?
|
||||
(i18n/label :t/you-already-have-an-asset {:value token-symbol}))})
|
||||
:wallet.custom-token/get-decimals
|
||||
contract}))
|
||||
|
||||
(fx/defn name-result
|
||||
{:events [:wallet.custom-token/name-result]}
|
||||
[{:keys [db]} contract token-name]
|
||||
{:db
|
||||
(update db :wallet/custom-token-screen merge {:name token-name})
|
||||
:wallet.custom-token/get-symbol contract})
|
||||
(fx/defn token-discover-result
|
||||
{:events [:wallet.custom-token/token-discover-result]}
|
||||
[{:keys [db]} {:keys [name symbol decimals]}]
|
||||
(let [symbol-exists? (field-exists? db :symbol (keyword symbol))]
|
||||
{:db (update db
|
||||
:wallet/custom-token-screen merge
|
||||
{:name name
|
||||
:symbol symbol
|
||||
:error-symbol (when symbol-exists?
|
||||
(i18n/label :t/you-already-have-an-asset {:value symbol}))
|
||||
:decimals (str decimals)
|
||||
:in-progress? nil})}))
|
||||
|
||||
(fx/defn not-supported
|
||||
{:events [:wallet.custom-token/not-supported]}
|
||||
|
@ -158,20 +65,6 @@
|
|||
{:db (assoc-in db [:wallet/custom-token-screen :in-progress?] nil)
|
||||
:utils/show-popup {:content (i18n/label :t/contract-isnt-supported)}})
|
||||
|
||||
(fx/defn balance-result
|
||||
{:events [:wallet.custom-token/balance-result]}
|
||||
[{:keys [db]} contract balance]
|
||||
(if (money/valid? balance)
|
||||
{:db (assoc-in db
|
||||
[:wallet/custom-token-screen :balance]
|
||||
(str balance))
|
||||
:wallet.custom-token/get-name contract}
|
||||
{:db (update db
|
||||
:wallet/custom-token-screen
|
||||
merge
|
||||
{:in-progress? nil
|
||||
:error (i18n/label :t/wrong-contract)})}))
|
||||
|
||||
(fx/defn add-custom-token
|
||||
{:events [:wallet.custom-token.ui/add-pressed]}
|
||||
[{:keys [db] :as cofx}]
|
||||
|
|
Loading…
Reference in New Issue