diff --git a/src/status_im/utils/ethereum/core.cljs b/src/status_im/utils/ethereum/core.cljs index 6fd685ba30..9a4c218a0c 100644 --- a/src/status_im/utils/ethereum/core.cljs +++ b/src/status_im/utils/ethereum/core.cljs @@ -3,6 +3,7 @@ [status-im.js-dependencies :as dependencies] [status-im.native-module.core :as status] [status-im.utils.ethereum.tokens :as tokens] + [status-im.utils.ethereum.abi-spec :as abi-spec] [status-im.utils.money :as money] [taoensso.timbre :as log])) @@ -132,7 +133,7 @@ :method "eth_call" :params [params "latest"]})) (fn [response] - (if (= "" response) + (if (string/blank? response) (log/warn :web3-response-error) (callback (get (js->clj (.parse js/JSON response)) "result")))))) @@ -175,11 +176,25 @@ (cb (js->clj result :keywordize-keys true)) (handle-error error))))) -(defn get-transaction [web3 number cb] - (.getTransaction (.-eth web3) number (fn [error result] - (if-not error - (cb (js->clj result :keywordize-keys true)) - (handle-error error))))) +(defn- decode-uint + [hex] + (first (abi-spec/decode hex ["uint"]))) + +(defn get-transaction [transaction-hash callback] + (status/call-private-rpc + (.stringify js/JSON (clj->js {:jsonprc "2.0" + :id 1 + :method "eth_getTransactionByHash" + :params [transaction-hash]})) + (fn [response] + (if (string/blank? response) + (log/warn :web3-response-error) + (callback (-> (.parse js/JSON response) + (js->clj :keywordize-keys true) + :result + (update :gasPrice decode-uint) + (update :value decode-uint) + (update :gas decode-uint))))))) (defn get-transaction-receipt [web3 number cb] (.getTransactionReceipt (.-eth web3) number (fn [error result] diff --git a/src/status_im/utils/ethereum/erc20.cljs b/src/status_im/utils/ethereum/erc20.cljs index 1d4045159e..4602182061 100644 --- a/src/status_im/utils/ethereum/erc20.cljs +++ b/src/status_im/utils/ethereum/erc20.cljs @@ -15,7 +15,9 @@ => 29166666 " - (:require [status-im.utils.ethereum.core :as ethereum] + (:require [clojure.string :as string] + [status-im.utils.ethereum.core :as ethereum] + [status-im.utils.ethereum.abi-spec :as abi-spec] [status-im.native-module.core :as status] [status-im.utils.security :as security] [status-im.js-dependencies :as dependencies] @@ -26,7 +28,7 @@ (def snt-contracts {:mainnet "0x744d70fdbe2ba4cf95131626614a1763df805b9e" - :testnet "0xc55cF4B03948D7EBc8b9E8BAD92643703811d162" + :testnet "0xc55cf4b03948d7ebc8b9e8bad92643703811d162" :rinkeby nil}) (def abi @@ -147,3 +149,26 @@ (ethereum/normalized-address owner-address) (ethereum/normalized-address spender-address)) #(cb (ethereum/hex->bignumber %)))) + +(defn is-transfer? + [input-data] + (string/starts-with? input-data "0xa9059cbb")) + +(defn is-snt-contract? + [contract] + ((into #{} (vals snt-contracts)) contract)) + +(defn get-transaction + "only supports SNT for now" + [transaction-hash callback] + (ethereum/get-transaction + transaction-hash + (fn [{:keys [to input] :as result}] + (when (and result + (is-snt-contract? to) + (is-transfer? input)) + (let [[recipient snt-value] + (abi-spec/decode (subs input 10) ["address" "uint"])] + (callback (assoc result + :recipient recipient + :snt-value snt-value)))))))