@@ -46,52 +46,91 @@ fn spk_at_index(descriptor: &Descriptor<DescriptorPublicKey>, index: u32) -> Scr
46
46
fn append_keychain_derivation_indices ( ) {
47
47
#[ derive( Ord , PartialOrd , Eq , PartialEq , Clone , Debug ) ]
48
48
enum Keychain {
49
+ Zero ,
49
50
One ,
50
51
Two ,
51
52
Three ,
52
53
Four ,
53
54
}
54
- let mut lhs_di = BTreeMap :: < Keychain , u32 > :: default ( ) ;
55
- let mut rhs_di = BTreeMap :: < Keychain , u32 > :: default ( ) ;
56
- lhs_di. insert ( Keychain :: One , 7 ) ;
57
- lhs_di. insert ( Keychain :: Two , 0 ) ;
58
- rhs_di. insert ( Keychain :: One , 3 ) ;
59
- rhs_di. insert ( Keychain :: Two , 5 ) ;
60
- lhs_di. insert ( Keychain :: Three , 3 ) ;
61
- rhs_di. insert ( Keychain :: Four , 4 ) ;
55
+
56
+ let descriptors: Vec < _ > = common:: DESCRIPTORS
57
+ . into_iter ( )
58
+ . map ( |s| {
59
+ Descriptor :: parse_descriptor ( & Secp256k1 :: signing_only ( ) , s)
60
+ . unwrap ( )
61
+ . 0
62
+ } )
63
+ . collect ( ) ;
64
+
65
+ let mut lhs_di = BTreeMap :: < Keychain , ( Descriptor < DescriptorPublicKey > , u32 ) > :: default ( ) ;
66
+ let mut rhs_di = BTreeMap :: < Keychain , ( Descriptor < DescriptorPublicKey > , u32 ) > :: default ( ) ;
67
+ lhs_di. insert ( Keychain :: Zero , ( descriptors[ 0 ] . clone ( ) , 1 ) ) ;
68
+ lhs_di. insert ( Keychain :: One , ( descriptors[ 1 ] . clone ( ) , 7 ) ) ;
69
+ lhs_di. insert ( Keychain :: Two , ( descriptors[ 2 ] . clone ( ) , 0 ) ) ;
70
+
71
+ lhs_di. insert ( Keychain :: Zero , ( descriptors[ 1 ] . clone ( ) , 13 ) ) ;
72
+ rhs_di. insert ( Keychain :: One , ( descriptors[ 1 ] . clone ( ) , 3 ) ) ;
73
+ rhs_di. insert ( Keychain :: Two , ( descriptors[ 2 ] . clone ( ) , 5 ) ) ;
74
+ lhs_di. insert ( Keychain :: Three , ( descriptors[ 3 ] . clone ( ) , 3 ) ) ;
75
+ rhs_di. insert ( Keychain :: Four , ( descriptors[ 4 ] . clone ( ) , 4 ) ) ;
62
76
63
77
let mut lhs = ChangeSet ( lhs_di) ;
64
78
let rhs = ChangeSet ( rhs_di) ;
65
79
lhs. append ( rhs) ;
66
80
81
+ // Descriptor gets updated
82
+ assert_eq ! (
83
+ lhs. 0 . get( & Keychain :: Zero ) ,
84
+ ( Some ( & ( descriptors[ 1 ] . clone( ) , 13 ) ) )
85
+ ) ;
67
86
// Exiting index doesn't update if the new index in `other` is lower than `self`.
68
- assert_eq ! ( lhs. 0 . get( & Keychain :: One ) , Some ( & 7 ) ) ;
87
+ assert_eq ! (
88
+ lhs. 0 . get( & Keychain :: One ) ,
89
+ ( Some ( & ( descriptors[ 1 ] . clone( ) , 7 ) ) )
90
+ ) ;
69
91
// Existing index updates if the new index in `other` is higher than `self`.
70
- assert_eq ! ( lhs. 0 . get( & Keychain :: Two ) , Some ( & 5 ) ) ;
92
+ assert_eq ! (
93
+ lhs. 0 . get( & Keychain :: Two ) ,
94
+ Some ( & ( descriptors[ 2 ] . clone( ) , 5 ) )
95
+ ) ;
71
96
// Existing index is unchanged if keychain doesn't exist in `other`.
72
- assert_eq ! ( lhs. 0 . get( & Keychain :: Three ) , Some ( & 3 ) ) ;
97
+ assert_eq ! (
98
+ lhs. 0 . get( & Keychain :: Three ) ,
99
+ Some ( & ( descriptors[ 3 ] . clone( ) , 3 ) )
100
+ ) ;
73
101
// New keychain gets added if the keychain is in `other` but not in `self`.
74
- assert_eq ! ( lhs. 0 . get( & Keychain :: Four ) , Some ( & 4 ) ) ;
102
+ assert_eq ! (
103
+ lhs. 0 . get( & Keychain :: Four ) ,
104
+ Some ( & ( descriptors[ 4 ] . clone( ) , 4 ) )
105
+ ) ;
75
106
}
76
107
77
108
#[ test]
78
109
fn test_set_all_derivation_indices ( ) {
79
110
use bdk_chain:: indexed_tx_graph:: Indexer ;
80
111
81
- let ( mut txout_index, _, _) = init_txout_index ( ) ;
82
- let derive_to: BTreeMap < _ , _ > =
83
- [ ( TestKeychain :: External , 12 ) , ( TestKeychain :: Internal , 24 ) ] . into ( ) ;
112
+ let ( mut txout_index, external_desc, internal_desc) = init_txout_index ( ) ;
113
+ let result: BTreeMap < _ , _ > = [
114
+ ( TestKeychain :: External , ( external_desc, 12 ) ) ,
115
+ ( TestKeychain :: Internal , ( internal_desc, 24 ) ) ,
116
+ ]
117
+ . into ( ) ;
118
+ let derive_to = result
119
+ . clone ( )
120
+ . into_iter ( )
121
+ . map ( |( k, ( _, i) ) | ( k, i) )
122
+ . collect ( ) ;
84
123
assert_eq ! (
85
124
txout_index. reveal_to_target_multi( & derive_to) . 1 . as_inner( ) ,
86
- & derive_to
125
+ & result
87
126
) ;
88
127
assert_eq ! ( txout_index. last_revealed_indices( ) , & derive_to) ;
89
128
assert_eq ! (
90
129
txout_index. reveal_to_target_multi( & derive_to) . 1 ,
91
130
keychain:: ChangeSet :: default ( ) ,
92
131
"no changes if we set to the same thing"
93
132
) ;
94
- assert_eq ! ( txout_index. initial_changeset( ) . as_inner( ) , & derive_to ) ;
133
+ assert_eq ! ( txout_index. initial_changeset( ) . as_inner( ) , & result ) ;
95
134
}
96
135
97
136
#[ test]
@@ -123,7 +162,7 @@ fn test_lookahead() {
123
162
) ;
124
163
assert_eq ! (
125
164
revealed_changeset. as_inner( ) ,
126
- & [ ( TestKeychain :: External , index) ] . into( )
165
+ & [ ( TestKeychain :: External , ( external_desc . clone ( ) , index) ) ] . into( )
127
166
) ;
128
167
129
168
assert_eq ! (
@@ -175,7 +214,7 @@ fn test_lookahead() {
175
214
) ;
176
215
assert_eq ! (
177
216
revealed_changeset. as_inner( ) ,
178
- & [ ( TestKeychain :: Internal , 24 ) ] . into( )
217
+ & [ ( TestKeychain :: Internal , ( internal_desc . clone ( ) , 24 ) ) ] . into( )
179
218
) ;
180
219
assert_eq ! (
181
220
txout_index. inner( ) . all_spks( ) . len( ) ,
@@ -284,7 +323,7 @@ fn test_scan_with_lookahead() {
284
323
let changeset = txout_index. index_txout ( op, & txout) ;
285
324
assert_eq ! (
286
325
changeset. as_inner( ) ,
287
- & [ ( TestKeychain :: External , spk_i) ] . into( )
326
+ & [ ( TestKeychain :: External , ( external_desc . clone ( ) , spk_i) ) ] . into( )
288
327
) ;
289
328
assert_eq ! (
290
329
txout_index. last_revealed_index( & TestKeychain :: External ) ,
@@ -328,7 +367,7 @@ fn test_wildcard_derivations() {
328
367
assert_eq ! ( txout_index. next_index( & TestKeychain :: External ) , ( 0 , true ) ) ;
329
368
let ( spk, changeset) = txout_index. reveal_next_spk ( & TestKeychain :: External ) ;
330
369
assert_eq ! ( spk, ( 0_u32 , external_spk_0. as_script( ) ) ) ;
331
- assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , 0 ) ] . into( ) ) ;
370
+ assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , ( external_desc . clone ( ) , 0 ) ) ] . into( ) ) ;
332
371
let ( spk, changeset) = txout_index. next_unused_spk ( & TestKeychain :: External ) ;
333
372
assert_eq ! ( spk, ( 0_u32 , external_spk_0. as_script( ) ) ) ;
334
373
assert_eq ! ( changeset. as_inner( ) , & [ ] . into( ) ) ;
@@ -352,7 +391,7 @@ fn test_wildcard_derivations() {
352
391
let ( spk, changeset) = txout_index. reveal_next_spk ( & TestKeychain :: External ) ;
353
392
assert_eq ! ( spk, ( 26 , external_spk_26. as_script( ) ) ) ;
354
393
355
- assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , 26 ) ] . into( ) ) ;
394
+ assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , ( external_desc . clone ( ) , 26 ) ) ] . into( ) ) ;
356
395
357
396
let ( spk, changeset) = txout_index. next_unused_spk ( & TestKeychain :: External ) ;
358
397
assert_eq ! ( spk, ( 16 , external_spk_16. as_script( ) ) ) ;
@@ -366,7 +405,7 @@ fn test_wildcard_derivations() {
366
405
367
406
let ( spk, changeset) = txout_index. next_unused_spk ( & TestKeychain :: External ) ;
368
407
assert_eq ! ( spk, ( 27 , external_spk_27. as_script( ) ) ) ;
369
- assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , 27 ) ] . into( ) ) ;
408
+ assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , ( external_desc , 27 ) ) ] . into( ) ) ;
370
409
}
371
410
372
411
#[ test]
@@ -380,7 +419,7 @@ fn test_non_wildcard_derivations() {
380
419
. unwrap ( )
381
420
. script_pubkey ( ) ;
382
421
383
- txout_index. add_keychain ( TestKeychain :: External , no_wildcard_descriptor) ;
422
+ txout_index. add_keychain ( TestKeychain :: External , no_wildcard_descriptor. clone ( ) ) ;
384
423
385
424
// given:
386
425
// - `txout_index` with no stored scripts
@@ -391,7 +430,10 @@ fn test_non_wildcard_derivations() {
391
430
assert_eq ! ( txout_index. next_index( & TestKeychain :: External ) , ( 0 , true ) ) ;
392
431
let ( spk, changeset) = txout_index. reveal_next_spk ( & TestKeychain :: External ) ;
393
432
assert_eq ! ( spk, ( 0 , external_spk. as_script( ) ) ) ;
394
- assert_eq ! ( changeset. as_inner( ) , & [ ( TestKeychain :: External , 0 ) ] . into( ) ) ;
433
+ assert_eq ! (
434
+ changeset. as_inner( ) ,
435
+ & [ ( TestKeychain :: External , ( no_wildcard_descriptor, 0 ) ) ] . into( )
436
+ ) ;
395
437
396
438
let ( spk, changeset) = txout_index. next_unused_spk ( & TestKeychain :: External ) ;
397
439
assert_eq ! ( spk, ( 0 , external_spk. as_script( ) ) ) ;
0 commit comments