1+ mod regtestenv;
12use bdk:: bitcoin:: secp256k1:: Secp256k1 ;
23use bdk:: bitcoin:: util:: key:: { PrivateKey , PublicKey } ;
34use bdk:: bitcoin:: util:: psbt:: PartiallySignedTransaction as PSBT ;
45use bdk:: bitcoin:: Network ;
5- use bdk:: blockchain:: electrum:: ElectrumBlockchain ;
66use bdk:: database:: memory:: MemoryDatabase ;
7- use bdk:: electrum_client:: Client ;
8- use bdk:: wallet:: { AddressIndex , SyncOptions , Wallet } ;
7+ use bdk:: wallet:: { AddressIndex , Wallet } ;
98use bdk:: Error ;
109use bdk:: SignOptions ;
1110use bdk_reserves:: reserves:: * ;
11+ use regtestenv:: RegTestEnv ;
1212use rstest:: rstest;
1313
1414enum MultisigType {
@@ -45,22 +45,18 @@ fn construct_multisig_wallet(
4545 desc
4646 } ) + & postfix;
4747
48- let client = Client :: new ( "ssl://electrum.blockstream.info:60002" ) ?;
49- let wallet = Wallet :: new ( & desc, None , Network :: Testnet , MemoryDatabase :: default ( ) ) ?;
50-
51- let blockchain = ElectrumBlockchain :: from ( client) ;
52- wallet. sync ( & blockchain, SyncOptions :: default ( ) ) ?;
48+ let wallet = Wallet :: new ( & desc, None , Network :: Regtest , MemoryDatabase :: default ( ) ) ?;
5349
5450 Ok ( wallet)
5551}
5652
5753#[ rstest]
58- #[ case(
54+ #[ case:: wsh (
5955 MultisigType :: Wsh ,
60- "tb1qnmhmxkaqqz4lrruhew5mk6zqr0ezstn3stj6c3r2my6hgkescm0sg3qc0r "
56+ "bcrt1qnmhmxkaqqz4lrruhew5mk6zqr0ezstn3stj6c3r2my6hgkescm0s9g276e "
6157) ]
62- #[ case( MultisigType :: ShWsh , "2NDTiUegP4NwKMnxXm6KdCL1B1WHamhZHC1" ) ]
63- #[ case( MultisigType :: P2sh , "2N7yrzYXgQzNQQuHNTjcP3iwpzFVsqe6non" ) ]
58+ #[ case:: shwsh ( MultisigType :: ShWsh , "2NDTiUegP4NwKMnxXm6KdCL1B1WHamhZHC1" ) ]
59+ #[ case:: p2sh ( MultisigType :: P2sh , "2N7yrzYXgQzNQQuHNTjcP3iwpzFVsqe6non" ) ]
6460fn test_proof_multisig (
6561 #[ case] script_type : MultisigType ,
6662 #[ case] expected_address : & ' static str ,
@@ -79,30 +75,38 @@ fn test_proof_multisig(
7975 ] ;
8076 pubkeys. sort_by_key ( |item| item. to_string ( ) ) ;
8177
82- let wallet1 = construct_multisig_wallet ( & signer1, & pubkeys, & script_type) ?;
83- let wallet2 = construct_multisig_wallet ( & signer2, & pubkeys, & script_type) ?;
84- let wallet3 = construct_multisig_wallet ( & signer3, & pubkeys, & script_type) ?;
85- assert_eq ! (
86- wallet1. get_address( AddressIndex :: New ) ?. to_string( ) ,
87- expected_address
88- ) ;
89- assert_eq ! (
90- wallet2. get_address( AddressIndex :: New ) ?. to_string( ) ,
91- expected_address
92- ) ;
93- assert_eq ! (
94- wallet3. get_address( AddressIndex :: New ) ?. to_string( ) ,
95- expected_address
96- ) ;
97- let balance = wallet1. get_balance ( ) ?;
98- assert ! (
99- ( 410000 ..=420000 ) . contains( & balance. confirmed) ,
100- "balance is {} but should be between 410000 and 420000" ,
101- balance
102- ) ;
78+ let wallets = [
79+ construct_multisig_wallet ( & signer1, & pubkeys, & script_type) ?,
80+ construct_multisig_wallet ( & signer2, & pubkeys, & script_type) ?,
81+ construct_multisig_wallet ( & signer3, & pubkeys, & script_type) ?,
82+ ] ;
83+
84+ wallets. iter ( ) . enumerate ( ) . for_each ( |( i, wallet) | {
85+ let addr = wallet. get_address ( AddressIndex :: New ) . unwrap ( ) . to_string ( ) ;
86+ assert ! (
87+ addr == expected_address,
88+ "Wallet {} address is {} instead of {}" ,
89+ i,
90+ addr,
91+ expected_address
92+ ) ;
93+ } ) ;
94+
95+ let regtestenv = RegTestEnv :: new ( ) ;
96+ regtestenv. generate ( & [ & wallets[ 0 ] , & wallets[ 1 ] , & wallets[ 2 ] ] ) ;
97+
98+ wallets. iter ( ) . enumerate ( ) . for_each ( |( i, wallet) | {
99+ let balance = wallet. get_balance ( ) . unwrap ( ) ;
100+ assert ! (
101+ ( 4_999_999_256 ..=4_999_999_596 ) . contains( & balance. confirmed) ,
102+ "balance of wallet {} is {} but should be between 4'999'999'256 and 4'999'999'596" ,
103+ i,
104+ balance
105+ ) ;
106+ } ) ;
103107
104108 let message = "All my precious coins" ;
105- let mut psbt = wallet1 . create_proof ( message) ?;
109+ let mut psbt = wallets [ 2 ] . create_proof ( message) ?;
106110 let num_inp = psbt. inputs . len ( ) ;
107111 assert ! (
108112 num_inp > 1 ,
@@ -131,33 +135,34 @@ fn test_proof_multisig(
131135 remove_partial_sigs : false ,
132136 ..Default :: default ( )
133137 } ;
134- let finalized = wallet1 . sign ( & mut psbt, signopts. clone ( ) ) ?;
138+ let finalized = wallets [ 0 ] . sign ( & mut psbt, signopts. clone ( ) ) ?;
135139 assert_eq ! ( count_signatures( & psbt) , ( num_inp - 1 , 1 , 0 ) ) ;
136140 assert ! ( !finalized) ;
137141
138- let finalized = wallet2 . sign ( & mut psbt, signopts. clone ( ) ) ?;
142+ let finalized = wallets [ 1 ] . sign ( & mut psbt, signopts. clone ( ) ) ?;
139143 assert_eq ! (
140144 count_signatures( & psbt) ,
141145 ( ( num_inp - 1 ) * 2 , num_inp, num_inp - 1 )
142146 ) ;
143147 assert ! ( finalized) ;
144148
145149 // 2 signatures are enough. Just checking what happens...
146- let finalized = wallet3 . sign ( & mut psbt, signopts. clone ( ) ) ?;
150+ let finalized = wallets [ 2 ] . sign ( & mut psbt, signopts. clone ( ) ) ?;
147151 assert_eq ! (
148152 count_signatures( & psbt) ,
149153 ( ( num_inp - 1 ) * 2 , num_inp, num_inp - 1 )
150154 ) ;
151155 assert ! ( finalized) ;
152156
153- let finalized = wallet1 . finalize_psbt ( & mut psbt, signopts) ?;
157+ let finalized = wallets [ 0 ] . finalize_psbt ( & mut psbt, signopts) ?;
154158 assert_eq ! (
155159 count_signatures( & psbt) ,
156160 ( ( num_inp - 1 ) * 2 , num_inp, num_inp - 1 )
157161 ) ;
158162 assert ! ( finalized) ;
159163
160- let spendable = wallet1. verify_proof ( & psbt, message, None ) ?;
164+ let spendable = wallets[ 0 ] . verify_proof ( & psbt, message, None ) ?;
165+ let balance = wallets[ 0 ] . get_balance ( ) ?;
161166 assert_eq ! ( spendable, balance. confirmed) ;
162167
163168 Ok ( ( ) )
0 commit comments