@@ -2262,4 +2262,175 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
2262
2262
2263
2263
assert_eq ! ( xonly_pk_descriptor. to_string( ) , xonly_converted_descriptor. to_string( ) ) ;
2264
2264
}
2265
+
2266
+ #[ test]
2267
+ fn test_iter_pk ( ) {
2268
+ // Test Bare descriptor
2269
+ let bare_desc = Descriptor :: < PublicKey > :: from_str (
2270
+ "pk(020000000000000000000000000000000000000000000000000000000000000002)" ,
2271
+ )
2272
+ . unwrap ( ) ;
2273
+ let keys: Vec < _ > = bare_desc. iter_pk ( ) . collect ( ) ;
2274
+ assert_eq ! ( keys. len( ) , 1 ) ;
2275
+ assert_eq ! (
2276
+ keys[ 0 ] . to_string( ) ,
2277
+ "020000000000000000000000000000000000000000000000000000000000000002"
2278
+ ) ;
2279
+
2280
+ // Test Pkh descriptor
2281
+ let pkh_desc = Descriptor :: < PublicKey > :: from_str (
2282
+ "pkh(020000000000000000000000000000000000000000000000000000000000000002)" ,
2283
+ )
2284
+ . unwrap ( ) ;
2285
+ let keys: Vec < _ > = pkh_desc. iter_pk ( ) . collect ( ) ;
2286
+ assert_eq ! ( keys. len( ) , 1 ) ;
2287
+ assert_eq ! (
2288
+ keys[ 0 ] . to_string( ) ,
2289
+ "020000000000000000000000000000000000000000000000000000000000000002"
2290
+ ) ;
2291
+
2292
+ // Test Wpkh descriptor
2293
+ let wpkh_desc = Descriptor :: < PublicKey > :: from_str (
2294
+ "wpkh(020000000000000000000000000000000000000000000000000000000000000002)" ,
2295
+ )
2296
+ . unwrap ( ) ;
2297
+ let keys: Vec < _ > = wpkh_desc. iter_pk ( ) . collect ( ) ;
2298
+ assert_eq ! ( keys. len( ) , 1 ) ;
2299
+ assert_eq ! (
2300
+ keys[ 0 ] . to_string( ) ,
2301
+ "020000000000000000000000000000000000000000000000000000000000000002"
2302
+ ) ;
2303
+
2304
+ // Test Sh descriptor with a miniscript
2305
+ let sh_desc = Descriptor :: < PublicKey > :: from_str (
2306
+ "sh(or_d(pk(021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b),pk(0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6)))"
2307
+ ) . unwrap ( ) ;
2308
+ let keys: Vec < _ > = sh_desc. iter_pk ( ) . collect ( ) ;
2309
+ assert_eq ! ( keys. len( ) , 2 ) ;
2310
+ assert_eq ! (
2311
+ keys[ 0 ] . to_string( ) ,
2312
+ "021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b"
2313
+ ) ;
2314
+ assert_eq ! (
2315
+ keys[ 1 ] . to_string( ) ,
2316
+ "0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6"
2317
+ ) ;
2318
+
2319
+ // Test Sh-Wpkh descriptor
2320
+ let shwpkh_desc = Descriptor :: < PublicKey > :: from_str (
2321
+ "sh(wpkh(020000000000000000000000000000000000000000000000000000000000000002))" ,
2322
+ )
2323
+ . unwrap ( ) ;
2324
+ let keys: Vec < _ > = shwpkh_desc. iter_pk ( ) . collect ( ) ;
2325
+ assert_eq ! ( keys. len( ) , 1 ) ;
2326
+ assert_eq ! (
2327
+ keys[ 0 ] . to_string( ) ,
2328
+ "020000000000000000000000000000000000000000000000000000000000000002"
2329
+ ) ;
2330
+
2331
+ // Test Sh-Wsh descriptor
2332
+ let shwsh_desc = Descriptor :: < PublicKey > :: from_str (
2333
+ "sh(wsh(or_d(pk(021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b),pk(0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6))))"
2334
+ ) . unwrap ( ) ;
2335
+ let keys: Vec < _ > = shwsh_desc. iter_pk ( ) . collect ( ) ;
2336
+ assert_eq ! ( keys. len( ) , 2 ) ;
2337
+ assert_eq ! (
2338
+ keys[ 0 ] . to_string( ) ,
2339
+ "021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b"
2340
+ ) ;
2341
+ assert_eq ! (
2342
+ keys[ 1 ] . to_string( ) ,
2343
+ "0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6"
2344
+ ) ;
2345
+
2346
+ // Test Wsh descriptor
2347
+ let wsh_desc = Descriptor :: < PublicKey > :: from_str (
2348
+ "wsh(or_d(pk(021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b),pk(0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6)))"
2349
+ ) . unwrap ( ) ;
2350
+ let keys: Vec < _ > = wsh_desc. iter_pk ( ) . collect ( ) ;
2351
+ assert_eq ! ( keys. len( ) , 2 ) ;
2352
+ assert_eq ! (
2353
+ keys[ 0 ] . to_string( ) ,
2354
+ "021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b"
2355
+ ) ;
2356
+ assert_eq ! (
2357
+ keys[ 1 ] . to_string( ) ,
2358
+ "0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6"
2359
+ ) ;
2360
+
2361
+ // Test SortedMulti descriptors
2362
+ let sortedmulti_desc = Descriptor :: < PublicKey > :: from_str (
2363
+ "sh(sortedmulti(2,021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b,0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6,03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556))"
2364
+ ) . unwrap ( ) ;
2365
+ let keys: Vec < _ > = sortedmulti_desc. iter_pk ( ) . collect ( ) ;
2366
+ assert_eq ! ( keys. len( ) , 3 ) ;
2367
+ // Keys are sorted in the output
2368
+ assert ! ( keys. iter( ) . any( |k| k. to_string( )
2369
+ == "021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b" ) ) ;
2370
+ assert ! ( keys. iter( ) . any( |k| k. to_string( )
2371
+ == "0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6" ) ) ;
2372
+ assert ! ( keys. iter( ) . any( |k| k. to_string( )
2373
+ == "03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556" ) ) ;
2374
+
2375
+ // Test Taproot descriptor with only key path
2376
+ let tr_key_only_desc = Descriptor :: < PublicKey > :: from_str (
2377
+ "tr(020000000000000000000000000000000000000000000000000000000000000002)" ,
2378
+ )
2379
+ . unwrap ( ) ;
2380
+ let keys: Vec < _ > = tr_key_only_desc. iter_pk ( ) . collect ( ) ;
2381
+ assert_eq ! ( keys. len( ) , 1 ) ;
2382
+ assert_eq ! (
2383
+ keys[ 0 ] . to_string( ) ,
2384
+ "020000000000000000000000000000000000000000000000000000000000000002"
2385
+ ) ;
2386
+
2387
+ // Test Taproot descriptor with script path
2388
+ // The internal key should be yielded first
2389
+ let internal_key = "020000000000000000000000000000000000000000000000000000000000000002" ;
2390
+ let script_key1 = "021d4ea7132d4e1a362ee5efd8d0b59dd4d1fe8906eefa7dd812b05a46b73d829b" ;
2391
+ let script_key2 = "0302c8bbbb393f32c843149ce36d56405595aaabab2d0e1f4ca5f9de67dd7419f6" ;
2392
+
2393
+ let tr_with_script_desc = Descriptor :: < PublicKey > :: from_str ( & format ! (
2394
+ "tr({},{{pk({}),pk({})}})" ,
2395
+ internal_key,
2396
+ script_key1,
2397
+ script_key2,
2398
+ ) )
2399
+ . unwrap ( ) ;
2400
+
2401
+ let keys: Vec < _ > = tr_with_script_desc. iter_pk ( ) . collect ( ) ;
2402
+ assert_eq ! ( keys. len( ) , 3 ) ;
2403
+
2404
+ // Verify internal key is first
2405
+ assert_eq ! ( keys[ 0 ] . to_string( ) , internal_key) ;
2406
+
2407
+ // Verify other keys are present (order after internal key is not guaranteed)
2408
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( ) == script_key1) ) ;
2409
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( ) == script_key2) ) ;
2410
+
2411
+ // Test Taproot descriptor with complex script tree
2412
+ let tr_complex_desc = Descriptor :: < PublicKey > :: from_str ( & format ! (
2413
+ "tr({},{{pk({}),{{pk({}),or_d(pk({}),pk({}))}}}})" ,
2414
+ internal_key,
2415
+ script_key1,
2416
+ script_key2,
2417
+ "03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556" ,
2418
+ "0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352"
2419
+ ) )
2420
+ . unwrap ( ) ;
2421
+
2422
+ let keys: Vec < _ > = tr_complex_desc. iter_pk ( ) . collect ( ) ;
2423
+ assert_eq ! ( keys. len( ) , 5 ) ;
2424
+
2425
+ // Verify internal key is first
2426
+ assert_eq ! ( keys[ 0 ] . to_string( ) , internal_key) ;
2427
+
2428
+ // Verify all other keys are present
2429
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( ) == script_key1) ) ;
2430
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( ) == script_key2) ) ;
2431
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( )
2432
+ == "03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556" ) ) ;
2433
+ assert ! ( keys[ 1 ..] . iter( ) . any( |k| k. to_string( )
2434
+ == "0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352" ) ) ;
2435
+ }
2265
2436
}
0 commit comments