share contract parsing

This commit is contained in:
wiesche
2026-09-12 16:02:13 +02:00
parent d73a253903
commit d2c1070f8f
+47 -78
View File
@@ -1039,13 +1039,7 @@ fn parse_contract_proof(
Ok((proof_type, memo)) Ok((proof_type, memo))
} }
pub fn parse_contract_new_args( fn parse_contract_amounts(args: &ArgMatches) -> Result<(Option<u64>, Option<u64>), ParseError> {
args: &ArgMatches,
account: &String,
) -> Result<command::ContractNewArgs, ParseError> {
// Optional: without --encrypt-for the contract slatepack is produced unencrypted.
let counterparty_addr = args.value_of("encrypt-for").map(String::from);
// Parse receive and send params and convert them to nano grin // Parse receive and send params and convert them to nano grin
let receive = match args.value_of("receive") { let receive = match args.value_of("receive") {
Some(g) => Some(parse_grin_amount(g, "receive")?), Some(g) => Some(parse_grin_amount(g, "receive")?),
@@ -1060,32 +1054,12 @@ pub fn parse_contract_new_args(
"Can't pass both --receive and --send parameters.", "Can't pass both --receive and --send parameters.",
))); )));
}; };
if receive.is_none() && send.is_none() { Ok((receive, send))
return Err(ParseError::ArgumentError(String::from( }
"You must specify either --receive or --send.",
))); fn parse_contract_selection(
}; args: &ArgMatches,
let src_acct_name = Some(String::from(account)); ) -> Result<(Option<String>, Option<Vec<u64>>), ParseError> {
let minimum_confirmations = parse_u64(
parse_required(args, "minimum_confirmations")?,
"minimum_confirmations",
)?;
let fee_rate = parse_contract_fee_rate(args)?;
let (proof_type, memo) = parse_contract_proof(args)?;
let outfile = parse_optional(args, "outfile")?;
let ttl_blocks = match args.value_of("ttl_blocks") {
Some(value) => {
let blocks = parse_u64(value, "ttl_blocks")?;
if blocks == 0 {
return Err(ParseError::ArgumentError(
"Contract TTL must be at least 1 block".to_string(),
));
}
Some(blocks)
}
None => None,
};
let as_json = args.is_present("as-json");
let no_payjoin = args.is_present("no-payjoin"); let no_payjoin = args.is_present("no-payjoin");
let use_inputs = match args.value_of("use-inputs") { let use_inputs = match args.value_of("use-inputs") {
Some(v) => { Some(v) => {
@@ -1117,6 +1091,44 @@ pub fn parse_contract_new_args(
} }
None => None, None => None,
}; };
Ok((use_inputs, make_outputs))
}
pub fn parse_contract_new_args(
args: &ArgMatches,
account: &String,
) -> Result<command::ContractNewArgs, ParseError> {
// Optional: without --encrypt-for the contract slatepack is produced unencrypted.
let counterparty_addr = args.value_of("encrypt-for").map(String::from);
let (receive, send) = parse_contract_amounts(args)?;
if receive.is_none() && send.is_none() {
return Err(ParseError::ArgumentError(String::from(
"You must specify either --receive or --send.",
)));
};
let src_acct_name = Some(String::from(account));
let minimum_confirmations = parse_u64(
parse_required(args, "minimum_confirmations")?,
"minimum_confirmations",
)?;
let fee_rate = parse_contract_fee_rate(args)?;
let (proof_type, memo) = parse_contract_proof(args)?;
let outfile = parse_optional(args, "outfile")?;
let ttl_blocks = match args.value_of("ttl_blocks") {
Some(value) => {
let blocks = parse_u64(value, "ttl_blocks")?;
if blocks == 0 {
return Err(ParseError::ArgumentError(
"Contract TTL must be at least 1 block".to_string(),
));
}
Some(blocks)
}
None => None,
};
let as_json = args.is_present("as-json");
let (use_inputs, make_outputs) = parse_contract_selection(args)?;
// Check the flags because use_inputs also contains the payjoin default. // Check the flags because use_inputs also contains the payjoin default.
let add_outputs = args.is_present("add-outputs") let add_outputs = args.is_present("add-outputs")
|| args.is_present("use-inputs") || args.is_present("use-inputs")
@@ -1155,20 +1167,7 @@ pub fn parse_contract_setup_args(
Some(v) => Some(String::from(v)), Some(v) => Some(String::from(v)),
None => None, None => None,
}; };
// Parse receive and send params and convert them to nano grin let (receive, send) = parse_contract_amounts(args)?;
let receive = match args.value_of("receive") {
Some(g) => Some(parse_grin_amount(g, "receive")?),
None => None,
};
let send = match args.value_of("send") {
Some(g) => Some(parse_grin_amount(g, "send")?),
None => None,
};
if receive.is_some() && send.is_some() {
return Err(ParseError::ArgumentError(String::from(
"Can't pass both --receive and --send parameters.",
)));
};
let as_json = args.is_present("as-json"); let as_json = args.is_present("as-json");
let minimum_confirmations = match args.value_of("minimum_confirmations") { let minimum_confirmations = match args.value_of("minimum_confirmations") {
Some(value) => Some(parse_u64(value, "minimum_confirmations")?), Some(value) => Some(parse_u64(value, "minimum_confirmations")?),
@@ -1177,37 +1176,7 @@ pub fn parse_contract_setup_args(
let fee_rate = parse_contract_fee_rate(args)?; let fee_rate = parse_contract_fee_rate(args)?;
let (proof_type, memo) = parse_contract_proof(args)?; let (proof_type, memo) = parse_contract_proof(args)?;
let outfile = parse_optional(args, "outfile")?; let outfile = parse_optional(args, "outfile")?;
let no_payjoin = args.is_present("no-payjoin"); let (use_inputs, make_outputs) = parse_contract_selection(args)?;
let use_inputs = match args.value_of("use-inputs") {
Some(v) => {
if no_payjoin {
return Err(ParseError::ArgumentError(String::from(
"Can't use --no-payjoin with --use-inputs.",
)));
}
Some(String::from(v))
}
None => {
if no_payjoin {
None
} else {
// Some("any") means pick an available input to contribute (payjoin)
Some(String::from("any"))
}
}
};
let make_outputs = match args.value_of("make-outputs") {
Some(v) => {
// Parse each comma-separated grin amount into nanogrin at the CLI boundary,
// so the API and Context carry explicit u64 amounts.
let mut amounts = Vec::new();
for amt in v.split(',') {
amounts.push(parse_grin_amount(amt, "make-outputs")?);
}
Some(amounts)
}
None => None,
};
Ok(command::ContractSetupArgs { Ok(command::ContractSetupArgs {
counterparty_addr: counterparty_addr, counterparty_addr: counterparty_addr,