test contract inputs

This commit is contained in:
wiesche
2026-09-05 11:51:03 +02:00
parent bc6516ed81
commit dfce3ef377
5 changed files with 49 additions and 9 deletions
+32 -3
View File
@@ -2065,19 +2065,48 @@ mod contract_tests {
} }
#[test] #[test]
fn contract_sign_fee_rate() { fn contract_sign_args() {
let args = ContractSetupArgs { let args = ContractSetupArgs {
counterparty_addr: None, counterparty_addr: None,
receive: None, receive: None,
send: None, send: None,
as_json: false, as_json: false,
use_inputs: None, use_inputs: Some("commitment".to_string()),
make_outputs: None, make_outputs: None,
minimum_confirmations: None, minimum_confirmations: None,
fee_rate: Some(2), fee_rate: Some(2),
outfile: None, outfile: None,
add_outputs: false, add_outputs: false,
}; };
assert_eq!(args.to_api_args().unwrap().fee_rate, Some(2)); let api_args = args.to_api_args().unwrap();
assert_eq!(api_args.fee_rate, Some(2));
assert_eq!(
api_args.selection_args.use_inputs.as_deref(),
Some("commitment")
);
}
#[test]
fn contract_new_args() {
let args = ContractNewArgs {
counterparty_addr: None,
receive: Some(1),
send: None,
src_acct_name: None,
num_participants: 2,
as_json: false,
use_inputs: Some("commitment".to_string()),
make_outputs: None,
minimum_confirmations: 1,
ttl_blocks: None,
fee_rate: None,
outfile: None,
add_outputs: false,
};
let api_args = args.to_api_args().unwrap();
assert_eq!(
api_args.setup_args.selection_args.use_inputs.as_deref(),
Some("commitment")
);
} }
} }
+2 -1
View File
@@ -29,7 +29,8 @@ to balance that side of the transaction.
Payjoin is used by default. A receiver adds an input when one is available. An empty wallet Payjoin is used by default. A receiver adds an input when one is available. An empty wallet
can still receive; the fee is then taken from the received output. `--no-payjoin` prevents can still receive; the fee is then taken from the received output. `--no-payjoin` prevents
the receiver from adding an input and cannot be used together with `--use-inputs`. the receiver from adding an input and cannot be used together with `--use-inputs`. Pass one
or more comma-separated output commitments to `--use-inputs` to select specific payjoin inputs.
Inputs and outputs are normally picked when signing. `--add-outputs` picks and locks them Inputs and outputs are normally picked when signing. `--add-outputs` picks and locks them
during `new`. Prepared outputs appear as unconfirmed in the wallet, but are only added to during `new`. Prepared outputs appear as unconfirmed in the wallet, but are only added to
-2
View File
@@ -39,8 +39,6 @@ Separating side effects until the 'save_step' part would make these functions mu
- Reserve funds across open late-locked contracts, or make the possible signing failure - Reserve funds across open late-locked contracts, or make the possible signing failure
clearer to callers. clearer to callers.
- For a payjoin, `--use-inputs any` picks an input for us; naming the commitment would be
clearer, for the API as much as the CLI.
- Raise the replacement fee when `revoke` races a transaction already in the mempool. - Raise the replacement fee when `revoke` races a transaction already in the mempool.
- Merge invoice-proof retrieval with the existing payment-proof API. - Merge invoice-proof retrieval with the existing payment-proof API.
- Add a Grin node API for kernel lookup by MMR index, then use the witness index instead - Add a Grin node API for kernel lookup by MMR index, then use the witness index instead
+7 -2
View File
@@ -586,8 +586,8 @@ mod tests {
} }
#[test] #[test]
fn receiver_payjoin_exact() { fn receiver_payjoin_inputs() {
// net_change=-my_fees(1, 1), inputs=[my_fees(1, 0)], no fee committed => Ok([3, my_fees(2, 1)], fees) // A receiver payjoin uses the smallest input unless one is named
let setup_args = ContractSetupArgsAPI { let setup_args = ContractSetupArgsAPI {
// we expect to receive exactly our fee contribution my_fees(1, 1) // we expect to receive exactly our fee contribution my_fees(1, 1)
net_change: Some(my_fee_contribution(1, 1, 1, 2).unwrap().fee() as i64), net_change: Some(my_fee_contribution(1, 1, 1, 2).unwrap().fee() as i64),
@@ -608,6 +608,11 @@ mod tests {
result_ref, result_ref,
(expected_inputs, expected_output_amounts, expected_fee) (expected_inputs, expected_output_amounts, expected_fee)
); );
let mut named_args = setup_args.clone();
named_args.selection_args.use_inputs = Some("abc1".to_string());
let result = compute(&named_args, None, &mut inputs.clone()).unwrap();
assert_eq!(result.0, vec![inputs[1].clone()]);
} }
#[test] #[test]
+8 -1
View File
@@ -374,6 +374,10 @@ fn parses_contract_options() {
"grin-wallet", "grin-wallet",
"contract", "contract",
"sign", "sign",
"--receive",
"1",
"--use-inputs",
"commitment",
"--min_conf", "--min_conf",
"3", "3",
"--fee_rate", "--fee_rate",
@@ -388,6 +392,7 @@ fn parses_contract_options() {
assert_eq!(parsed.minimum_confirmations, Some(3)); assert_eq!(parsed.minimum_confirmations, Some(3));
assert_eq!(parsed.fee_rate, Some(2)); assert_eq!(parsed.fee_rate, Some(2));
assert_eq!(parsed.outfile.as_deref(), Some("sign.slatepack")); assert_eq!(parsed.outfile.as_deref(), Some("sign.slatepack"));
assert_eq!(parsed.use_inputs.as_deref(), Some("commitment"));
let args = app let args = app
.get_matches_from_safe(vec![ .get_matches_from_safe(vec![
@@ -421,6 +426,8 @@ fn selection_locks_early() {
}; };
assert!(!parse(&[]).add_outputs); assert!(!parse(&[]).add_outputs);
assert!(parse(&["--use-inputs", "commitment"]).add_outputs); let selected = parse(&["--use-inputs", "commitment"]);
assert!(selected.add_outputs);
assert_eq!(selected.use_inputs.as_deref(), Some("commitment"));
assert!(parse(&["--make-outputs", "1"]).add_outputs); assert!(parse(&["--make-outputs", "1"]).add_outputs);
} }