Merge pull request #3698 from aantonop/warn_before_SCB_restore
Warn user before doing SCB restore
This commit is contained in:
commit
03ee8c047a
@ -1401,6 +1401,86 @@ func create(ctx *cli.Context) error {
|
|||||||
client, cleanUp := getWalletUnlockerClient(ctx)
|
client, cleanUp := getWalletUnlockerClient(ctx)
|
||||||
defer cleanUp()
|
defer cleanUp()
|
||||||
|
|
||||||
|
var (
|
||||||
|
chanBackups *lnrpc.ChanBackupSnapshot
|
||||||
|
|
||||||
|
// We use var restoreSCB to track if we will be including an SCB
|
||||||
|
// recovery in the init wallet request.
|
||||||
|
restoreSCB = false
|
||||||
|
)
|
||||||
|
|
||||||
|
backups, err := parseChanBackups(ctx)
|
||||||
|
|
||||||
|
// We'll check to see if the user provided any static channel backups (SCB),
|
||||||
|
// if so, we will warn the user that SCB recovery closes all open channels
|
||||||
|
// and ask them to confirm their intention.
|
||||||
|
// If the user agrees, we'll add the SCB recovery onto the final init wallet
|
||||||
|
// request.
|
||||||
|
switch {
|
||||||
|
// parseChanBackups returns an errMissingBackup error (which we ignore) if
|
||||||
|
// the user did not request a SCB recovery.
|
||||||
|
case err == errMissingChanBackup:
|
||||||
|
|
||||||
|
// Passed an invalid channel backup file.
|
||||||
|
case err != nil:
|
||||||
|
return fmt.Errorf("unable to parse chan backups: %v", err)
|
||||||
|
|
||||||
|
// We have an SCB recovery option with a valid backup file.
|
||||||
|
default:
|
||||||
|
|
||||||
|
warningLoop:
|
||||||
|
for {
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Printf("WARNING: You are attempting to restore from a " +
|
||||||
|
"static channel backup (SCB) file.\nThis action will CLOSE " +
|
||||||
|
"all currently open channels, and you will pay on-chain fees." +
|
||||||
|
"\n\nAre you sure you want to recover funds from a" +
|
||||||
|
" static channel backup? (Enter y/n): ")
|
||||||
|
|
||||||
|
reader := bufio.NewReader(os.Stdin)
|
||||||
|
answer, err := reader.ReadString('\n')
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
answer = strings.TrimSpace(answer)
|
||||||
|
answer = strings.ToLower(answer)
|
||||||
|
|
||||||
|
switch answer {
|
||||||
|
case "y":
|
||||||
|
restoreSCB = true
|
||||||
|
break warningLoop
|
||||||
|
case "n":
|
||||||
|
restoreSCB = false
|
||||||
|
break warningLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Proceed with SCB recovery.
|
||||||
|
if restoreSCB {
|
||||||
|
fmt.Println("Static Channel Backup (SCB) recovery selected!")
|
||||||
|
if backups != nil {
|
||||||
|
switch {
|
||||||
|
case backups.GetChanBackups() != nil:
|
||||||
|
singleBackup := backups.GetChanBackups()
|
||||||
|
chanBackups = &lnrpc.ChanBackupSnapshot{
|
||||||
|
SingleChanBackups: singleBackup,
|
||||||
|
}
|
||||||
|
|
||||||
|
case backups.GetMultiChanBackup() != nil:
|
||||||
|
multiBackup := backups.GetMultiChanBackup()
|
||||||
|
chanBackups = &lnrpc.ChanBackupSnapshot{
|
||||||
|
MultiChanBackup: &lnrpc.MultiChanBackup{
|
||||||
|
MultiChanBackup: multiBackup,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
walletPassword, err := capturePassword(
|
walletPassword, err := capturePassword(
|
||||||
"Input wallet password: ", false, walletunlocker.ValidatePassword,
|
"Input wallet password: ", false, walletunlocker.ValidatePassword,
|
||||||
)
|
)
|
||||||
@ -1569,34 +1649,6 @@ mnemonicCheck:
|
|||||||
fmt.Println("\n!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO " +
|
fmt.Println("\n!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO " +
|
||||||
"RESTORE THE WALLET!!!")
|
"RESTORE THE WALLET!!!")
|
||||||
|
|
||||||
// We'll also check to see if they provided any static channel backups,
|
|
||||||
// if so, then we'll also tack these onto the final init wallet request.
|
|
||||||
// We can ignore the errMissingChanBackup error as it's an optional
|
|
||||||
// field.
|
|
||||||
backups, err := parseChanBackups(ctx)
|
|
||||||
if err != nil && err != errMissingChanBackup {
|
|
||||||
return fmt.Errorf("unable to parse chan backups: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var chanBackups *lnrpc.ChanBackupSnapshot
|
|
||||||
if backups != nil {
|
|
||||||
switch {
|
|
||||||
case backups.GetChanBackups() != nil:
|
|
||||||
singleBackup := backups.GetChanBackups()
|
|
||||||
chanBackups = &lnrpc.ChanBackupSnapshot{
|
|
||||||
SingleChanBackups: singleBackup,
|
|
||||||
}
|
|
||||||
|
|
||||||
case backups.GetMultiChanBackup() != nil:
|
|
||||||
multiBackup := backups.GetMultiChanBackup()
|
|
||||||
chanBackups = &lnrpc.ChanBackupSnapshot{
|
|
||||||
MultiChanBackup: &lnrpc.MultiChanBackup{
|
|
||||||
MultiChanBackup: multiBackup,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// With either the user's prior cipher seed, or a newly generated one,
|
// With either the user's prior cipher seed, or a newly generated one,
|
||||||
// we'll go ahead and initialize the wallet.
|
// we'll go ahead and initialize the wallet.
|
||||||
req := &lnrpc.InitWalletRequest{
|
req := &lnrpc.InitWalletRequest{
|
||||||
@ -2410,7 +2462,7 @@ var sendToRouteCommand = cli.Command{
|
|||||||
Send a payment over Lightning using a specific route. One must specify
|
Send a payment over Lightning using a specific route. One must specify
|
||||||
the route to attempt and the payment hash. This command can even
|
the route to attempt and the payment hash. This command can even
|
||||||
be chained with the response to queryroutes or buildroute. This command
|
be chained with the response to queryroutes or buildroute. This command
|
||||||
can be used to implement channel rebalancing by crafting a self-route,
|
can be used to implement channel rebalancing by crafting a self-route,
|
||||||
or even atomic swaps using a self-route that crosses multiple chains.
|
or even atomic swaps using a self-route that crosses multiple chains.
|
||||||
|
|
||||||
There are three ways to specify a route:
|
There are three ways to specify a route:
|
||||||
|
Loading…
Reference in New Issue
Block a user