@@ -11,7 +11,7 @@ import (
1111 "github.com/stretchr/testify/require"
1212)
1313
14- func Test_DerivePathAndDeriveSeed (t * testing.T ) {
14+ func TestDerivePathAndDeriveSeed (t * testing.T ) {
1515 t .Parallel ()
1616 tests := map [string ]struct {
1717 counter uint64
@@ -104,7 +104,7 @@ func TestDeriveSeed(t *testing.T) {
104104 }
105105}
106106
107- func Test_DeriveChildFromPath (t * testing.T ) {
107+ func TestDeriveChildFromPath (t * testing.T ) {
108108 t .Parallel ()
109109 tests := map [string ]struct {
110110 key * compat.ExtendedKey
@@ -176,3 +176,60 @@ func Test_DeriveChildFromPath(t *testing.T) {
176176 })
177177 }
178178}
179+
180+ func TestDerivePublicKeyFromPath (t * testing.T ) {
181+ t .Parallel ()
182+ tests := map [string ]struct {
183+ key * compat.ExtendedKey
184+ path string
185+ expectedPubKey []byte
186+ expectedErr error
187+ }{
188+ "successful run, 1 level child, should return expected public key" : {
189+ key : func () * compat.ExtendedKey {
190+ k , err := compat .NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
191+ assert .NoError (t , err )
192+ return k
193+ }(),
194+ path : "0/1" ,
195+ expectedPubKey : func () []byte {
196+ xpubStr := "xpub6AvUGrnEpfvJBbfx7sQ89Q8hEMPM65UteqEX4yUbUiES2jHfjexmfJoxCGSwFMZiPBaKQT1RiKWrKfuDV4vpgVs4Xn8PpPTR2i79rwHd4Zr"
197+ xpubKey , err := compat .NewKeyFromString (xpubStr )
198+ assert .NoError (t , err )
199+ pubKey , err := xpubKey .ECPubKey ()
200+ assert .NoError (t , err )
201+ return pubKey .SerializeCompressed ()
202+ }(),
203+ expectedErr : nil ,
204+ },
205+ "successful run, 3 level hardened child, should return expected public key" : {
206+ key : func () * compat.ExtendedKey {
207+ k , err := compat .NewKeyFromString ("xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi" )
208+ assert .NoError (t , err )
209+ return k
210+ }(),
211+ path : "10/1'/1000'/15'" ,
212+ expectedPubKey : func () []byte {
213+ xpubStr := "xpub6EagAesgan9f8xaZrxrDhPXZ1BKeKvNYWS56asqvFmC7CaAZ19TkdLvHDrzubSMiC6tAqTMcumVFkgT2duhZncV3KieshEDHNc4jPWkRMGD"
214+ xpubKey , err := compat .NewKeyFromString (xpubStr )
215+ assert .NoError (t , err )
216+ pubKey , err := xpubKey .ECPubKey ()
217+ assert .NoError (t , err )
218+ return pubKey .SerializeCompressed ()
219+ }(),
220+ expectedErr : nil ,
221+ },
222+ }
223+
224+ for name , test := range tests {
225+ t .Run (name , func (t * testing.T ) {
226+ pubKeyBytes , err := test .key .DerivePublicKeyFromPath (test .path )
227+ if test .expectedErr != nil {
228+ require .EqualError (t , err , test .expectedErr .Error ())
229+ } else {
230+ require .NoError (t , err )
231+ require .Equal (t , test .expectedPubKey , pubKeyBytes )
232+ }
233+ })
234+ }
235+ }
0 commit comments