Skip to content

Commit 9919954

Browse files
authored
Merge pull request #28 from CicadaBank/fix/derive-path-nested-macro
Solve issue #27
2 parents 6587af3 + 7c44d1d commit 9919954

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

src/bips/bip32.clj

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,25 @@
133133
:index 1000000000,
134134
:depth 5}`"
135135
[seed chain-path key-type]
136-
(let [path-parts (str/split chain-path #"/")]
137-
(loop [current-node (if (= "m" (first path-parts))
138-
`(derive-master-node ~seed)
139-
(throw (Exception.
140-
(str "Invalid path: " (first path-parts)))))
141-
parts (rest path-parts)]
142-
(if (seq parts)
143-
(let [part (first parts)
144-
index (if (hardened? part)
145-
(hardened (Integer/parseInt (subs part 0 (- (count part) 1))))
146-
(Integer/parseInt part))]
147-
(recur
148-
`(CKDpriv ~current-node ~index)
149-
(rest parts)))
150-
(if (= :public key-type)
151-
`(N ~current-node)
152-
current-node)))))
136+
(let [path-parts (gensym 'path-parts)
137+
part (gensym 'part)
138+
parts (gensym 'parts)
139+
current-node (gensym 'current-node)
140+
index (gensym 'index)]
141+
`(let [~path-parts (str/split ~chain-path #"/")]
142+
(loop [~current-node (if (= "m" (first ~path-parts))
143+
(derive-master-node ~seed)
144+
(throw (Exception.
145+
(str "Invalid path: " (first ~path-parts)))))
146+
~parts (rest ~path-parts)]
147+
(if (seq ~parts)
148+
(let [~part (first ~parts)
149+
~index (if (hardened? ~part)
150+
(hardened (Integer/parseInt (subs ~part 0 (- (count ~part) 1))))
151+
(Integer/parseInt ~part))]
152+
(recur
153+
(CKDpriv ~current-node ~index)
154+
(rest ~parts)))
155+
(if (= :public ~key-type)
156+
(N ~current-node)
157+
~current-node))))))

test/bips/bip32_test.clj

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@
7878
(doseq [i# (range (count (:derived-keys ~tv)))]
7979
(let [derived-key# (nth (:derived-keys ~tv) i#)
8080
path# (:path derived-key#)
81-
extended-private-key# (eval `(derive-path ~seed# ~path# :private))
82-
extended-public-key# (eval `(derive-path ~seed# ~path# :public))
81+
extended-private-key# (derive-path seed# path# :private)
82+
extended-public-key# (derive-path seed# path# :public)
8383
bip32-xprvkey# (:bip32-xprvkey derived-key#)
8484
bip32-xpubkey# (:bip32-xpubkey derived-key#)
8585
identifier# (:identifier derived-key#)
@@ -652,5 +652,13 @@
652652
(is (= "xpub6CTydV5ab9iSEgfY4hQqofu9YJiijeUs89T6jADgvA32Mk4oTvaV4pUJahHAGizYy2s3HyBRX1uiN2d94RsMawEgTMmRuDHLUR71EayS34i"
653653
bip32-xpub-grand-grandchild-public-key))))
654654

655+
(deftest threading-macro-works-with-derive-path
656+
(is (= (let [key "000102030405060708090a0b0c0d0e0f"
657+
path "m/0H/1/2H/2/1000000000"
658+
key-type :private]
659+
(-> key
660+
(derive-path path key-type)))
661+
(derive-path "000102030405060708090a0b0c0d0e0f" "m/0H/1/2H/2/1000000000" :private))))
662+
655663
(comment
656664
(clojure.test/run-all-tests))

0 commit comments

Comments
 (0)