Skip to content

Commit 65c6e34

Browse files
committed
add more test cases to last_used_index test
1 parent ee3f855 commit 65c6e34

File tree

1 file changed

+47
-3
lines changed

1 file changed

+47
-3
lines changed

tests/integration.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ async fn do_test(test_env: waterfalls::test_env::TestEnv) {
114114
Family::Bitcoin => "",
115115
Family::Elements => "el",
116116
};
117-
let bitcoin_desc = format!("{prefix}wpkh(tpubDC8msFGeGuwnKG9Upg7DM2b4DaRqg3CUZa5g8v2SRQ6K4NSkxUgd7HsL2XVWbVm39yBA4LAxysQAm397zwQSQoQgewGiYZqrA9DsP4zbQ1M/<0;1>/*)");
117+
let tpub = "tpubDC8msFGeGuwnKG9Upg7DM2b4DaRqg3CUZa5g8v2SRQ6K4NSkxUgd7HsL2XVWbVm39yBA4LAxysQAm397zwQSQoQgewGiYZqrA9DsP4zbQ1M";
118+
let bitcoin_desc = format!("{prefix}wpkh({tpub}/<0;1>/*)");
118119
let single_bitcoin_desc = bitcoin_desc.replace("<0;1>", "0");
119120
let blinding = "slip77(9c8e4f05c7711a98c838be228bcb84924d4570ca53f35fa1c793e58841d47023)";
120121
let desc_str = format!("ct({blinding},{single_bitcoin_desc})"); // we use a non-multipath to generate addresses
@@ -325,7 +326,7 @@ async fn do_test(test_env: waterfalls::test_env::TestEnv) {
325326
assert!(result.tip.is_some());
326327

327328
// Test descriptor without wildcard
328-
let desc_str = format!("{prefix}wpkh(tpubDC8msFGeGuwnKG9Upg7DM2b4DaRqg3CUZa5g8v2SRQ6K4NSkxUgd7HsL2XVWbVm39yBA4LAxysQAm397zwQSQoQgewGiYZqrA9DsP4zbQ1M/0/0)");
329+
let desc_str = format!("{prefix}wpkh({tpub}/0/0)");
329330
let result = client.waterfalls_v2(&desc_str).await.unwrap().0;
330331
let first_script_result = &result.txs_seen.iter().next().unwrap().1[0];
331332
assert_eq!(result.page, 0);
@@ -420,9 +421,10 @@ async fn do_test_last_used_index(test_env: waterfalls::test_env::TestEnv) {
420421
Family::Bitcoin => "",
421422
Family::Elements => "el",
422423
};
424+
let tpub = "tpubDC8msFGeGuwnKG9Upg7DM2b4DaRqg3CUZa5g8v2SRQ6K4NSkxUgd7HsL2XVWbVm39yBA4LAxysQAm397zwQSQoQgewGiYZqrA9DsP4zbQ1M";
423425

424426
// Test descriptor with multipath
425-
let bitcoin_desc = format!("{prefix}wpkh(tpubDC8msFGeGuwnKG9Upg7DM2b4DaRqg3CUZa5g8v2SRQ6K4NSkxUgd7HsL2XVWbVm39yBA4LAxysQAm397zwQSQoQgewGiYZqrA9DsP4zbQ1M/<0;1>/*)");
427+
let bitcoin_desc = format!("{prefix}wpkh({tpub}/<0;1>/*)");
426428
let single_bitcoin_desc = bitcoin_desc.replace("<0;1>", "0");
427429
let blinding = "slip77(9c8e4f05c7711a98c838be228bcb84924d4570ca53f35fa1c793e58841d47023)";
428430
let desc_str = format!("ct({blinding},{single_bitcoin_desc})");
@@ -535,6 +537,46 @@ async fn do_test_last_used_index(test_env: waterfalls::test_env::TestEnv) {
535537
"Encrypted and plain descriptor should return same result"
536538
);
537539

540+
// Test descriptor without multipath (single chain, external only)
541+
// This should not cause infinite loops and should return the same external result
542+
let no_multipath_desc = format!("{prefix}wpkh({tpub}/0/*)");
543+
let result_no_multipath = client.last_used_index(&no_multipath_desc).await.unwrap();
544+
assert_eq!(
545+
result_no_multipath.external,
546+
Some(5),
547+
"Descriptor without multipath should find last used at index 5"
548+
);
549+
assert_eq!(
550+
result_no_multipath.internal, None,
551+
"Descriptor without multipath has no internal chain"
552+
);
553+
554+
// Test descriptor without wildcard (single address at index 0)
555+
// This should not cause infinite loops and should return external=0 since that address was used
556+
let no_wildcard_desc = format!("{prefix}wpkh({tpub}/0/0)");
557+
let result_no_wildcard = client.last_used_index(&no_wildcard_desc).await.unwrap();
558+
assert_eq!(
559+
result_no_wildcard.external,
560+
Some(0),
561+
"Descriptor without wildcard (index 0) should find activity"
562+
);
563+
assert_eq!(
564+
result_no_wildcard.internal, None,
565+
"Descriptor without wildcard has no internal chain"
566+
);
567+
568+
// Test descriptor without wildcard at an unused index (index 1)
569+
// This should return None for external since no tx at index 1
570+
let no_wildcard_unused_desc = format!("{prefix}wpkh({tpub}/0/1)");
571+
let result_no_wildcard_unused = client
572+
.last_used_index(&no_wildcard_unused_desc)
573+
.await
574+
.unwrap();
575+
assert_eq!(
576+
result_no_wildcard_unused.external, None,
577+
"Descriptor without wildcard at unused index should return None"
578+
);
579+
538580
println!(
539581
"last_used_index test completed successfully for {:?}",
540582
test_env.family
@@ -543,6 +585,8 @@ async fn do_test_last_used_index(test_env: waterfalls::test_env::TestEnv) {
543585
println!("✓ After sending to index 0: external=0");
544586
println!("✓ After sending to index 5: external=5");
545587
println!("✓ Encrypted descriptor works correctly");
588+
println!("✓ Descriptor without multipath works correctly");
589+
println!("✓ Descriptor without wildcard works correctly");
546590

547591
test_env.shutdown().await;
548592
}

0 commit comments

Comments
 (0)