@@ -162,6 +162,57 @@ func (device *Device) BTCXPub(
162162 return pubResponse .Pub .Pub , nil
163163}
164164
165+ // BTCXPubs queries the device for multiple xpubs at a time. On firmware <v9.24.0, this falls back
166+ // to calling `BTCXPub()` for each keypath.
167+ func (device * Device ) BTCXPubs (
168+ coin messages.BTCCoin ,
169+ keypaths [][]uint32 ,
170+ xpubType messages.BTCXpubsRequest_XPubType ) ([]string , error ) {
171+ keypathMsgs := make ([]* messages.Keypath , len (keypaths ))
172+ if ! device .version .AtLeast (semver .NewSemVer (9 , 24 , 0 )) {
173+ // Fallback to fetching them one-by-one on older firmware.
174+ xpubTypeConverted , ok := map [messages.BTCXpubsRequest_XPubType ]messages.BTCPubRequest_XPubType {
175+ messages .BTCXpubsRequest_XPUB : messages .BTCPubRequest_XPUB ,
176+ messages .BTCXpubsRequest_TPUB : messages .BTCPubRequest_TPUB ,
177+ }[xpubType ]
178+ if ! ok {
179+ return nil , errp .New ("unrecongized xpubType" )
180+ }
181+ xpubs := make ([]string , len (keypaths ))
182+ for i , keypath := range keypaths {
183+ xpub , err := device .BTCXPub (coin , keypath , xpubTypeConverted , false )
184+ if err != nil {
185+ return nil , err
186+ }
187+ xpubs [i ] = xpub
188+ }
189+ return xpubs , nil
190+ }
191+
192+ for i , keypath := range keypaths {
193+ keypathMsgs [i ] = & messages.Keypath {Keypath : keypath }
194+ }
195+ request := & messages.BTCRequest {
196+ Request : & messages.BTCRequest_Xpubs {
197+ Xpubs : & messages.BTCXpubsRequest {
198+ Coin : coin ,
199+ XpubType : xpubType ,
200+ Keypaths : keypathMsgs ,
201+ },
202+ },
203+ }
204+ response , err := device .queryBTC (request )
205+ if err != nil {
206+ return nil , err
207+ }
208+
209+ pubsResponse , ok := response .Response .(* messages.BTCResponse_Pubs )
210+ if ! ok {
211+ return nil , errp .New ("unexpected response" )
212+ }
213+ return pubsResponse .Pubs .Pubs , nil
214+ }
215+
165216// BTCAddress queries the device for a btc, ltc, tbtc, tltc address.
166217func (device * Device ) BTCAddress (
167218 coin messages.BTCCoin ,
0 commit comments