diff --git a/controller/src/command.rs b/controller/src/command.rs index f2f5d878..2c7777c7 100644 --- a/controller/src/command.rs +++ b/controller/src/command.rs @@ -894,6 +894,7 @@ where pub struct CheckArgs { pub delete_unconfirmed: bool, pub start_height: Option, + pub backwards_from_tip: Option, } pub fn scan( @@ -907,8 +908,16 @@ where K: keychain::Keychain + 'static, { controller::owner_single_use(None, keychain_mask, Some(owner_api), |api, m| { - warn!("Starting output scan ...",); - let result = api.scan(m, args.start_height, args.delete_unconfirmed); + let tip_height = api.node_height(m)?.height; + let start_height = match args.backwards_from_tip { + Some(b) => tip_height.saturating_sub(b), + None => match args.start_height { + Some(s) => s, + None => 1, + }, + }; + warn!("Starting output scan from height {} ...", start_height); + let result = api.scan(m, Some(start_height), args.delete_unconfirmed); match result { Ok(_) => { warn!("Wallet check complete",); diff --git a/src/bin/grin-wallet.yml b/src/bin/grin-wallet.yml index a7b98fcc..8b5b1b43 100644 --- a/src/bin/grin-wallet.yml +++ b/src/bin/grin-wallet.yml @@ -368,7 +368,11 @@ subcommands: help: If given, the first block from which to start the scan (default 1) short: h long: start_height - default_value: "1" + takes_value: true + - backwards_from_tip: + help: If given, start scan b blocks back from the tip + short: b + long: backwards_from_tip, takes_value: true - export_proof: about: Export a payment proof from a completed transaction diff --git a/src/cmd/wallet_args.rs b/src/cmd/wallet_args.rs index 73825d25..946fccbd 100644 --- a/src/cmd/wallet_args.rs +++ b/src/cmd/wallet_args.rs @@ -705,9 +705,15 @@ pub fn parse_info_args(args: &ArgMatches) -> Result Result { let delete_unconfirmed = args.is_present("delete_unconfirmed"); let start_height = parse_u64_or_none(args.value_of("start_height")); + let backwards_from_tip = parse_u64_or_none(args.value_of("backwards_from_tip")); + if backwards_from_tip.is_some() && start_height.is_some() { + let msg = format!("backwards_from tip and start_height cannot both be present"); + return Err(ParseError::ArgumentError(msg)); + } Ok(command::CheckArgs { - start_height: start_height, - delete_unconfirmed: delete_unconfirmed, + start_height, + backwards_from_tip, + delete_unconfirmed, }) }