@@ -251,41 +251,47 @@ func printModifiedProtoJSON(resp proto.Message) {
251
251
// to command actions.
252
252
func actionDecorator (f func (* cli.Context ) error ) func (* cli.Context ) error {
253
253
return func (c * cli.Context ) error {
254
- if err := f (c ); err != nil {
255
- s , ok := status .FromError (err )
256
-
257
- // If it's a command for the UnlockerService (like
258
- // 'create' or 'unlock') but the wallet is already
259
- // unlocked, then these methods aren't recognized any
260
- // more because this service is shut down after
261
- // successful unlock. That's why the code
262
- // 'Unimplemented' means something different for these
263
- // two commands.
264
- if s .Code () == codes .Unimplemented &&
265
- (c .Command .Name == "create" ||
266
- c .Command .Name == "unlock" ||
267
- c .Command .Name == "changepassword" ||
268
- c .Command .Name == "createwatchonly" ) {
269
-
270
- return fmt .Errorf ("Wallet is already unlocked" )
271
- }
254
+ err := f (c )
272
255
273
- // lnd might be active, but not possible to contact
274
- // using RPC if the wallet is encrypted. If we get
275
- // error code Unimplemented, it means that lnd is
276
- // running, but the RPC server is not active yet (only
277
- // WalletUnlocker server active) and most likely this
278
- // is because of an encrypted wallet.
279
- if ok && s .Code () == codes .Unimplemented {
280
- return fmt .Errorf ("Wallet is encrypted. " +
281
- "Please unlock using 'lncli unlock', " +
282
- "or set password using 'lncli create'" +
283
- " if this is the first time starting " +
284
- "lnd." )
285
- }
256
+ // Exit early if there's no error.
257
+ if err == nil {
258
+ return nil
259
+ }
260
+
261
+ // Try to parse the Status representatio from this error.
262
+ s , ok := status .FromError (err )
263
+
264
+ // If this cannot be represented by a Status, exit early.
265
+ if ! ok {
286
266
return err
287
267
}
288
- return nil
268
+
269
+ // If it's a command for the UnlockerService (like 'create' or
270
+ // 'unlock') but the wallet is already unlocked, then these
271
+ // methods aren't recognized any more because this service is
272
+ // shut down after successful unlock.
273
+ if s .Code () == codes .Unknown &&
274
+ (c .Command .Name == "create" ||
275
+ c .Command .Name == "unlock" ||
276
+ c .Command .Name == "changepassword" ||
277
+ c .Command .Name == "createwatchonly" ) {
278
+
279
+ return errors .New ("wallet is already unlocked" )
280
+ }
281
+
282
+ // lnd might be active, but not possible to contact using RPC if
283
+ // the wallet is encrypted. If we get error code Unknown, it
284
+ // means that lnd is running, but the RPC server is not active
285
+ // yet (only WalletUnlocker server active) and most likely this
286
+ // is because of an encrypted wallet.
287
+ if s .Code () == codes .Unknown {
288
+ return errors .New ("wallet is encrypted - please " +
289
+ "unlock using 'lncli unlock', or set " +
290
+ "password using 'lncli create' if this is " +
291
+ "the first time starting lnd" )
292
+ }
293
+
294
+ return s .Err ()
289
295
}
290
296
}
291
297
0 commit comments