[#17410] migrate status-im.ethereum.core (#17422)

This commit is contained in:
flexsurfer 2023-09-27 11:57:51 +02:00 committed by GitHub
parent 4152b9318b
commit a847f508f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 479 additions and 571 deletions

View File

@ -136,11 +136,6 @@ quo.animated/re-timing
quo.design-system.colors/white
quo.design-system.colors/black
status-im.transport.core-test/messages
status-im.ethereum.core/sidechain?
status-im.ethereum.core/network-with-upstream-rpc?
status-im.ethereum.core/current-address
status-im.ethereum.core/network->network-name
status-im.ethereum.core/estimate-gas
quo.core/animated-header
quo.core/safe-area-provider
quo.core/safe-area-consumer

View File

@ -470,7 +470,8 @@
(defn sha3
[s]
(log/debug "[native-module] sha3")
(.sha3 ^js (status) s))
(when s
(.sha3 ^js (status) (str s))))
(defn utf8-to-hex
[s]
@ -491,8 +492,9 @@
(defn address?
[address]
(log/debug "[native-module] address?")
(let [result (.isAddress ^js (status) address)]
(types/json->clj result)))
(when address
(let [result (.isAddress ^js (status) address)]
(types/json->clj result))))
(defn to-checksum-address
[address]

View File

@ -9,7 +9,6 @@
[status-im.browser.permissions :as browser.permissions]
[status-im.browser.webview-ref :as webview-ref]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]
[utils.i18n :as i18n]
[status-im.multiaccounts.update.core :as multiaccounts.update]
@ -25,7 +24,9 @@
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[utils.debounce :as debounce]
[utils.security.core :as security]))
[utils.security.core :as security]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(rf/defn update-browser-option
[{:keys [db]} option-key option-value]
@ -91,7 +92,7 @@
host (url/url-host current-url)]
(if (and (not resolved-url) (ens/is-valid-eth-name? host))
{:db (update db :browser/options assoc :resolving? true)
:browser/resolve-ens-contenthash {:chain-id (ethereum/chain-id db)
:browser/resolve-ens-contenthash {:chain-id (chain/chain-id db)
:ens-name host
:cb resolve-ens-contenthash-callback}}
{:db (update db :browser/options assoc :url (or resolved-url current-url) :resolving? false)}))))
@ -352,12 +353,19 @@
:id (int id)
:result result}}})
(defn utf8-to-hex
[s]
(let [hex (native-module/utf8-to-hex (str s))]
(if (empty? hex)
nil
hex)))
(defn normalize-message
"NOTE (andrey) there is no spec for this, so this implementation just to be compatible with MM"
[message]
(if (string/starts-with? message "0x")
message
(ethereum/utf8-to-hex message)))
(utf8-to-hex message)))
(defn normalize-sign-message-params
"NOTE (andrey) we need this function, because params may be mixed up"
@ -365,9 +373,9 @@
(let [[first-param second-param] params]
(when (and (string? first-param) (string? second-param))
(cond
(ethereum/address? first-param)
(address/address? first-param)
[first-param (if typed? second-param (normalize-message second-param))]
(ethereum/address? second-param)
(address/address? second-param)
[second-param (if typed? first-param (normalize-message first-param))]))))
(rf/defn send-to-bridge

View File

@ -2,9 +2,9 @@
;(`wallet_switchEthereumChain`)
(ns status-im.browser.eip3326
(:require [status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ui.screens.browser.eip3326.sheet :as sheet]
[utils.re-frame :as rf]))
[utils.re-frame :as rf]
[utils.ethereum.chain :as chain]))
(rf/defn deny-permission
{:events [:eip3326.ui/dapp-permission-denied]}
@ -20,8 +20,8 @@
[{:keys [db] :as cofx} dapp-name id message-id {:keys [chainId] :as params}]
(let [target-chain-id (js/parseInt chainId 16)
networks (vals (get-in db [:networks/networks]))
exist-chain-ids (set (map ethereum/network->chain-id networks))
current-chain-id (ethereum/chain-id db)]
exist-chain-ids (set (map chain/network->chain-id networks))
current-chain-id (chain/chain-id db)]
(if (exist-chain-ids target-chain-id)
(if (= current-chain-id target-chain-id)
{:browser/send-to-bridge {:type constants/web3-send-async-callback
@ -29,10 +29,10 @@
:result {:jsonrpc "2.0"
:id (int id)
:result nil}}}
(let [target-network (first (filter #(= (ethereum/network->chain-id %1) target-chain-id)
(let [target-network (first (filter #(= (chain/network->chain-id %1) target-chain-id)
networks))
target-network-id (:id target-network)
current-network (ethereum/current-network db)
current-network (chain/current-network db)
network-from (:name current-network)
network-to (:name target-network)
params (assoc params

View File

@ -1,7 +1,7 @@
(ns status-im.commands.core
(:require [re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[utils.re-frame :as rf]))
[utils.re-frame :as rf]
[status-im.wallet.utils :as wallet.utils]))
(rf/defn handle-prepare-accept-request-address-for-transaction
{:events [::prepare-accept-request-address-for-transaction]}
@ -9,7 +9,8 @@
{:db (assoc db
:commands/select-account
{:message message
:from (ethereum/get-default-account (:profile/wallet-accounts db))})
:from (wallet.utils/get-default-account (:profile/wallet-accounts
db))})
:show-select-acc-sheet nil})
(rf/defn set-selected-account

View File

@ -2,8 +2,8 @@
(:require [clojure.set :as set]
[clojure.string :as string]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.utils.gfycat.core :as gfycat]))
[status-im.utils.gfycat.core :as gfycat]
[utils.address :as address]))
(defn public-key->new-contact
[public-key]
@ -31,7 +31,7 @@
(defn- contact-by-address
[[addr contact] address]
(when (ethereum/address= addr address)
(when (address/address= addr address)
contact))
(defn find-contact-by-address

View File

@ -1,6 +1,6 @@
(ns status-im.data-store.settings
(:require [status-im.data-store.visibility-status-updates :as visibility-status-updates]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im2.config :as config]
[clojure.set :as set]))

View File

@ -5,8 +5,7 @@
[clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.stateofus :as stateofus]
[status-im.multiaccounts.update.core :as multiaccounts.update]
@ -15,7 +14,9 @@
[status-im.utils.random :as random]
[status-im2.navigation.events :as navigation]
[status-im2.constants :as constants]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]
[status-im.wallet.utils :as wallet.utils]))
(defn fullname
[custom-domain? username]
@ -102,7 +103,7 @@
[{:keys [db] :as cofx} custom-domain? username redirect-to-summary? connected?]
(let [name (fullname custom-domain? username)
names (get-in db [:ens/names] [])
chain-id (ethereum/chain-id db)]
chain-id (chain/chain-id db)]
(rf/merge cofx
(cond-> {:dispatch-n [[:ens/update-usernames [{:username name :chain-id chain-id}]]]}
connected? (assoc :json-rpc/call
@ -124,9 +125,9 @@
{:events [::set-pub-key]}
[{:keys [db]}]
(let [{:keys [username address custom-domain?]} (:ens/registration db)
address (or address (ethereum/default-address db))
address (or address (wallet.utils/default-address db))
{:keys [public-key]} (:profile/profile db)
chain-id (ethereum/chain-id db)
chain-id (chain/chain-id db)
username (fullname custom-domain? username)]
{:db (assoc-in db [:ens/registration :action] constants/ens-action-type-set-pub-key)
:json-rpc/call [{:method "ens_setPubKeyPrepareTx"
@ -192,7 +193,7 @@
(let [{:keys [username]}
(:ens/registration db)
{:keys [public-key]} (:profile/profile db)
chain-id (ethereum/chain-id db)]
chain-id (chain/chain-id db)]
{:db (assoc-in db [:ens/registration :action] constants/ens-action-type-register)
:json-rpc/call [{:method "ens_registerPrepareTx"
:params [chain-id {:from address} username public-key]
@ -225,6 +226,12 @@
:searching)
:else :invalid))
(defn addresses-without-watch
[db]
(into #{}
(remove #(= (:type %) :watch)
(map #(eip55/address->checksum (:address %)) (get db :profile/wallet-accounts)))))
;;NOTE we want to handle only last resolve
(def resolve-last-id (atom nil))
@ -243,8 +250,8 @@
(when (= state :searching)
(let [{:profile/keys [profile]} db
{:keys [public-key]} profile
addresses (ethereum/addresses-without-watch db)
chain-id (ethereum/chain-id db)]
addresses (addresses-without-watch db)
chain-id (chain/chain-id db)]
{::resolve-owner [chain-id
(fullname custom-domain? username)
#(on-resolve-owner
@ -266,8 +273,8 @@
;; we reset navigation so that navigate back doesn't return
;; into the registration flow
(navigation/navigate-back-to :my-profile)
(navigation/navigate-to :ens-main {})
))
(navigation/navigate-to :ens-main {})))
(rf/defn switch-domain-type
{:events [::switch-domain-type]}
@ -320,7 +327,7 @@
(rf/defn navigate-to-name
{:events [::navigate-to-name]}
[{:keys [db] :as cofx} username]
(let [chain-id (ethereum/chain-id db)]
(let [chain-id (chain/chain-id db)]
(rf/merge cofx
{::get-expiration-time
[chain-id

View File

@ -1,21 +0,0 @@
(ns status-im.ethereum.contracts
(:require [status-im.ethereum.core :as ethereum]))
(def contracts
{:status/snt
{:mainnet "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
:goerli "0x3D6AFAA395C31FCd391fE3D562E75fe9E8ec7E6a"}
:status/stickers
{:mainnet "0x0577215622f43a39f4bc9640806dfea9b10d2a36"
:goerli "0x07f7CB0C0a4ab3e0999AfE8b3997Da34880f05d0"}
:status/sticker-market
{:mainnet "0x12824271339304d3a9f7e096e62a2a7e73b4a7e7"
:goerli "0xf1E149A7DF70D5Ff1E265daAa738d785D3274717"}
:status/sticker-pack
{:mainnet "0x110101156e8F0743948B2A61aFcf3994A8Fb172e"
:goerli "0x8D3fD2EA24bD53a8Bd2b1026727db8bbe9A8C8Af"}})
(defn get-address
[db contract]
(let [chain-keyword (ethereum/chain-keyword db)]
(get-in contracts [contract chain-keyword])))

View File

@ -1,202 +0,0 @@
(ns status-im.ethereum.core
(:require [clojure.string :as string]
[status-im.ethereum.eip55 :as eip55]
[native-module.core :as native-module]))
(defn sha3
[s]
(when s
(native-module/sha3 (str s))))
(defn utf8-to-hex
[s]
(let [hex (native-module/utf8-to-hex (str s))]
(if (empty? hex)
nil
hex)))
(defn hex-to-utf8
[s]
(let [utf8 (native-module/hex-to-utf8 s)]
(if (empty? utf8)
nil
utf8)))
(def BSC-mainnet-chain-id 56)
(def BSC-testnet-chain-id 97)
;; IDs standardized in https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids
(def chains
{:mainnet {:id 1 :name "Mainnet"}
:xdai {:id 100 :name "xDai"}
:goerli {:id 5 :name "Goerli"}
:bsc {:id BSC-mainnet-chain-id
:name "BSC"}
:bsc-testnet {:id BSC-testnet-chain-id
:name "BSC tetnet"}})
(defn chain-id->chain-keyword
[i]
(or (some #(when (= i (:id (val %))) (key %)) chains)
:custom))
(defn chain-id->chain-name
[i]
(or (some #(when (= i (:id (val %))) (:name (val %))) chains)
:custom))
(defn chain-keyword->chain-id
[k]
(get-in chains [k :id]))
(defn chain-keyword->snt-symbol
[k]
(case k
:mainnet :SNT
:STT))
(defn testnet?
[id]
(contains? #{(chain-keyword->chain-id :goerli)
(chain-keyword->chain-id :bsc-testnet)}
id))
(defn sidechain?
[id]
(contains? #{(chain-keyword->chain-id :xdai)
(chain-keyword->chain-id :bsc)}
id))
(defn network-with-upstream-rpc?
[network]
(get-in network [:config :UpstreamConfig :Enabled]))
(def hex-prefix "0x")
(defn normalized-hex
[hex]
(when hex
(if (string/starts-with? hex hex-prefix)
hex
(str hex-prefix hex))))
(defn current-address
[db]
(-> (get-in db [:profile/profile :address])
normalized-hex))
(defn get-default-account
[accounts]
(some #(when (:wallet %) %) accounts))
(defn default-address
[db]
(-> (get db :profile/wallet-accounts)
get-default-account
:address))
(defn addresses-without-watch
[db]
(into #{}
(remove #(= (:type %) :watch)
(map #(eip55/address->checksum (:address %)) (get db :profile/wallet-accounts)))))
(defn naked-address
[s]
(when s
(string/replace s hex-prefix "")))
(def public-key-length 128)
(defn coordinates
[public-key]
(when-let [hex (naked-address public-key)]
(when (= public-key-length (count (subs hex 2)))
{:x (normalized-hex (subs hex 2 66))
:y (normalized-hex (subs hex 66))})))
(defn address?
[s]
(when s
(native-module/address? s)))
(defn network->chain-id
[network]
(get-in network [:config :NetworkId]))
(defn network->chain-keyword
[network]
(chain-id->chain-keyword (network->chain-id network)))
(defn current-network
[db]
(let [networks (get db :networks/networks)
network-id (get db :networks/current-network)]
(get networks network-id)))
(defn binance-chain-id?
[chain-id]
(or (= BSC-mainnet-chain-id chain-id)
(= BSC-testnet-chain-id chain-id)))
(defn binance-chain?
[db]
(-> db
current-network
network->chain-id
binance-chain-id?))
(def custom-rpc-node-id-len 45)
(defn custom-rpc-node?
[{:keys [id]}]
(= custom-rpc-node-id-len (count id)))
(defn network->network-name
[network]
(chain-id->chain-name (network->chain-id network)))
(defn network->chain-name
[network]
(-> network
network->chain-keyword
name))
(defn get-current-network
[m]
(get (:networks/networks m) (:networks/current-network m)))
(defn chain-keyword
[db]
(network->chain-keyword (get-current-network db)))
(defn chain-id
[db]
(network->chain-id (get-current-network db)))
(defn snt-symbol
[db]
(chain-keyword->snt-symbol (chain-keyword db)))
(defn address=
[address1 address2]
(and address1
address2
(= (string/lower-case (normalized-hex address1))
(string/lower-case (normalized-hex address2)))))
(defn public-key->address
[public-key]
(let [length (count public-key)
normalized-key (case length
132 (str "0x" (subs public-key 4))
130 public-key
128 (str "0x" public-key)
nil)]
(when normalized-key
(subs (sha3 normalized-key) 26))))
(defn hex->text
"Converts a hexstring to UTF8 text."
[data]
(or (hex-to-utf8 data) data))

View File

@ -1,16 +0,0 @@
(ns status-im.ethereum.core-test
(:require [cljs.test :refer-macros [deftest is]]
[status-im.ethereum.core :as ethereum]))
(deftest chain-id->chain-keyword
(is (= (ethereum/chain-id->chain-keyword 1) :mainnet))
(is (= (ethereum/chain-id->chain-keyword 5) :goerli))
(is (= (ethereum/chain-id->chain-keyword 5777) :custom)))
(deftest coordinates
(is
(=
{:x "0x46fa4851f3cccd01e3b8d96c130c00bf812502354939eacf06a68fa519ebcbd1"
:y "0xeb08bebe7403856c0d9686210b9b2e324aa0179747bbba56d53f304a002f31c3"}
(ethereum/coordinates
"0x0446fa4851f3cccd01e3b8d96c130c00bf812502354939eacf06a68fa519ebcbd1eb08bebe7403856c0d9686210b9b2e324aa0179747bbba56d53f304a002f31c3"))))

View File

@ -5,10 +5,11 @@
e.g. ethereum:0x1234@1/transfer?to=0x5678&value=1e18&gas=5000"
(:require [clojure.string :as string]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.tokens :as tokens]
[utils.money :as money]))
[utils.money :as money]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(def scheme "ethereum")
(def scheme-separator ":")
@ -64,16 +65,16 @@
Invalid URI will be parsed as `nil`."
[s]
(when (string? s)
(if (ethereum/address? s)
(if (address/address? s)
{:address s}
(let [[_ authority-path query] (re-find uri-pattern s)]
(when authority-path
(let [[_ raw-address chain-id function-name] (re-find authority-path-pattern authority-path)]
(when (or (or (ens/is-valid-eth-name? raw-address) (ethereum/address? raw-address))
(when (or (or (ens/is-valid-eth-name? raw-address) (address/address? raw-address))
(when (string/starts-with? raw-address "pay-")
(let [pay-address (string/replace-first raw-address "pay-" "")]
(or (ens/is-valid-eth-name? pay-address)
(ethereum/address? pay-address)))))
(address/address? pay-address)))))
(let [address (if (string/starts-with? raw-address "pay-")
(string/replace-first raw-address "pay-" "")
raw-address)]
@ -81,12 +82,12 @@
(let [contract-address (get-in arguments [:function-arguments :address])]
(if-not (or (not contract-address)
(or (ens/is-valid-eth-name? contract-address)
(ethereum/address? contract-address)))
(address/address? contract-address)))
nil
(merge {:address address
:chain-id (if chain-id
(js/parseInt chain-id)
(ethereum/chain-keyword->chain-id :mainnet))}
(chain/chain-keyword->chain-id :mainnet))}
arguments))))))))))))
(defn parse-eth-value
@ -124,12 +125,12 @@
"Generate a EIP 681 URI based on `address` and a map (keywords / {bignumbers/strings} ) of extra properties.
No validation of address format is performed."
[address {:keys [chain-id function-name function-arguments] :as m}]
(when (ethereum/address? address)
(when (address/address? address)
(let [parameters (dissoc (into {} (filter second m)) :chain-id)] ;; filter nil values
(str scheme
scheme-separator
address
(when (and chain-id (not= chain-id (ethereum/chain-keyword->chain-id :mainnet)))
(when (and chain-id (not= chain-id (chain/chain-keyword->chain-id :mainnet)))
;; Add chain-id if specified and is not main-net
(str chain-id-separator chain-id))
(when-not (empty? parameters)

View File

@ -1,5 +1,5 @@
(ns status-im.ethereum.eip681-test
(:require [cljs.test :refer-macros [deftest is] :as test]
(:require [cljs.test :refer-macros [deftest is]]
[status-im.ethereum.eip681 :as eip681]
[utils.money :as money]))

View File

@ -189,10 +189,6 @@
(-> (sanitize-passphrase s)
(string/split #" "))))
(defn words->passphrase
[v]
(string/join " " v))
(def valid-word-counts #{12 15 18 21 24})
(defn valid-word-counts?

View File

@ -1,6 +1,5 @@
(ns status-im.ethereum.stateofus
(:require [clojure.string :as string]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]
[status-im2.config :as config]))
@ -33,23 +32,9 @@
(when config/test-stateofus?
{:goerli "0xD1f7416F91E7Eb93dD96A61F12FC092aD6B67B11"})))
(def registrars-cache (atom {}))
(defn get-registrar
[chain callback]
(if-let [contract (get @registrars-cache chain)]
(callback contract)
(ens/owner
(ethereum/chain-keyword->chain-id chain)
domain
(fn [addr]
(let [addr (or addr (get old-registrars chain))]
(swap! registrars-cache assoc chain addr)
(callback addr))))))
(defn get-cached-registrar
[chain]
(get @registrars-cache chain (get old-registrars chain)))
(get old-registrars chain))
(defn lower-case?
[s]

View File

@ -1,5 +1,5 @@
(ns status-im.ethereum.subscriptions
(:require [status-im.ethereum.eip55 :as eip55]
(:require [utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.transactions.core :as transactions]
[utils.re-frame :as rf]
[status-im.wallet.core :as wallet.core]

View File

@ -1,6 +1,6 @@
(ns status-im.ethereum.tokens
(:require [clojure.string :as string]
[status-im.ethereum.core :as ethereum])
[utils.ethereum.chain :as chain])
(:require-macros [status-im.ethereum.macros :as ethereum.macros :refer [resolve-icons]]))
(def default-native-currency
@ -42,7 +42,7 @@
(defn native-currency
[{sym :symbol :as current-network}]
(let [chain (ethereum/network->chain-keyword current-network)]
(let [chain (chain/network->chain-keyword current-network)]
(get all-native-currencies chain (default-native-currency sym))))
(defn ethereum?

View File

@ -1,24 +1,24 @@
(ns status-im.ethereum.transactions.core
(:require [cljs.spec.alpha :as spec]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.decode :as decode]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.encode :as encode]
[utils.re-frame :as rf]
[status-im.utils.mobile-sync :as utils.mobile-sync]
[status-im.wallet.core :as wallet]
[status-im2.common.json-rpc.events :as json-rpc]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]))
(def confirmations-count-threshold 12)
(def etherscan-supported?
#{(ethereum/chain-keyword->chain-id :mainnet)
(ethereum/chain-keyword->chain-id :goerli)})
#{(chain/chain-keyword->chain-id :mainnet)
(chain/chain-keyword->chain-id :goerli)})
(def binance-mainnet-chain-id (ethereum/chain-keyword->chain-id :bsc))
(def binance-testnet-chain-id (ethereum/chain-keyword->chain-id :bsc-testnet))
(def binance-mainnet-chain-id (chain/chain-keyword->chain-id :bsc))
(def binance-testnet-chain-id (chain/chain-keyword->chain-id :bsc-testnet))
(def network->subdomain {5 "goerli"})

View File

@ -3,7 +3,6 @@
[clojure.string :as string]
[day8.re-frame.test :as rf-test]
[re-frame.core :as rf]
[status-im.ethereum.core :as ethereum]
status-im.events
status-im2.events
[status-im.multiaccounts.logout.core :as logout]
@ -12,7 +11,8 @@
status-im2.navigation.core
status-im2.subs.root ; so integration tests can run independently
[taoensso.timbre :as log]
[status-im2.constants :as constants]))
[status-im2.constants :as constants]
[native-module.core :as native-module]))
(def password "testabc")
@ -52,7 +52,7 @@
[]
(rf/dispatch-sync [:wallet.accounts/start-adding-new-account {:type :generate}])
(rf/dispatch-sync [:set-in [:add-account :account :name] account-name])
(rf/dispatch [:wallet.accounts/add-new-account (ethereum/sha3 password)]))
(rf/dispatch [:wallet.accounts/add-new-account (native-module/sha3 password)]))
(defn assert-new-account-created
[]

View File

@ -2,7 +2,6 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.keycard.nfc :as nfc]
[status-im.popover.core :as popover]
@ -13,7 +12,8 @@
[react-native.platform :as platform]
[status-im.utils.deprecated-types :as types]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.address :as address]))
(def default-pin "000000")
@ -78,7 +78,7 @@
(when key-uid
(->> (:profile/profiles-overview db)
vals
(filter #(= (ethereum/normalized-hex key-uid) (:key-uid %)))
(filter #(= (address/normalized-hex key-uid) (:key-uid %)))
first)))
(defn get-pairing
@ -354,7 +354,7 @@
:puk-retry-counter 5
:pin-retry-counter 3)
(assoc-in [:keycard :profile/profile]
(update account-data :whisper-public-key ethereum/normalized-hex))
(update account-data :whisper-public-key address/normalized-hex))
(assoc-in [:keycard :flow] nil)
(update :profile/login assoc
:password encryption-public-key

View File

@ -1,6 +1,5 @@
(ns status-im.keycard.login
(:require [status-im.bottom-sheet.events :as bottom-sheet]
[status-im.ethereum.core :as ethereum]
[status-im.keycard.common :as common]
status-im.keycard.fx
[status-im.keycard.onboarding :as onboarding]
@ -9,7 +8,8 @@
[utils.re-frame :as rf]
[status-im.utils.deprecated-types :as types]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.address :as address]))
(rf/defn login-got-it-pressed
{:events [:keycard.login.pin.ui/got-it-pressed
@ -162,7 +162,7 @@
(assoc-in [:keycard :pin :status] nil)
(assoc-in [:keycard :pin :login] [])
(assoc-in [:keycard :profile/profile]
(update account-data :whisper-public-key ethereum/normalized-hex))
(update account-data :whisper-public-key address/normalized-hex))
(assoc-in [:keycard :flow] nil)
(update :profile/login assoc
:password encryption-public-key

View File

@ -2,12 +2,12 @@
(:require ["react-native" :as rn]
["react-native-status-keycard" :default status-keycard]
[clojure.string :as string]
[status-im.ethereum.core :as ethereum]
[status-im.keycard.keycard :as keycard]
[native-module.core :as native-module]
[react-native.platform :as platform]
[status-im.utils.deprecated-types :as types]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.address :as address]))
(defonce event-emitter
(if platform/ios?
@ -114,7 +114,7 @@
(then (fn [response]
(let [info (-> response
(js->clj :keywordize-keys true)
(update :key-uid ethereum/normalized-hex))]
(update :key-uid address/normalized-hex))]
(on-success info))))
(catch on-failure)))
@ -125,7 +125,7 @@
(then (fn [response]
(let [info (-> response
(js->clj :keywordize-keys true)
(update :key-uid ethereum/normalized-hex))]
(update :key-uid address/normalized-hex))]
(on-success info))))
(catch on-failure)))

View File

@ -3,8 +3,7 @@
[re-frame.core :as re-frame]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[utils.i18n :as i18n]
[status-im.keycard.common :as common]
status-im.keycard.fx
@ -19,7 +18,8 @@
[status-im.utils.deprecated-types :as types]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[utils.security.core :as security]))
[utils.security.core :as security]
[utils.address :as address]))
(rf/defn pair*
[_ password]
@ -203,7 +203,7 @@
:address address
:public-key public-key
:keycard-instance-uid instance-uid
:key-uid (ethereum/normalized-hex key-uid)
:key-uid (address/normalized-hex key-uid)
:keycard-pairing pairing
:keycard-paired-on paired-on
:chat-key whisper-private-key}
@ -272,9 +272,9 @@
settings {:keycard-instance-uid instance-uid
:keycard-paired-on paired-on
:keycard-pairing pairing}
password (ethereum/sha3 (security/safe-unmask-data (get-in db
[:keycard
:migration-password])))
password (native-module/sha3 (security/safe-unmask-data (get-in db
[:keycard
:migration-password])))
encryption-pass (get-in db [:keycard :profile/profile :encryption-public-key])
login-params {:key-uid key-uid
:multiaccount-data (types/clj->json account)
@ -316,20 +316,20 @@
(assoc-in
[:keycard :profile/profile]
(-> account-data
(update :address ethereum/normalized-hex)
(update :whisper-address ethereum/normalized-hex)
(update :wallet-address ethereum/normalized-hex)
(update :wallet-root-address ethereum/normalized-hex)
(update :public-key ethereum/normalized-hex)
(update :whisper-public-key ethereum/normalized-hex)
(update :wallet-public-key ethereum/normalized-hex)
(update :wallet-root-public-key ethereum/normalized-hex)
(update :address address/normalized-hex)
(update :whisper-address address/normalized-hex)
(update :wallet-address address/normalized-hex)
(update :wallet-root-address address/normalized-hex)
(update :public-key address/normalized-hex)
(update :whisper-public-key address/normalized-hex)
(update :wallet-public-key address/normalized-hex)
(update :wallet-root-public-key address/normalized-hex)
(update :instance-uid #(get-in db [:keycard :profile/profile :instance-uid] %))))
(assoc-in [:keycard :multiaccount-wallet-address] (:wallet-address account-data))
(assoc-in [:keycard :multiaccount-whisper-public-key] (:whisper-public-key account-data))
(assoc-in [:keycard :pin :status] nil)
(assoc-in [:keycard :application-info :key-uid]
(ethereum/normalized-hex (:key-uid account-data)))
(address/normalized-hex (:key-uid account-data)))
(update :keycard dissoc :recovery-phrase :creating-backup? :converting-account?)
(update-in [:keycard :secrets] dissoc :pin :puk :password :mnemonic)
(assoc :multiaccounts/new-installation-id (random-guid-generator)))}

View File

@ -1,12 +1,14 @@
(ns status-im.keycard.sign
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.keycard.common :as common]
[utils.re-frame :as rf]
[utils.money :as money]
[status-im.utils.deprecated-types :as types]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]
[status-im.wallet.utils :as wallet.utils]
[utils.address :as address]))
(rf/defn sign
{:events [:keycard/sign]}
@ -22,10 +24,10 @@
pin (common/vector->string (get-in db [:keycard :pin :sign]))
from (or (get-in db [:signing/tx :from :address])
(get-in db [:signing/tx :message :from])
(ethereum/default-address db))
(wallet.utils/default-address db))
path (reduce
(fn [_ {:keys [address path]}]
(when (ethereum/address= from address)
(when (address/address= from address)
(reduced path)))
nil
(:profile/wallet-accounts db))]
@ -43,7 +45,7 @@
{:db (-> db
(assoc-in [:keycard :card-read-in-progress?] true)
(assoc-in [:keycard :pin :status] :verifying))
:keycard/sign {:hash (ethereum/naked-address hash)
:keycard/sign {:hash (address/naked-address hash)
:data data
:typed? typed? ; this parameter is for e2e
:on-success on-success
@ -55,7 +57,7 @@
(-> signature
(string/replace-first #"00$" "1b")
(string/replace-first #"01$" "1c")
ethereum/normalized-hex))
address/normalized-hex))
(rf/defn sign-message
{:events [:keycard/sign-message]}
@ -63,7 +65,7 @@
(let [{:keys [result error]} (types/json->clj result)
on-success #(re-frame/dispatch [:keycard/on-sign-message-success params
(normalize-signature %)])
hash (ethereum/naked-address result)]
hash (address/naked-address result)]
(sign cofx hash on-success)))
(rf/defn on-sign-message-success
@ -92,7 +94,7 @@
{:db (-> db
(assoc-in [:keycard :card-read-in-progress?] true)
(assoc-in [:signing/sign :keycard-step] :signing))
:keycard/sign-typed-data {:hash (ethereum/naked-address hash)}}
:keycard/sign-typed-data {:hash (address/naked-address hash)}}
(rf/merge cofx
(common/set-on-card-connected :keycard/sign-typed-data)
{:db (assoc-in db [:signing/sign :keycard-step] :signing)}))))
@ -116,7 +118,7 @@
currency-contract (:currency message)]
(when currency-contract
{:json-rpc/call [{:method "wallet_discoverToken"
:params [(ethereum/chain-id db) currency-contract]
:params [(chain/chain-id db) currency-contract]
:on-success #(re-frame/dispatch [:keycard/fetch-currency-token-on-success
%])}]})
(rf/merge cofx

View File

@ -3,7 +3,6 @@
[re-frame.core :as re-frame]
[re-frame.db :as re-frame.db]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.keycard.keycard :as keycard]
[status-im.multiaccounts.create.core :as multiaccounts.create]
@ -11,12 +10,13 @@
[status-im.node.core :as node]
[status-im.utils.deprecated-types :as types]
[status-im.utils.utils :as utils]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.address :as address]))
(def kk1-password "000000")
(def default-pin "111111")
(def default-puk "000000000000")
(def account-password (ethereum/sha3 "no password"))
(def account-password (native-module/sha3 "no password"))
(def initial-state
{:card-connected? false
@ -476,7 +476,7 @@
(let [signature (-> res
types/json->clj
:result
ethereum/normalized-hex)]
address/normalized-hex)]
(on-success signature)))))
(native-module/sign-typed-data
data
@ -486,7 +486,7 @@
(let [signature (-> res
types/json->clj
:result
ethereum/normalized-hex)]
address/normalized-hex)]
(on-success signature))))))))
(defn sign-typed-data

View File

@ -1,12 +1,12 @@
(ns status-im.keycard.wallet
(:require [status-im.bottom-sheet.events :as bottom-sheet]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.keycard.common :as common]
[status-im.ui.screens.wallet.add-new.views :as add-new.views]
[utils.re-frame :as rf]
[status-im.utils.hex :as utils.hex]))
[status-im.utils.hex :as utils.hex]
[native-module.core :as native-module]))
(rf/defn show-pin-sheet
{:events [:keycard/new-account-pin-sheet]}
@ -31,6 +31,17 @@
[cofx]
(bottom-sheet/hide-bottom-sheet-old cofx))
(defn public-key->address
[public-key]
(let [length (count public-key)
normalized-key (case length
132 (str "0x" (subs public-key 4))
130 public-key
128 (str "0x" public-key)
nil)]
(when normalized-key
(subs (native-module/sha3 normalized-key) 26))))
(rf/defn generate-new-keycard-account
{:events [:wallet.accounts/generate-new-keycard-account]}
[{:keys [db]}]
@ -46,7 +57,7 @@
{;; Strip leading 04 prefix denoting uncompressed key format
:address (eip55/address->checksum
(str "0x"
(ethereum/public-key->address
(public-key->address
(subs public-key 2))))
:public-key (str "0x" public-key)
:path path})))

View File

@ -3,8 +3,7 @@
[re-frame.core :as re-frame]
[status-im2.constants :as constants]
[status-im.data-store.settings :as data-store.settings]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[utils.i18n :as i18n]
[native-module.core :as native-module]
[status-im.node.core :as node]
@ -210,7 +209,7 @@
(save-account-and-login
key-uid
multiaccount-data
(ethereum/sha3 (security/safe-unmask-data password))
(native-module/sha3 (security/safe-unmask-data password))
settings
(node/get-new-config db)
accounts-data)))))

View File

@ -1,7 +1,6 @@
(ns status-im.multiaccounts.login.core
(:require
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[native-module.core :as native-module]
[status-im.ui.components.react :as react]
[utils.re-frame :as rf]
@ -26,7 +25,7 @@
{::export-db [key-uid
(types/clj->json {:name name
:key-uid key-uid})
(ethereum/sha3 (security/safe-unmask-data password))
(native-module/sha3 (security/safe-unmask-data password))
(fn [path]
(when platform/ios?
(let [uri (str "file://" path)]
@ -41,4 +40,4 @@
{::import-db [key-uid
(types/clj->json {:name name
:key-uid key-uid})
(ethereum/sha3 (security/safe-unmask-data password))]}))
(native-module/sha3 (security/safe-unmask-data password))]}))

View File

@ -1,7 +1,6 @@
(ns status-im.multiaccounts.reset-password.core
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[native-module.core :as native-module]
[status-im.popover.core :as popover]
[utils.re-frame :as rf]
@ -54,8 +53,8 @@
(fn [[key-uid {:keys [current-password new-password]}]]
(native-module/reset-password
key-uid
(ethereum/sha3 (security/safe-unmask-data current-password))
(ethereum/sha3 (security/safe-unmask-data new-password))
(native-module/sha3 (security/safe-unmask-data current-password))
(native-module/sha3 (security/safe-unmask-data new-password))
change-db-password-cb)))
(rf/defn handle-verification-success
@ -80,7 +79,7 @@
(re-frame/reg-fx
::validate-current-password-and-reset
(fn [{:keys [address current-password] :as form-vals}]
(let [hashed-pass (ethereum/sha3 (security/safe-unmask-data current-password))]
(let [hashed-pass (native-module/sha3 (security/safe-unmask-data current-password))]
(native-module/verify address
hashed-pass
(partial handle-verification form-vals)))))

View File

@ -1,11 +1,11 @@
(ns status-im.network.core
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.node.core :as node]
[utils.re-frame :as rf]
[status-im2.navigation.events :as navigation]))
[status-im2.navigation.events :as navigation]
[utils.ethereum.chain :as chain]))
(def url-regex
#"https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,6})?\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)")
@ -136,7 +136,7 @@
[random-id network-name sym upstream-url chain-type chain-id]
(let [data-dir (str "/ethereum/" (name chain-type) "_rpc")
config {:NetworkId (or (when chain-id (int chain-id))
(ethereum/chain-keyword->chain-id chain-type))
(chain/chain-keyword->chain-id chain-type))
:DataDir data-dir
:UpstreamConfig {:Enabled true
:URL upstream-url}}]

View File

@ -1,13 +1,13 @@
(ns status-im.qr-scanner.core
(:require [re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.group-chats.core :as group-chats]
[utils.i18n :as i18n]
[status-im.router.core :as router]
[utils.re-frame :as rf]
[status-im.utils.utils :as utils]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]))
(rf/defn scan-qr-code
{:events [::scan-code]}
@ -110,7 +110,7 @@
(rf/defn on-scan
{:events [::on-scan-success]}
[{:keys [db]} uri]
{::router/handle-uri {:chain (ethereum/chain-keyword db)
{::router/handle-uri {:chain (chain/chain-keyword db)
:chats (get db :chats)
:uri uri
:cb #(re-frame/dispatch [::match-scanned-value %])}})

View File

@ -4,7 +4,6 @@
[re-frame.core :as re-frame]
[status-im2.contexts.chat.events :as chat.events]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip681 :as eip681]
[status-im.ethereum.ens :as ens]
[status-im.utils.deprecated-types :as types]
@ -14,7 +13,9 @@
[utils.url :as url]
[status-im.utils.wallet-connect :as wallet-connect]
[taoensso.timbre :as log]
[utils.security.core :as security]))
[utils.security.core :as security]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(def ethereum-scheme "ethereum:")
@ -93,7 +94,7 @@
(string? user-id)
(not (string/blank? user-id))
(not= user-id "0x"))
(let [chain-id (ethereum/chain-keyword->chain-id chain)
(let [chain-id (chain/chain-keyword->chain-id chain)
ens-name (stateofus/ens-name-parse user-id)
on-success #(match-contact-async chain {:user-id % :ens-name ens-name} callback)]
(ens/pubkey chain-id ens-name on-success))
@ -244,7 +245,7 @@
(= handler :wallet-account)
(cb (match-wallet-account route-params))
(ethereum/address? uri)
(address/address? uri)
(cb (address->eip681 uri))
(url/url? uri)

View File

@ -4,8 +4,7 @@
[clojure.string :as string]
[re-frame.core :as re-frame]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.tokens :as tokens]
[utils.i18n :as i18n]
[status-im.keycard.card :as keycard.card]
@ -22,7 +21,10 @@
[status-im.wallet.prices :as prices]
[status-im2.common.json-rpc.events :as json-rpc]
[taoensso.timbre :as log]
[utils.security.core :as security]))
[utils.security.core :as security]
[utils.address :as address]
[status-im.wallet.utils :as wallet.utils]
[utils.ethereum.chain :as chain]))
(re-frame/reg-fx
:signing/send-transaction-fx
@ -65,7 +67,7 @@
(let [to (utils.hex/normalize-hex to)]
(or
(get-in db [:contacts/contacts to])
{:address (ethereum/normalized-hex to)})))
{:address (address/normalized-hex to)})))
(rf/defn change-password
{:events [:signing.ui/password-is-changed]}
@ -81,8 +83,9 @@
[{{:signing/keys [sign tx] :as db} :db}]
(let [{{:keys [data typed? from v4]} :message} tx
{:keys [in-progress? password]} sign
from (or from (ethereum/default-address db))
hashed-password (ethereum/sha3 (security/safe-unmask-data password))]
from (or from (wallet.utils/default-address db))
hashed-password (native-module/sha3 (security/safe-unmask-data
password))]
(when-not in-progress?
(merge
{:db (update db :signing/sign assoc :error nil :in-progress? true)}
@ -105,10 +108,11 @@
(let [{:keys [in-progress? password]} sign
{:keys [tx-obj gas gasPrice maxPriorityFeePerGas
maxFeePerGas message nonce]} tx
hashed-password (ethereum/sha3 (security/safe-unmask-data password))
hashed-password (native-module/sha3 (security/safe-unmask-data
password))
{:keys [action username custom-domain?]} registration
{:keys [public-key]} (:profile/profile db)
chain-id (ethereum/chain-id db)]
chain-id (chain/chain-id db)]
(if message
(sign-message cofx)
(let [tx-obj-to-send (merge tx-obj
@ -255,13 +259,13 @@
:value value
:amount (str eth-amount)
:token (tokens/asset-for (:wallet/all-tokens db)
(ethereum/get-current-network db)
(chain/get-current-network db)
:ETH)}
(not (nil? token))
token
:else
{:to to
:contact {:address (ethereum/normalized-hex to)}})))))
:contact {:address (address/normalized-hex to)}})))))
(defn prepare-tx
[db {{:keys [data gas gasPrice maxFeePerGas maxPriorityFeePerGas] :as tx-obj} :tx-obj :as tx}]
@ -276,6 +280,18 @@
:maxPriorityFeePerGas (when maxPriorityFeePerGas
(money/bignumber maxPriorityFeePerGas))}))
(defn hex-to-utf8
[s]
(let [utf8 (native-module/hex-to-utf8 s)]
(if (empty? utf8)
nil
utf8)))
(defn hex->text
"Converts a hexstring to UTF8 text."
[data]
(or (hex-to-utf8 data) data))
(rf/defn show-sign
[{:keys [db] :as cofx}]
(let [{:signing/keys [queue]} db
@ -297,7 +313,7 @@
:formatted-data (if typed?
(types/js->pretty-json
(types/json->js data))
(ethereum/hex->text data))
(hex->text data))
:keycard-step (when pinless? :connect)})
:show-signing-sheet nil}
#(when-not wallet-set-up-passed?
@ -338,7 +354,7 @@
{:success-callback #(re-frame/dispatch
[:wallet.send/update-gas-price-success :signing/tx % tx-obj])
:error-callback #(re-frame/dispatch [:signing/update-gas-price-error %])
:network-id (get-in (ethereum/current-network db)
:network-id (get-in (chain/current-network db)
[:config :NetworkId])}})))))
(rf/defn check-queue
@ -355,7 +371,7 @@
;; big-int
:params [chat-id (str value) contract transaction-hash
(or (:result (types/json->clj signature))
(ethereum/normalized-hex signature))]
(address/normalized-hex signature))]
:js-response true
:on-success
#(re-frame/dispatch [:transport/message-sent %])}]})
@ -366,7 +382,7 @@
{:json-rpc/call [{:method "wakuext_acceptRequestTransaction"
:params [transaction-hash message-id
(or (:result (types/json->clj signature))
(ethereum/normalized-hex signature))]
(address/normalized-hex signature))]
:js-response true
:on-success
#(re-frame/dispatch [:transport/message-sent %])}]})
@ -496,7 +512,7 @@
(defn normalize-tx-obj
[db tx]
(update-in tx [:tx-obj :from] #(eip55/address->checksum (or % (ethereum/default-address db)))))
(update-in tx [:tx-obj :from] #(eip55/address->checksum (or % (wallet.utils/default-address db)))))
(rf/defn sign
"Signing transaction or message, shows signing sheet
@ -516,7 +532,7 @@
[{:keys [db] :as cofx} {:keys [to amount from token]}]
(let [{:keys [symbol address]} token
amount-hex (str "0x" (native-module/number-to-hex amount))
to-norm (ethereum/normalized-hex (if (string? to) to (:address to)))
to-norm (address/normalized-hex (if (string? to) to (:address to)))
from-address (:address from)
identity (:current-chat-id db)
db (dissoc db :wallet/prepare-transaction :signing/edit-fee)]
@ -530,7 +546,7 @@
:chat-id identity
:command? true
:value amount-hex}
{:to (ethereum/normalized-hex address)
{:to (address/normalized-hex address)
:from from-address
:chat-id identity
:command? true
@ -566,7 +582,7 @@
:chat-id chat-id
:command? true
:value amount-hex}
{:to (ethereum/normalized-hex address)
{:to (address/normalized-hex address)
:from from-address
:command? true
:message-id (:id request-parameters)
@ -578,7 +594,7 @@
[{:keys [db] :as cofx} {:keys [to amount from token gas gasPrice maxFeePerGas maxPriorityFeePerGas]}]
(let [{:keys [symbol address]} token
amount-hex (str "0x" (native-module/number-to-hex amount))
to-norm (ethereum/normalized-hex (if (string? to) to (:address to)))
to-norm (address/normalized-hex (if (string? to) to (:address to)))
from-address (:address from)]
(rf/merge cofx
{:db (dissoc db :wallet/prepare-transaction :signing/edit-fee)}
@ -596,7 +612,7 @@
(if (= symbol :ETH)
{:to to-norm
:value amount-hex}
{:to (ethereum/normalized-hex address)
{:to (address/normalized-hex address)
:data (native-module/encode-transfer to-norm amount-hex)}))}))))
(re-frame/reg-fx

View File

@ -2,14 +2,14 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.popover.core :as popover]
[status-im.signing.eip1559 :as eip1559]
[utils.re-frame :as rf]
[utils.money :as money]
[status-im2.common.json-rpc.events :as json-rpc]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]))
(def min-gas-price-wei ^js (money/bignumber 1))
@ -409,7 +409,7 @@
(check-base-fee
(assoc fee-history
:testnet?
(ethereum/testnet?
(chain/testnet?
(get-in networks [current-network :config :NetworkId]))))]
(merge {:max-priority-fee
(max-priority-fee-hex (money/bignumber %) current-base-fee)}

View File

@ -2,11 +2,12 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im2.config :as config]
[utils.re-frame :as rf]
[status-im.utils.utils :as utils]
[status-im2.navigation.events :as navigation]))
[status-im2.navigation.events :as navigation]
[utils.ethereum.chain :as chain]
[status-im.wallet.utils :as wallet.utils]))
(re-frame/reg-fx
:stickers/set-pending-timeout-fx
@ -21,14 +22,14 @@
cofx
{:db (assoc-in db [:stickers/packs id :status] constants/sticker-pack-status-installed)
:json-rpc/call [{:method "stickers_install"
:params [(ethereum/chain-id db) id]
:params [(chain/chain-id db) id]
:on-success #()}]}))
(rf/defn load-packs
{:events [:stickers/load-packs]}
[{:keys [db]}]
{:json-rpc/call [{:method "stickers_market"
:params [(ethereum/chain-id db)]
:params [(chain/chain-id db)]
:on-success #(re-frame/dispatch [:stickers/stickers-market-success %])}
{:method "stickers_installed"
:params []
@ -44,7 +45,7 @@
{:events [:stickers/buy-pack]}
[{db :db} pack-id]
{:json-rpc/call [{:method "stickers_buyPrepareTx"
:params [(ethereum/chain-id db) (ethereum/default-address db) (int pack-id)]
:params [(chain/chain-id db) (wallet.utils/default-address db) (int pack-id)]
:on-success #(re-frame/dispatch [:signing.ui/sign
{:tx-obj %
:on-result [:stickers/pending-pack pack-id]}])}]})
@ -58,7 +59,7 @@
(update :stickers/packs-pending conj id))
:stickers/set-pending-timeout-fx nil
:json-rpc/call [{:method "stickers_addPending"
:params [(ethereum/chain-id db) (int id)]
:params [(chain/chain-id db) (int id)]
:on-success #()}]})
(rf/defn pending-timeout
@ -66,7 +67,7 @@
[{{:stickers/keys [packs-pending] :as db} :db}]
(when (seq packs-pending)
{:json-rpc/call [{:method "stickers_processPending"
:params [(ethereum/chain-id db)]
:params [(chain/chain-id db)]
:on-success #(re-frame/dispatch [:stickers/stickers-process-pending-success
%])}]}))

View File

@ -6,7 +6,6 @@
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ens.core :as ens]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ethereum.ens]
[status-im.ethereum.stateofus :as stateofus]
[status-im.ethereum.tokens :as tokens]
@ -23,7 +22,8 @@
[status-im.ui.screens.profile.components.views :as profile.components]
[status-im.ui.screens.wallet.send.sheets :as sheets]
[status-im.utils.utils :as utils]
[utils.debounce :as debounce])
[utils.debounce :as debounce]
[utils.address :as address])
(:require-macros [status-im.utils.views :as views]))
(defn- link
@ -547,7 +547,7 @@
(when-not pending?
[section
{:title (i18n/label :t/wallet-address)
:content (ethereum/normalized-hex address)}])
:content (address/normalized-hex address)}])
(when-not pending?
[react/view {:style {:margin-top 14}}
[section

View File

@ -1,7 +1,6 @@
(ns status-im.ui.screens.privacy-and-security-settings.events
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[native-module.core :as native-module]
[utils.re-frame :as rf]
@ -20,7 +19,7 @@
(let [hashed-password
(-> masked-password
security/safe-unmask-data
ethereum/sha3)]
native-module/sha3)]
(native-module/verify
address
hashed-password

View File

@ -8,7 +8,6 @@
[quo2.foundations.colors :as quo2.colors]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.ui.components.animation :as animation]
[status-im.ui.components.icons.icons :as icons]
@ -22,7 +21,8 @@
[status-im.ui.screens.wallet.collectibles.views :as collectibles.views]
[status-im.ui.screens.wallet.transactions.views :as history]
[status-im2.config :as config]
[utils.re-frame :as rf])
[utils.re-frame :as rf]
[utils.address :as address])
(:require-macros [status-im.utils.views :as views]))
(def state (reagent/atom {:tab :assets}))
@ -61,7 +61,7 @@
:style {:width (/ window-width 3)
:line-height 22
:color colors/white-transparent-70-persist}}
(ethereum/normalized-hex address)]]
(address/normalized-hex address)]]
[react/view {:position :absolute :top 12 :right 12}
[react/touchable-highlight {:on-press #(re-frame/dispatch [:wallet/share-popover address])}
[icons/icon :main-icons/share

View File

@ -6,7 +6,6 @@
[quo.design-system.colors :as colors]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.multiaccounts.db :as multiaccounts.db]
[status-im.ui.components.icons.icons :as icons]
@ -15,7 +14,8 @@
[status-im.ui.components.topbar :as topbar]
[status-im.ui.screens.keycard.pin.views :as pin.views]
[status-im.ui.screens.wallet.account-settings.views :as account-settings]
[utils.security.core :as security]))
[utils.security.core :as security]
[native-module.core :as native-module]))
(defn add-account-topbar
[type]
@ -179,7 +179,7 @@
{:view {:content pin
:height 256}}])
#(re-frame/dispatch [:wallet.accounts/add-new-account
(ethereum/sha3 @entered-password)]))
(native-module/sha3 @entered-password)]))
:disabled
(or add-account-disabled?
(and

View File

@ -4,7 +4,6 @@
[quo.design-system.colors :as colors]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.stateofus :as stateofus]
[utils.i18n :as i18n]
[status-im.ui.components.chat-icon.screen :as chat-icon]
@ -17,7 +16,8 @@
[status-im.ui.screens.wallet.components.views :as components]
[status-im.utils.utils :as utils]
[utils.debounce :as debounce]
[utils.string :as utils.string])
[utils.string :as utils.string]
[utils.address :as address])
(:require-macros [status-im.utils.views :as views]))
(defn- recipient-topbar
@ -317,7 +317,7 @@
:size :small
:align :center
:color :secondary}
(when-not (ethereum/address? address)
(when-not (address/address? address)
(str (stateofus/username-with-domain address) " • "))
[quo/text
{:monospace true

View File

@ -2,7 +2,7 @@
(:require [quo.core :as quo]
[re-frame.core :as re-frame]
[reagent.core :as reagent]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.eip681 :as eip681]
[utils.i18n :as i18n]
[status-im.ui.components.copyable-text :as copyable-text]

View File

@ -5,7 +5,6 @@
[quo.design-system.colors :as colors]
[re-frame.core :as re-frame]
[status-im.commands.core :as commands]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.multiaccounts.core :as multiaccounts]
[status-im.ui.components.bottom-panel.views :as bottom-panel]
@ -20,7 +19,8 @@
[status-im.ui.screens.wallet.send.styles :as styles]
[utils.money :as money]
[status-im.utils.utils :as utils]
[status-im.wallet.utils :as wallet.utils]))
[status-im.wallet.utils :as wallet.utils]
[utils.address :as address]))
(defn header
[{:keys [label small-screen?]}]
@ -232,7 +232,7 @@
prices [:prices]
wallet-currency [:wallet/currency]
window-width [:dimensions/window-width]]
(let [to-norm (ethereum/normalized-hex (if (string? to) to (:address to)))]
(let [to-norm (address/normalized-hex (if (string? to) to (:address to)))]
[kb-presentation/keyboard-avoiding-view {:style {:flex 1}}
[:<>
[quo2/page-nav

View File

@ -3,7 +3,6 @@
[goog.string :as gstring]
[re-frame.core :as re-frame]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.group-chats.core :as group-chats]
[utils.i18n :as i18n]
[status-im.multiaccounts.model :as multiaccounts.model]
@ -13,7 +12,8 @@
[status-im.wallet.choose-recipient.core :as choose-recipient]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[native-module.core :as native-module]))
[native-module.core :as native-module]
[utils.ethereum.chain :as chain]))
;; TODO(yenda) investigate why `handle-universal-link` event is
;; dispatched 7 times for the same link
@ -161,7 +161,7 @@
(rf/defn route-url
"Match a url against a list of routes and handle accordingly"
[{:keys [db]} url]
{::router/handle-uri {:chain (ethereum/chain-keyword db)
{::router/handle-uri {:chain (chain/chain-keyword db)
:chats (:chats db)
:uri url
:cb #(re-frame/dispatch [::match-value url %])}})
@ -215,8 +215,8 @@
;;It can be called after the error "route ip+net: netlinkrib: permission denied" is fixed on status-go
;;side
#_(native-module/start-searching-for-local-pairing-peers
#(log/info "[local-pairing] errors from local-pairing-preflight-outbound-check ->" %))
)
#(log/info "[local-pairing] errors from local-pairing-preflight-outbound-check ->" %)))
(defn finalize
"Remove event listener for url"

View File

@ -4,9 +4,9 @@
[clojure.string :as string]
[goog.string :as gstring]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.i18n :as i18n]))
[utils.ethereum.eip.eip55 :as eip55]
[utils.i18n :as i18n]
[utils.address :as address]))
;;TODO (14/11/22 flexsurfer) .-Alert usage code has been moved to the status-im2 namespace, we keep this
;;only for old (status 1.0) code,
@ -106,7 +106,7 @@
(defn get-shortened-checksum-address
[address]
(when address
(get-shortened-address (eip55/address->checksum (ethereum/normalized-hex address)))))
(get-shortened-address (eip55/address->checksum (address/normalized-hex address)))))
;;TODO (14/11/22 flexsurfer) haven't moved yet
(defn format-decimals

View File

@ -5,8 +5,7 @@
[re-frame.core :as re-frame]
[status-im2.constants :as constants]
[status-im.ens.core :as ens.core]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.eip681 :as eip681]
[status-im.ethereum.mnemonic :as mnemonic]
[status-im.ethereum.stateofus :as stateofus]
@ -23,7 +22,9 @@
[status-im.wallet.prices :as prices]
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[utils.security.core :as security]))
[utils.security.core :as security]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(rf/defn start-adding-new-account
{:events [:wallet.accounts/start-adding-new-account]}
@ -249,7 +250,7 @@
[{:keys [db] :as cofx}]
(let [address (get-in db [:add-account :address])]
(account-generated cofx
{:address (eip55/address->checksum (ethereum/normalized-hex address))
{:address (eip55/address->checksum (address/normalized-hex address))
:type :watch})))
(rf/defn add-new-account-password-verifyied
@ -282,7 +283,7 @@
(cond-> {:db (assoc-in db [:add-account :address] account)}
name?
(assoc ::ens.core/resolve-address
[(ethereum/chain-id db)
[(chain/chain-id db)
(stateofus/ens-name-parse account)
#(re-frame/dispatch
[:wallet.accounts/set-account-to-watch %])]))))
@ -336,7 +337,7 @@
(re-frame/reg-fx
:key-storage/delete-imported-key
(fn [{:keys [key-uid address password on-success on-error]}]
(let [hashed-pass (ethereum/sha3 (security/safe-unmask-data password))]
(let [hashed-pass (native-module/sha3 (security/safe-unmask-data password))]
(native-module/delete-imported-key
key-uid
(string/lower-case (subs address 2))

View File

@ -2,7 +2,6 @@
(:require [re-frame.core :as re-frame]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.contact.db :as contact.db]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip681 :as eip681]
[status-im.ethereum.ens :as ens]
[utils.i18n :as i18n]
@ -13,7 +12,9 @@
[utils.money :as money]
[status-im.utils.universal-links.utils :as links]
[status-im.utils.wallet-connect :as wallet-connect]
[status-im2.navigation.events :as navigation]))
[status-im2.navigation.events :as navigation]
[utils.ethereum.chain :as chain]
[status-im.wallet.utils :as wallet.utils]))
;; FIXME(Ferossgp): Should be part of QR scanner not wallet
(rf/defn toggle-flashlight
@ -66,7 +67,7 @@
:wallet/prepare-transaction
(cond-> {:to address
:to-name (or name (find-address-name db address))
:from (ethereum/get-default-account
:from (wallet.utils/get-default-account
(get db :profile/wallet-accounts))}
gas (assoc :gas (money/bignumber gas))
gas-limit (assoc :gas (money/bignumber gas-limit))
@ -106,7 +107,7 @@
{:success-callback
#(re-frame/dispatch
[:wallet.send/update-gas-price-success :wallet/prepare-transaction %])
:network-id (get-in (ethereum/current-network db)
:network-id (get-in (chain/current-network db)
[:config :NetworkId])}})
(when (and chain-id (not= current-chain-id chain-id))
{:ui/show-error (i18n/label :t/wallet-invalid-chain-id
@ -129,7 +130,7 @@
;; if there are no ens-names, we dispatch request-uri-parsed immediately
(request-uri-parsed cofx message uri)
{::resolve-addresses
{:chain-id (ethereum/chain-id db)
{:chain-id (chain/chain-id db)
:ens-names ens-names
:callback
(fn [addresses]

View File

@ -6,8 +6,7 @@
[react-native.async-storage :as async-storage]
[status-im.bottom-sheet.events :as bottom-sheet]
[status-im.contact.db :as contact.db]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.stateofus :as stateofus]
[status-im.ethereum.tokens :as tokens]
@ -31,7 +30,8 @@
[status-im2.navigation.events :as navigation]
[taoensso.timbre :as log]
[status-im.utils.mobile-sync :as utils.mobile-sync]
[native-module.core :as native-module]))
[native-module.core :as native-module]
[utils.ethereum.chain :as chain]))
(defn get-balance
[{:keys [address on-success on-error]}]
@ -158,8 +158,8 @@
(let [addresses (map (comp string/lower-case :address)
(get db :profile/wallet-accounts))
chain-id (-> db
ethereum/current-network
ethereum/network->chain-id)]
chain/current-network
chain/network->chain-id)]
(when (get-in db [:profile/profile :opensea-enabled?])
{:json-rpc/call (map
(fn [address]
@ -186,7 +186,7 @@
(rf/defn fetch-collectible-assets-by-owner-and-collection
{:events [::fetch-collectible-assets-by-owner-and-collection]}
[{:keys [db]} address collectible-slug limit]
(let [chain-id (ethereum/network->chain-id (ethereum/current-network db))]
(let [chain-id (chain/network->chain-id (chain/current-network db))]
{:db (assoc-in db [:wallet/fetching-collection-assets collectible-slug] true)
:json-rpc/call [{:method "wallet_getOpenseaAssetsByOwnerAndCollection"
:params [chain-id address collectible-slug limit]
@ -243,7 +243,7 @@
(let [addresses (or addresses
(map (comp string/lower-case :address) wallet-accounts))
{:keys [:wallet/visible-tokens]} profile
chain (ethereum/chain-keyword db)
chain (chain/chain-keyword db)
assets (get visible-tokens chain)
tokens (->> (vals all-tokens)
(remove #(or (:hidden? %)
@ -310,7 +310,7 @@
(rf/defn update-toggle-in-settings
[{{:profile/keys [profile] :as db} :db :as cofx} symbol checked?]
(let [chain (ethereum/chain-keyword db)
(let [chain (chain/chain-keyword db)
visible-tokens (get profile :wallet/visible-tokens)]
(rf/merge cofx
(multiaccounts.update/multiaccount-update
@ -355,7 +355,7 @@
(rf/defn configure-token-balance-and-visibility
{:events [::tokens-found]}
[{:keys [db] :as cofx} balances]
(let [chain (ethereum/chain-keyword db)
(let [chain (chain/chain-keyword db)
visible-tokens (get-in db [:profile/profile :wallet/visible-tokens])
chain-visible-tokens (into (or (config/default-visible-tokens chain)
#{})
@ -459,11 +459,12 @@
{:keys [symbol decimals]}
(if (seq contract)
(get all-tokens contract)
(tokens/native-currency (ethereum/get-current-network db)))
(tokens/native-currency (chain/get-current-network db)))
amount-text (str (money/internal->formatted value symbol decimals))]
{:db (assoc db
:wallet/prepare-transaction
{:from (ethereum/get-default-account (:profile/wallet-accounts db))
{:from (wallet.utils/get-default-account (:profile/wallet-accounts
db))
:to (or (get-in db [:contacts/contacts identity])
(-> identity
contact.db/public-key->new-contact
@ -503,7 +504,7 @@
:signing/update-gas-price {:success-callback
#(re-frame/dispatch
[:wallet.send/update-gas-price-success :wallet/prepare-transaction %])
:network-id (get-in (ethereum/current-network db)
:network-id (get-in (chain/current-network db)
[:config :NetworkId])}})
(rf/defn prepare-transaction-from-chat
@ -517,7 +518,7 @@
contact.db/enrich-contact))]
(cond-> {:db (assoc db
:wallet/prepare-transaction
{:from (ethereum/get-default-account
{:from (wallet.utils/get-default-account
(:profile/wallet-accounts db))
:to contact
:symbol :ETH
@ -525,7 +526,7 @@
:dispatch [:open-modal :prepare-send-transaction]}
ens-verified
(assoc ::resolve-address
{:chain-id (ethereum/chain-id db)
{:chain-id (chain/chain-id db)
:ens-name (if (= (.indexOf ^js name ".") -1)
(stateofus/subdomain name)
name)
@ -538,7 +539,7 @@
(let [identity (:current-chat-id db)]
{:db (assoc db
:wallet/prepare-transaction
{:from (ethereum/get-default-account (:profile/wallet-accounts db))
{:from (wallet.utils/get-default-account (:profile/wallet-accounts db))
:to (or (get-in db [:contacts/contacts identity])
(-> identity
contact.db/public-key->new-contact
@ -561,7 +562,7 @@
:signing/update-gas-price {:success-callback
#(re-frame/dispatch
[:wallet.send/update-gas-price-success :wallet/prepare-transaction %])
:network-id (get-in (ethereum/current-network db)
:network-id (get-in (chain/current-network db)
[:config :NetworkId])}})
(rf/defn cancel-transaction-command
@ -671,13 +672,15 @@
nil
(get-in db [:wallet :accounts])))
(defn custom-rpc-node? [{:keys [id]}] (= 45 (count id)))
(defn get-restart-interval
[db]
(let [max-block (get-max-block-with-transfer db)
custom-interval (get db :wallet-service/custom-interval)]
(cond
(ethereum/custom-rpc-node?
(ethereum/current-network db))
(custom-rpc-node?
(chain/current-network db))
ms-2-min
(and max-block
@ -690,8 +693,8 @@
(defn get-watching-interval
[db]
(if (ethereum/custom-rpc-node?
(ethereum/current-network db))
(if (custom-rpc-node?
(chain/current-network db))
ms-2-min
ms-10-min))
@ -734,7 +737,7 @@
:as params}]
(when (:profile/profile db)
(let [syncing-allowed? (utils.mobile-sync/syncing-allowed? cofx)
binance-chain? (ethereum/binance-chain? db)]
binance-chain? (chain/binance-chain? db)]
(log/info "restart-wallet-service"
"force-restart?" force-restart?
"syncing-allowed?" syncing-allowed?
@ -778,7 +781,7 @@
(rf/defn transaction-included
{:events [::transaction-included]}
[{:keys [db] :as cofx} address tx-hash]
(if (ethereum/binance-chain? db)
(if (chain/binance-chain? db)
(load-transaction-by-hash cofx address tx-hash)
(restart cofx true)))
@ -813,7 +816,7 @@
(rf/defn watch-tx
{:events [:watch-tx]}
[{:keys [db] :as cofx} address tx-id]
(let [chain-id (ethereum/chain-id db)]
(let [chain-id (chain/chain-id db)]
{::start-watching [[address tx-id chain-id]]}))
(rf/defn clear-timeouts
@ -889,8 +892,8 @@
(rf/defn stop-fetching-on-empty-tx-history
[{:keys [db now] :as cofx} transfers]
(let [non-empty-history? (get db :wallet/non-empty-tx-history?)
custom-node? (ethereum/custom-rpc-node?
(ethereum/current-network db))
custom-node? (custom-rpc-node?
(chain/current-network db))
until-ms (get db :wallet/keep-watching-until-ms)]
(when-not (and until-ms (> until-ms now))
(rf/merge
@ -1056,7 +1059,7 @@
[network-id tokens]
(mapv #(-> %
(update :symbol keyword)
((partial tokens/update-icon (ethereum/chain-id->chain-keyword (int network-id)))))
((partial tokens/update-icon (chain/chain-id->chain-keyword (int network-id)))))
tokens))
(re-frame/reg-fx
@ -1166,7 +1169,8 @@
(fn [already-seen]
(when (and (not already-seen)
(boolean (get invalid-addrr
(ethereum/sha3 (string/lower-case (ethereum/default-address db))))))
(native-module/sha3 (string/lower-case (wallet.utils/default-address
db))))))
(utils.utils/show-popup
(i18n/label :t/warning)
(i18n/label :t/ens-username-invalid-name-warning)
@ -1190,7 +1194,7 @@
;; NOTE: Local notifications should be enabled only after wallet was started
::enable-local-notifications nil
:dispatch-n [(when (or (not (utils.mobile-sync/syncing-allowed? cofx))
(ethereum/binance-chain? db))
(chain/binance-chain? db))
[:transaction/get-fetched-transfers])]}
(check-invalid-ens)
(initialize-tokens tokens custom-tokens)
@ -1211,7 +1215,7 @@
(get-cached-balances scan-all-tokens?))
(when-not (get db :wallet/new-account)
(restart-wallet-service nil))
(when (ethereum/binance-chain? db)
(when (chain/binance-chain? db)
(request-current-block-update))
(prices/update-prices)))

View File

@ -2,13 +2,14 @@
(:require [clojure.string :as string]
[quo.design-system.colors :as colors]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[utils.i18n :as i18n]
[status-im.ui.components.react :as react]
[utils.re-frame :as rf]
[status-im.wallet.core :as wallet]
[status-im.wallet.prices :as prices]
[status-im2.navigation.events :as navigation]))
[status-im2.navigation.events :as navigation]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(re-frame/reg-fx
:wallet.custom-token/contract-address-paste
@ -28,7 +29,7 @@
(rf/defn contract-address-is-changed
{:events [:wallet.custom-token/contract-address-is-pasted]}
[{:keys [db]} contract]
(if (ethereum/address? contract)
(if (address/address? contract)
(if (token-in-list? db contract)
{:db (assoc db
:wallet/custom-token-screen
@ -37,7 +38,7 @@
:wallet/custom-token-screen
{:contract contract :in-progress? true})
:json-rpc/call [{:method "wallet_discoverToken"
:params [(ethereum/chain-id db) contract]
:params [(chain/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

View File

@ -1,13 +1,13 @@
(ns status-im.wallet.prices
(:require [clojure.set :as set]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.tokens :as tokens]
[status-im.utils.currency :as currency]
[utils.re-frame :as rf]
[status-im.utils.prices :as prices]
[status-im.wallet.utils :as wallet.utils]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.ethereum.chain :as chain]))
(defn assoc-error-message
[db error-type err]
@ -54,7 +54,7 @@
:profile/profile
:as db}
:db}]
(let [chain (ethereum/chain-keyword db)
(let [chain (chain/chain-keyword db)
mainnet? (= :mainnet chain)
assets (get visible-tokens chain #{})
tokens (tokens-symbols assets all-tokens)
@ -63,7 +63,7 @@
{:wallet/get-prices
{:from (if mainnet?
(conj tokens "ETH")
[(-> (tokens/native-currency (ethereum/get-current-network db))
[(-> (tokens/native-currency (chain/get-current-network db))
(wallet.utils/exchange-symbol))])
:to [(:code currency)]
:mainnet? mainnet?

View File

@ -1,8 +1,7 @@
(ns status-im.wallet.recipient.core
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]
[utils.ethereum.eip.eip55 :as eip55]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.stateofus :as stateofus]
[utils.i18n :as i18n]
@ -12,7 +11,9 @@
[status-im.utils.utils :as utils]
[status-im2.common.json-rpc.events :as json-rpc]
[status-im2.navigation.events :as navigation]
[utils.string :as utils.string]))
[utils.string :as utils.string]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
;;NOTE we want to handle only last resolve
(def resolve-last-id (atom nil))
@ -40,7 +41,7 @@
(reset! resolve-last-id nil)
(let [recipient (utils.string/safe-trim raw-recipient)]
(cond
(ethereum/address? recipient)
(address/address? recipient)
(let [checksum (eip55/address->checksum recipient)]
(if (eip55/valid-address-checksum? checksum)
(rf/merge cofx
@ -67,7 +68,7 @@
(do
(reset! resolve-last-id (random/id))
{::resolve-address
{:chain-id (ethereum/chain-id db)
{:chain-id (chain/chain-id db)
:ens-name ens-name
:cb #(re-frame/dispatch [::recipient-address-resolved % @resolve-last-id])}})
{:db (assoc-in db [:wallet/recipient :searching] false)}))

View File

@ -24,3 +24,13 @@
(name (or (:symbol-exchange m)
(:symbol-display m)
(:symbol m))))
(defn get-default-account
[accounts]
(some #(when (:wallet %) %) accounts))
(defn default-address
[db]
(-> (get db :profile/wallet-accounts)
get-default-account
:address))

View File

@ -3,13 +3,13 @@
[re-frame.core :as re-frame]
[status-im.browser.core :as browser]
[status-im2.constants :as constants]
[status-im.ethereum.core :as ethereum]
[status-im.signing.core :as signing]
[status-im2.config :as config]
[utils.re-frame :as rf]
[status-im.utils.deprecated-types :as types]
[status-im.utils.wallet-connect :as wallet-connect]
[taoensso.timbre :as log]))
[taoensso.timbre :as log]
[utils.address :as address]))
(rf/defn proposal-handler
{:events [:wallet-connect/proposal]}
@ -149,7 +149,7 @@
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids)))
proposal-chain-ids)
address (:address account)
accounts (map #(str "eip155:" % ":" (ethereum/normalized-hex address))
accounts (map #(str "eip155:" % ":" (address/normalized-hex address))
supported-chain-ids)
;; TODO: Check for unsupported
metadata (get db :wallet-connect/proposal-metadata)
@ -179,7 +179,7 @@
available-chain-ids (map #(get-in % [:config :NetworkId]) (vals (get db :networks/networks)))
supported-chain-ids (filter (fn [chain-id] #(boolean (some #{chain-id} available-chain-ids)))
proposal-chain-ids)
accounts (map #(str "eip155:" % ":" (ethereum/normalized-hex address))
accounts (map #(str "eip155:" % ":" (address/normalized-hex address))
supported-chain-ids)]
{:db (assoc db
:wallet-connect/showing-app-management-sheet?

View File

@ -4,8 +4,8 @@
[utils.re-frame :as rf]
[status-im.multiaccounts.core :as multiaccounts]
[utils.i18n :as i18n]
[status-im.ethereum.core :as ethereum]
[reagent.core :as reagent]))
[reagent.core :as reagent]
[native-module.core :as native-module]))
(defn view
[]
@ -37,5 +37,5 @@
(i18n/label :t/oops-wrong-password)])
[quo/button
{:container-style {:margin-bottom 12 :margin-top 40}
:on-press #((:on-press button) (ethereum/sha3 @entered-password))}
:on-press #((:on-press button) (native-module/sha3 @entered-password))}
(:label button)]]))))

View File

@ -1,8 +1,8 @@
(ns status-im2.config
(:require [clojure.string :as string]
[react-native.config :as react-native-config]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]))
[status-im.ethereum.ens :as ens]
[utils.ethereum.chain :as chain]))
(def get-config react-native-config/get-config)
@ -55,18 +55,18 @@
(def verify-transaction-chain-id (js/parseInt (get-config :VERIFY_TRANSACTION_CHAIN_ID "1")))
(def verify-transaction-url
(if (= :mainnet (ethereum/chain-id->chain-keyword verify-transaction-chain-id))
(if (= :mainnet (chain/chain-id->chain-keyword verify-transaction-chain-id))
mainnet-rpc-url
goerli-rpc-url))
(def verify-ens-chain-id (js/parseInt (get-config :VERIFY_ENS_CHAIN_ID "1")))
(def verify-ens-url
(if (= :mainnet (ethereum/chain-id->chain-keyword verify-ens-chain-id))
(if (= :mainnet (chain/chain-id->chain-keyword verify-ens-chain-id))
mainnet-rpc-url
goerli-rpc-url))
(def verify-ens-contract-address
(get-config :VERIFY_ENS_CONTRACT_ADDRESS
((ethereum/chain-id->chain-keyword verify-ens-chain-id) ens/ens-registries)))
((chain/chain-id->chain-keyword verify-ens-chain-id) ens/ens-registries)))
(def fast-create-community-enabled?
(enabled? (get-config :FAST_CREATE_COMMUNITY_ENABLED "0")))
@ -92,7 +92,7 @@
[{:id "mainnet_rpc"
:chain-explorer-link "https://etherscan.io/address/"
:name "Mainnet with upstream RPC"
:config {:NetworkId (ethereum/chain-keyword->chain-id :mainnet)
:config {:NetworkId (chain/chain-keyword->chain-id :mainnet)
:DataDir "/ethereum/mainnet_rpc"
:UpstreamConfig {:Enabled true
:URL mainnet-rpc-url}}}])
@ -101,14 +101,14 @@
[{:id "xdai_rpc"
:name "xDai Chain"
:chain-explorer-link "https://blockscout.com/xdai/mainnet/address/"
:config {:NetworkId (ethereum/chain-keyword->chain-id :xdai)
:config {:NetworkId (chain/chain-keyword->chain-id :xdai)
:DataDir "/ethereum/xdai_rpc"
:UpstreamConfig {:Enabled true
:URL "https://gnosischain-rpc.gateway.pokt.network"}}}
{:id "bsc_rpc"
:chain-explorer-link "https://bscscan.com/address/"
:name "BSC Network"
:config {:NetworkId (ethereum/chain-keyword->chain-id :bsc)
:config {:NetworkId (chain/chain-keyword->chain-id :bsc)
:DataDir "/ethereum/bsc_rpc"
:UpstreamConfig {:Enabled true
:URL "https://bsc-dataseed.binance.org"}}}])
@ -117,14 +117,14 @@
[{:id "goerli_rpc"
:chain-explorer-link "https://goerli.etherscan.io/address/"
:name "Goerli with upstream RPC"
:config {:NetworkId (ethereum/chain-keyword->chain-id :goerli)
:config {:NetworkId (chain/chain-keyword->chain-id :goerli)
:DataDir "/ethereum/goerli_rpc"
:UpstreamConfig {:Enabled true
:URL goerli-rpc-url}}}
{:id "bsc_testnet_rpc"
:chain-explorer-link "https://testnet.bscscan.com/address/"
:name "BSC testnet"
:config {:NetworkId (ethereum/chain-keyword->chain-id :bsc-testnet)
:config {:NetworkId (chain/chain-keyword->chain-id :bsc-testnet)
:DataDir "/ethereum/bsc_testnet_rpc"
:UpstreamConfig {:Enabled true
:URL "https://data-seed-prebsc-1-s1.binance.org:8545/"}}}])

View File

@ -3,7 +3,6 @@
[utils.re-frame :as rf]
[utils.transforms :as transforms]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.ens :as ens]
[status-im.ethereum.stateofus :as stateofus]
[native-module.core :as native-module]
@ -11,7 +10,8 @@
[utils.validators :as validators]
[status-im2.contexts.contacts.events :as data-store.contacts]
[status-im2.constants :as constants]
[utils.string :as utils.string]))
[utils.string :as utils.string]
[utils.ethereum.chain :as chain]))
(defn init-contact
"Create a new contact (persisted to app-db as [:contacts/new-identity]).
@ -115,7 +115,7 @@
(dispatcher :contacts/set-new-identity-error input)}}
:resolve-ens {:db (assoc db :contacts/new-identity contact)
:contacts/resolve-public-key-from-ens
{:chain-id (ethereum/chain-id db)
{:chain-id (chain/chain-id db)
:ens ens
:on-success
(dispatcher :contacts/set-new-identity-success input)

View File

@ -2,7 +2,6 @@
(:require [utils.re-frame :as rf]
[native-module.core :as native-module]
[status-im2.contexts.profile.config :as profile.config]
[status-im.ethereum.core :as ethereum]
[utils.security.core :as security]
[re-frame.core :as re-frame]
[status-im2.contexts.shell.jump-to.utils :as shell.utils]
@ -26,7 +25,7 @@
{::create-profile-and-login
(merge (profile.config/create)
{:displayName display-name
:password (ethereum/sha3 (security/safe-unmask-data password))
:password (native-module/sha3 (security/safe-unmask-data password))
:imagePath (profile.config/strip-file-prefix image-path)
:customizationColor color})})

View File

@ -1,7 +1,6 @@
(ns status-im2.contexts.profile.login.events
(:require
[utils.re-frame :as rf]
[status-im.ethereum.core :as ethereum]
[utils.security.core :as security]
[re-frame.core :as re-frame]
[native-module.core :as native-module]
@ -40,7 +39,7 @@
[{:keys [db]}]
(let [{:keys [key-uid password]} (:profile/login db)]
{:db (assoc-in db [:profile/login :processing] true)
::login [key-uid (ethereum/sha3 (security/safe-unmask-data password))]}))
::login [key-uid (native-module/sha3 (security/safe-unmask-data password))]}))
(rf/defn login-local-paired-user
{:events [:profile.login/local-paired-user]}

View File

@ -1,6 +1,5 @@
(ns status-im2.contexts.profile.recover.events
(:require [utils.security.core :as security]
[status-im.ethereum.core :as ethereum]
[status-im2.contexts.profile.config :as profile.config]
[utils.re-frame :as rf]
[re-frame.core :as re-frame]
@ -22,6 +21,6 @@
(merge (profile.config/create)
{:displayName display-name
:mnemonic (security/safe-unmask-data seed-phrase)
:password (ethereum/sha3 (security/safe-unmask-data password))
:password (native-module/sha3 (security/safe-unmask-data password))
:imagePath (profile.config/strip-file-prefix image-path)
:customizationColor color})})

View File

@ -3,14 +3,14 @@
[quo2.theme :as theme]
[re-frame.core :as re-frame]
[status-im.contact.db :as contact.db]
[status-im.ethereum.core :as ethereum]
[status-im.multiaccounts.core :as multiaccounts]
[status-im.ui.screens.profile.visibility-status.utils :as visibility-status-utils]
[status-im.utils.gfycat.core :as gfycat]
[status-im2.constants :as constants]
[utils.collection]
[utils.i18n :as i18n]
[utils.image-server :as image-server]))
[utils.image-server :as image-server]
[utils.address :as address]))
(re-frame/reg-sub
::query-current-chat-contacts
@ -295,7 +295,7 @@
:<- [:contacts/contacts]
:<- [:multiaccount/contact]
(fn [[contacts multiaccount] [_ address]]
(if (ethereum/address= address (:public-key multiaccount))
(if (address/address= address (:public-key multiaccount))
multiaccount
(contact.db/find-contact-by-address contacts address))))

View File

@ -2,8 +2,9 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ens.core :as ens]
[status-im.ethereum.core :as ethereum]
[utils.money :as money]))
[utils.money :as money]
[utils.ethereum.chain :as chain]
[utils.address :as address]))
(re-frame/reg-sub
:ens/preferred-name
@ -37,7 +38,7 @@
:<- [:wallet]
(fn [[{:keys [custom-domain? username address]}
chain default-account public-key chain-id wallet]]
(let [address (or address (ethereum/normalized-hex (:address default-account)))
(let [address (or address (address/normalized-hex (:address default-account)))
balance (get-in wallet [:accounts address :balance])]
{:address address
:username username
@ -47,9 +48,9 @@
:amount-label (ens-amount-label chain-id)
:sufficient-funds? (money/sufficient-funds?
(money/formatted->internal (money/bignumber 10)
(ethereum/chain-keyword->snt-symbol chain)
(chain/chain-keyword->snt-symbol chain)
18)
(get balance (ethereum/chain-keyword->snt-symbol chain)))})))
(get balance (chain/chain-keyword->snt-symbol chain)))})))
(re-frame/reg-sub
:ens/confirmation-screen

View File

@ -1,12 +1,12 @@
(ns status-im2.subs.general
(:require [re-frame.core :as re-frame]
[clojure.string :as string]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.tokens :as tokens]
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.utils.build :as build]
[status-im.utils.mobile-sync :as mobile-network-utils]
[status-im2.constants :as constants]))
[status-im2.constants :as constants]
[utils.ethereum.chain :as chain]))
(re-frame/reg-sub
:visibility-status-updates/visibility-status-update
@ -50,26 +50,26 @@
(re-frame/reg-sub
:custom-rpc-node
:<- [:current-network]
(fn [network]
(ethereum/custom-rpc-node? network)))
(fn [{:keys [id]}]
(= 45 (count id))))
(re-frame/reg-sub
:chain-keyword
:<- [:current-network]
(fn [network]
(ethereum/network->chain-keyword network)))
(chain/network->chain-keyword network)))
(re-frame/reg-sub
:chain-name
:<- [:current-network]
(fn [network]
(ethereum/network->chain-name network)))
(chain/network->chain-name network)))
(re-frame/reg-sub
:chain-id
:<- [:current-network]
(fn [network]
(ethereum/network->chain-id network)))
(chain/network->chain-id network)))
(re-frame/reg-sub
:mainnet?
@ -220,7 +220,7 @@
:ethereum/chain-keyword
:<- [:current-network]
(fn [network]
(ethereum/network->chain-keyword network)))
(chain/network->chain-keyword network)))
(re-frame/reg-sub
:ethereum/native-currency

View File

@ -1,9 +1,9 @@
(ns status-im2.subs.keycard
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.keycard.common :as common]
[utils.datetime :as datetime]))
[utils.datetime :as datetime]
[utils.address :as address]))
(re-frame/reg-sub
:keycard/nfc-enabled?
@ -116,7 +116,7 @@
(re-frame/reg-sub
:keycard-multiaccount-whisper-public-key
(fn [db]
(ethereum/normalized-hex (get-in db [:keycard :multiaccount-whisper-public-key]))))
(address/normalized-hex (get-in db [:keycard :multiaccount-whisper-public-key]))))
(re-frame/reg-sub
:keycard-paired-on

View File

@ -1,13 +1,13 @@
(ns status-im2.subs.networks
(:require [re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im2.config :as config]))
[status-im2.config :as config]
[utils.ethereum.chain :as chain]))
(defn- filter-networks
[network-type]
(fn [network]
(let [chain-id (ethereum/network->chain-id network)
testnet? (ethereum/testnet? chain-id)
(let [chain-id (chain/network->chain-id network)
testnet? (chain/testnet? chain-id)
custom? (:custom? network)]
(case network-type
:custom custom?

View File

@ -3,12 +3,13 @@
[clojure.string :as string]
[quo2.theme :as theme]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.fleet.core :as fleet]
[status-im.multiaccounts.db :as multiaccounts.db]
[status-im2.constants :as constants]
[utils.image-server :as image-server]
[utils.security.core :as security]))
[utils.security.core :as security]
[status-im.wallet.utils :as wallet.utils]
[utils.address :as address]))
(re-frame/reg-sub
:profile/customization-color
@ -77,7 +78,7 @@
:multiaccount/default-account
:<- [:profile/wallet-accounts]
(fn [accounts]
(ethereum/get-default-account accounts)))
(wallet.utils/get-default-account accounts)))
(re-frame/reg-sub
:multiaccount/visible-accounts
@ -208,7 +209,7 @@
:generate
false
:watch
(or (not (ethereum/address? address))
(or (not (address/address? address))
(some #(when (= (:address %) address) %) accounts))
:key
(string/blank? (security/safe-unmask-data private-key))

View File

@ -1,12 +1,12 @@
(ns status-im2.subs.wallet.signing
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.tokens :as tokens]
[utils.i18n :as i18n]
[status-im.signing.gas :as signing.gas]
[utils.money :as money]
[status-im.wallet.db :as wallet.db]))
[status-im.wallet.db :as wallet.db]
[utils.ethereum.chain :as chain]))
(re-frame/reg-sub
::send-transaction
@ -41,7 +41,7 @@
:wallet/binance-chain?
:<- [:current-network]
(fn [network]
(ethereum/binance-chain-id? (get-in network [:config :NetworkId]))))
(chain/binance-chain-id? (get-in network [:config :NetworkId]))))
(re-frame/reg-sub
:signing/fee

View File

@ -1,12 +1,12 @@
(ns status-im2.subs.wallet.wallet
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.ethereum.core :as ethereum]
[status-im.ethereum.tokens :as tokens]
[status-im.utils.currency :as currency]
[utils.money :as money]
[status-im2.config :as config]
[utils.i18n :as i18n]))
[utils.i18n :as i18n]
[status-im.wallet.utils :as wallet.utils]))
(re-frame/reg-sub
:balance
@ -19,7 +19,7 @@
:<- [:wallet]
:<- [:profile/wallet-accounts]
(fn [[wallet accounts]]
(get-in wallet [:accounts (:address (ethereum/get-default-account accounts)) :balance])))
(get-in wallet [:accounts (:address (wallet.utils/get-default-account accounts)) :balance])))
(re-frame/reg-sub
:balances

View File

@ -1,7 +1,32 @@
(ns utils.address
;; TODO move to status-im2
(:require [status-im.ethereum.core :as ethereum]
[status-im.ethereum.eip55 :as eip55]))
(:require [utils.ethereum.eip.eip55 :as eip55]
[clojure.string :as string]
[native-module.core :as native-module]))
(def hex-prefix "0x")
(defn normalized-hex
[hex]
(when hex
(if (string/starts-with? hex hex-prefix)
hex
(str hex-prefix hex))))
(defn naked-address
[s]
(when s
(string/replace s hex-prefix "")))
(defn address?
[address]
(native-module/address? address))
(defn address=
[address1 address2]
(and address1
address2
(= (string/lower-case (normalized-hex address1))
(string/lower-case (normalized-hex address2)))))
(defn get-shortened-key
"Takes first and last 4 digits from address including leading 0x
@ -13,7 +38,7 @@
(defn get-shortened-checksum-address
[address]
(when address
(get-shortened-key (eip55/address->checksum (ethereum/normalized-hex address)))))
(get-shortened-key (eip55/address->checksum (normalized-hex address)))))
(defn get-abbreviated-profile-url
"The goal here is to generate a string that begins with

View File

@ -0,0 +1,84 @@
(ns utils.ethereum.chain)
(def BSC-mainnet-chain-id 56)
(def BSC-testnet-chain-id 97)
;; IDs standardized in https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids
(def chains
{:mainnet {:id 1 :name "Mainnet"}
:xdai {:id 100 :name "xDai"}
:goerli {:id 5 :name "Goerli"}
:bsc {:id BSC-mainnet-chain-id
:name "BSC"}
:bsc-testnet {:id BSC-testnet-chain-id
:name "BSC tetnet"}})
(defn chain-id->chain-keyword
[i]
(or (some #(when (= i (:id (val %))) (key %)) chains)
:custom))
(defn chain-id->chain-name
[i]
(or (some #(when (= i (:id (val %))) (:name (val %))) chains)
:custom))
(defn chain-keyword->chain-id
[k]
(get-in chains [k :id]))
(defn chain-keyword->snt-symbol
[k]
(case k
:mainnet :SNT
:STT))
(defn testnet?
[id]
(contains? #{(chain-keyword->chain-id :goerli)
(chain-keyword->chain-id :bsc-testnet)}
id))
(defn network->chain-id
[network]
(get-in network [:config :NetworkId]))
(defn network->chain-keyword
[network]
(chain-id->chain-keyword (network->chain-id network)))
(defn binance-chain-id?
[chain-id]
(or (= BSC-mainnet-chain-id chain-id)
(= BSC-testnet-chain-id chain-id)))
(defn current-network
[db]
(let [networks (get db :networks/networks)
network-id (get db :networks/current-network)]
(get networks network-id)))
(defn binance-chain?
[db]
(-> db
current-network
network->chain-id
binance-chain-id?))
(defn network->chain-name
[network]
(-> network
network->chain-keyword
name))
(defn get-current-network
[m]
(get (:networks/networks m) (:networks/current-network m)))
(defn chain-keyword
[db]
(network->chain-keyword (get-current-network db)))
(defn chain-id
[db]
(network->chain-id (get-current-network db)))

View File

@ -0,0 +1,8 @@
(ns utils.ethereum.chain-test
(:require [cljs.test :refer-macros [deftest is]]
[utils.ethereum.chain :as chain]))
(deftest chain-id->chain-keyword
(is (= (chain/chain-id->chain-keyword 1) :mainnet))
(is (= (chain/chain-id->chain-keyword 5) :goerli))
(is (= (chain/chain-id->chain-keyword 5777) :custom)))

View File

@ -1,4 +1,4 @@
(ns status-im.ethereum.eip55
(ns utils.ethereum.eip.eip55
"Utility function related to [EIP55](https://eips.ethereum.org/EIPS/eip-55)
This EIP standardize how ethereum addresses should be printed as strings to validate checksum.

View File

@ -1,6 +1,6 @@
(ns status-im.ethereum.eip55-test
(ns utils.ethereum.eip.eip55-test
(:require [cljs.test :refer-macros [deftest is]]
[status-im.ethereum.eip55 :as eip55]))
[utils.ethereum.eip.eip55 :as eip55]))
(deftest valid-address-checksum?
(is (= true (eip55/valid-address-checksum? "0x52908400098527886E0F7030069857D2E4169EE7")))

View File

@ -1,9 +0,0 @@
(ns utils.requests
(:require [utils.datetime :as datetime]))
(def request-cooldown-ms (* 24 60 60 1000))
(defn can-request-access-again?
[requested-at]
(> (datetime/timestamp) (+ (* requested-at 1000) request-cooldown-ms)))