mirror of
https://github.com/status-im/open-bounty.git
synced 2025-01-11 18:14:25 +00:00
Ethereum address validation + unit test
* utility function for validate Ethereum addresses * unit test
This commit is contained in:
parent
d5ebf3b0bc
commit
1663669163
@ -40,7 +40,8 @@
|
|||||||
[crypto-random "1.2.0"]
|
[crypto-random "1.2.0"]
|
||||||
[crypto-equality "1.0.0"]
|
[crypto-equality "1.0.0"]
|
||||||
[cheshire "5.7.0"]
|
[cheshire "5.7.0"]
|
||||||
[mpg "1.3.0"]]
|
[mpg "1.3.0"]
|
||||||
|
[pandect "0.6.1"]]
|
||||||
|
|
||||||
:min-lein-version "2.0.0"
|
:min-lein-version "2.0.0"
|
||||||
:source-paths ["src/clj" "src/cljc"]
|
:source-paths ["src/clj" "src/cljc"]
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
[commiteth.config :refer [env]]
|
[commiteth.config :refer [env]]
|
||||||
[clojure.string :refer [join]]
|
[clojure.string :refer [join]]
|
||||||
[clojure.tools.logging :as log]
|
[clojure.tools.logging :as log]
|
||||||
[clojure.string :as str]))
|
[clojure.string :as str]
|
||||||
|
[pandect.core :as pandect]))
|
||||||
|
|
||||||
(def eth-rpc-url "http://localhost:8545")
|
(def eth-rpc-url "http://localhost:8545")
|
||||||
(defn eth-account [] (:eth-account env))
|
(defn eth-account [] (:eth-account env))
|
||||||
@ -65,9 +66,9 @@
|
|||||||
(eth-rpc
|
(eth-rpc
|
||||||
"personal_sendTransaction"
|
"personal_sendTransaction"
|
||||||
[(if (not (nil? to))
|
[(if (not (nil? to))
|
||||||
(merge args {:to to})
|
(merge args {:to to})
|
||||||
args)
|
args)
|
||||||
(eth-password)])))
|
(eth-password)])))
|
||||||
|
|
||||||
(defn get-transaction-receipt
|
(defn get-transaction-receipt
|
||||||
[hash]
|
[hash]
|
||||||
@ -104,3 +105,44 @@
|
|||||||
(let [data (apply format-call-params method-id params)
|
(let [data (apply format-call-params method-id params)
|
||||||
value (format "0x%x" 1)]
|
value (format "0x%x" 1)]
|
||||||
(send-transaction from contract value {:data data})))
|
(send-transaction from contract value {:data data})))
|
||||||
|
|
||||||
|
|
||||||
|
(defn hex-ch->num
|
||||||
|
[ch]
|
||||||
|
(read-string (str "0x" ch)))
|
||||||
|
|
||||||
|
(defn strip-0x
|
||||||
|
[x]
|
||||||
|
(str/replace x #"(?i)^0x" ""))
|
||||||
|
|
||||||
|
(defn upper-ch [ch]
|
||||||
|
(first (str/upper-case ch)))
|
||||||
|
|
||||||
|
(defn lower-ch [ch]
|
||||||
|
(first (str/lower-case ch)))
|
||||||
|
|
||||||
|
(defn valid-address?
|
||||||
|
"Validate given ethereum address. Checksum validation is performed
|
||||||
|
and input is case-sensitive"
|
||||||
|
[address]
|
||||||
|
(log/debug "valid-address?" address)
|
||||||
|
;; logic based on
|
||||||
|
;; https://github.com/cilphex/ethereum-address/blob/master/index.js
|
||||||
|
(and (boolean (re-matches #"(?i)^(0x)?[0-9a-f]{40}$" address))
|
||||||
|
(let [addr (strip-0x address)
|
||||||
|
hash (pandect/keccak-256 (str/lower-case addr))]
|
||||||
|
(log/debug "address hash" hash "addr" addr)
|
||||||
|
(->>
|
||||||
|
(map-indexed (fn [idx _]
|
||||||
|
(let [hash-ch-int (-> (nth hash idx)
|
||||||
|
(hex-ch->num))
|
||||||
|
ch (nth addr idx)
|
||||||
|
ch-lower (lower-ch ch)
|
||||||
|
ch-upper (upper-ch ch)]
|
||||||
|
(or (and (> hash-ch-int 7)
|
||||||
|
(not= ch-upper ch))
|
||||||
|
(and (<= hash-ch-int 7)
|
||||||
|
(not= ch-lower ch)))))
|
||||||
|
addr)
|
||||||
|
(filter true?)
|
||||||
|
(empty?)))))
|
||||||
|
14
test/clj/commiteth/test/eth.clj
Normal file
14
test/clj/commiteth/test/eth.clj
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
(ns commiteth.test.eth
|
||||||
|
(:require [clojure.test :refer :all]
|
||||||
|
[commiteth.eth.core :as eth]))
|
||||||
|
|
||||||
|
(deftest test-address-validation
|
||||||
|
(testing "Short address is invalid"
|
||||||
|
(let [addr "0x34264362346364326423"]
|
||||||
|
(is (false? (eth/valid-address? addr)))))
|
||||||
|
(testing "Valid address is valid"
|
||||||
|
(let [addr "0xA1cab91b36bea34487c5670Bbd00a1Aa8196aeD8"]
|
||||||
|
(is (true? (eth/valid-address? addr)))))
|
||||||
|
(testing "Case sensitivity matters"
|
||||||
|
(let [addr "0xa1cab91b36bea34487c5670bbd00a1aa8196aed8"]
|
||||||
|
(is (false? (eth/valid-address? addr))))))
|
Loading…
x
Reference in New Issue
Block a user