Merge pull request #9605 from yyforyongyu/fix-unlock-wallet

cmd: fix error parsed from status
This commit is contained in:
Olaoluwa Osuntokun
2025-03-18 11:37:35 -05:00
committed by GitHub
2 changed files with 42 additions and 30 deletions

View File

@@ -251,41 +251,47 @@ func printModifiedProtoJSON(resp proto.Message) {
// to command actions. // to command actions.
func actionDecorator(f func(*cli.Context) error) func(*cli.Context) error { func actionDecorator(f func(*cli.Context) error) func(*cli.Context) error {
return func(c *cli.Context) error { return func(c *cli.Context) error {
if err := f(c); err != nil { err := f(c)
// Exit early if there's no error.
if err == nil {
return nil
}
// Try to parse the Status representatio from this error.
s, ok := status.FromError(err) s, ok := status.FromError(err)
// If it's a command for the UnlockerService (like // If this cannot be represented by a Status, exit early.
// 'create' or 'unlock') but the wallet is already if !ok {
// unlocked, then these methods aren't recognized any return err
// more because this service is shut down after }
// successful unlock. That's why the code
// 'Unimplemented' means something different for these // If it's a command for the UnlockerService (like 'create' or
// two commands. // 'unlock') but the wallet is already unlocked, then these
if s.Code() == codes.Unimplemented && // methods aren't recognized any more because this service is
// shut down after successful unlock.
if s.Code() == codes.Unknown &&
(c.Command.Name == "create" || (c.Command.Name == "create" ||
c.Command.Name == "unlock" || c.Command.Name == "unlock" ||
c.Command.Name == "changepassword" || c.Command.Name == "changepassword" ||
c.Command.Name == "createwatchonly") { c.Command.Name == "createwatchonly") {
return fmt.Errorf("Wallet is already unlocked") return errors.New("wallet is already unlocked")
} }
// lnd might be active, but not possible to contact // lnd might be active, but not possible to contact using RPC if
// using RPC if the wallet is encrypted. If we get // the wallet is encrypted. If we get error code Unknown, it
// error code Unimplemented, it means that lnd is // means that lnd is running, but the RPC server is not active
// running, but the RPC server is not active yet (only // yet (only WalletUnlocker server active) and most likely this
// WalletUnlocker server active) and most likely this
// is because of an encrypted wallet. // is because of an encrypted wallet.
if ok && s.Code() == codes.Unimplemented { if s.Code() == codes.Unknown {
return fmt.Errorf("Wallet is encrypted. " + return errors.New("wallet is encrypted - please " +
"Please unlock using 'lncli unlock', " + "unlock using 'lncli unlock', or set " +
"or set password using 'lncli create'" + "password using 'lncli create' if this is " +
" if this is the first time starting " + "the first time starting lnd")
"lnd.")
} }
return err
} return s.Err()
return nil
} }
} }

View File

@@ -236,6 +236,12 @@
## lncli Updates ## lncli Updates
* [Fixed](https://github.com/lightningnetwork/lnd/pull/9605) a case where
inaccurate error message is displayed. Previously, when the `lnd` is built
without with a given RPC service yet the `cli` does, running a command to
access the RPC server would give an error saying the wallet is encrypted. This
is now fixed to show specifically which RPC server is missing.
## Code Health ## Code Health
* [Add retry logic](https://github.com/lightningnetwork/lnd/pull/8381) for * [Add retry logic](https://github.com/lightningnetwork/lnd/pull/8381) for