@@ -913,48 +913,97 @@ macro_rules! bdk_blockchain_tests {
913
913
#[ test]
914
914
fn test_send_to_bech32m_addr( ) {
915
915
use std:: str :: FromStr ;
916
- use core_rpc:: RpcApi ;
917
- use core_rpc:: core_rpc_json:: ImportDescriptorRequest ;
916
+ use serde;
917
+ use serde_json;
918
+ use serde:: Serialize ;
919
+ use bitcoincore_rpc:: jsonrpc:: serde_json:: Value ;
920
+ use bitcoincore_rpc:: { Auth , Client , RpcApi } ;
918
921
919
922
let ( wallet, descriptors, mut test_client) = init_single_sig( ) ;
920
923
924
+ // TODO remove once rust-bitcoincore-rpc with PR 199 released
925
+ // https://github.com/rust-bitcoin/rust-bitcoincore-rpc/pull/199
926
+ /// Import Descriptor Request
927
+ #[ derive( Serialize , Clone , PartialEq , Eq , Debug ) ]
928
+ pub struct ImportDescriptorRequest {
929
+ pub active: bool ,
930
+ #[ serde( rename = "desc" ) ]
931
+ pub descriptor: String ,
932
+ pub range: [ i64 ; 2 ] ,
933
+ pub next_index: i64 ,
934
+ pub timestamp: String ,
935
+ pub internal: bool ,
936
+ }
937
+
938
+ // TODO remove once rust-bitcoincore-rpc with PR 199 released
939
+ impl ImportDescriptorRequest {
940
+ /// Create a new Import Descriptor request providing just the descriptor and internal flags
941
+ pub fn new( descriptor: & str , internal: bool ) -> Self {
942
+ ImportDescriptorRequest {
943
+ descriptor: descriptor. to_string( ) ,
944
+ internal,
945
+ active: true ,
946
+ range: [ 0 , 100 ] ,
947
+ next_index: 0 ,
948
+ timestamp: "now" . to_string( ) ,
949
+ }
950
+ }
951
+ }
952
+
953
+ // 1. Create and add descriptors to a test bitcoind node taproot wallet
954
+
955
+ // TODO replace once rust-bitcoincore-rpc with PR 174 released
956
+ // https://github.com/rust-bitcoin/rust-bitcoincore-rpc/pull/174
957
+ let _createwallet_result: Value = test_client. bitcoind. client. call( "createwallet" , & [ "taproot_wallet" . into( ) , false . into( ) , true . into( ) , serde_json:: to_value( "" ) . unwrap( ) , false . into( ) , true . into( ) ] ) . unwrap( ) ;
958
+
959
+ // TODO replace once bitcoind released with support for rust-bitcoincore-rpc PR 174
960
+ let taproot_wallet_client = Client :: new( & test_client. bitcoind. rpc_url_with_wallet( "taproot_wallet" ) , Auth :: CookieFile ( test_client. bitcoind. params. cookie_file. clone( ) ) ) . unwrap( ) ;
961
+
921
962
let wallet_descriptor = "tr(tprv8ZgxMBicQKsPdBtxmEMPnNq58KGusNAimQirKFHqX2yk2D8q1v6pNLiKYVAdzDHy2w3vF4chuGfMvNtzsbTTLVXBcdkCA1rje1JG6oksWv8/86h/1h/0h/0/*)#y283ssmn" ;
922
963
let change_descriptor = "tr(tprv8ZgxMBicQKsPdBtxmEMPnNq58KGusNAimQirKFHqX2yk2D8q1v6pNLiKYVAdzDHy2w3vF4chuGfMvNtzsbTTLVXBcdkCA1rje1JG6oksWv8/86h/1h/0h/1/*)#47zsd9tt" ;
923
964
924
- test_client. bitcoind. client
925
- . import_descriptors(
926
- vec![
965
+ let tr_descriptors = vec![
927
966
ImportDescriptorRequest :: new( wallet_descriptor, false ) ,
928
967
ImportDescriptorRequest :: new( change_descriptor, false ) ,
929
- ]
930
- ) . unwrap( ) ;
968
+ ] ;
969
+
970
+ // TODO replace once rust-bitcoincore-rpc with PR 199 released
971
+ let _import_result: Value = taproot_wallet_client. call( "importdescriptors" , & [ serde_json:: to_value( tr_descriptors) . unwrap( ) ] ) . unwrap( ) ;
972
+
973
+ // 2. Get a new bech32m address from test bitcoind node taproot wallet
931
974
932
- let node_addr = test_client. get_node_address( Some ( core_rpc:: core_rpc_json:: AddressType :: Bech32m ) ) ;
975
+ // TODO replace once rust-bitcoincore-rpc with PR 199 released
976
+ let node_addr: bitcoin:: Address = taproot_wallet_client. call( "getnewaddress" , & [ "test address" . into( ) , "bech32m" . into( ) ] ) . unwrap( ) ;
933
977
assert_eq!( node_addr, bitcoin:: Address :: from_str( "bcrt1pj5y3f0fu4y7g98k4v63j9n0xvj3lmln0cpwhsjzknm6nt0hr0q7qnzwsy9" ) . unwrap( ) ) ;
934
978
935
- let new_bech32m_addr = test_client. get_new_address( Some ( "test bech32m" ) , Some ( core_rpc:: core_rpc_json:: AddressType :: Bech32m ) ) . unwrap( ) ;
936
- assert_eq!( new_bech32m_addr, bitcoin:: Address :: from_str( "bcrt1pxa4h86c5gc8x65un8nz546wy7hqxv7wljrv5sxukayh3xwnw23fs80jdf9" ) . unwrap( ) ) ;
979
+ // 3. Send 50_000 sats from test bitcoind node to test BDK wallet
937
980
938
981
test_client. receive( testutils! {
939
982
@tx ( ( @external descriptors, 0 ) => 50_000 )
940
983
} ) ;
941
984
942
985
wallet. sync( noop_progress( ) , None ) . unwrap( ) ;
943
- assert_eq!( wallet. get_balance( ) . unwrap( ) , 50_000 , "incorrect balance" ) ;
986
+ assert_eq!( wallet. get_balance( ) . unwrap( ) , 50_000 , "wallet has incorrect balance" ) ;
987
+
988
+ // 4. Send 25_000 sats from test BDK wallet to test bitcoind node taproot wallet
944
989
945
990
let mut builder = wallet. build_tx( ) ;
946
991
builder. add_recipient( node_addr. script_pubkey( ) , 25_000 ) ;
947
992
let ( mut psbt, details) = builder. finish( ) . unwrap( ) ;
948
993
let finalized = wallet. sign( & mut psbt, Default :: default ( ) ) . unwrap( ) ;
949
- assert!( finalized, "Cannot finalize transaction" ) ;
994
+ assert!( finalized, "wallet cannot finalize transaction" ) ;
950
995
let tx = psbt. extract_tx( ) ;
951
- println!( "{}" , bitcoin:: consensus:: encode:: serialize_hex( & tx) ) ;
952
- wallet. broadcast( tx) . unwrap( ) ;
996
+ wallet. broadcast( & tx) . unwrap( ) ;
953
997
wallet. sync( noop_progress( ) , None ) . unwrap( ) ;
954
- assert_eq!( wallet. get_balance( ) . unwrap( ) , details. received, "incorrect balance after send" ) ;
998
+ assert_eq!( wallet. get_balance( ) . unwrap( ) , details. received, "wallet has incorrect balance after send" ) ;
999
+ assert_eq!( wallet. list_transactions( false ) . unwrap( ) . len( ) , 2 , "wallet has incorrect number of txs" ) ;
1000
+ assert_eq!( wallet. list_unspent( ) . unwrap( ) . len( ) , 1 , "wallet has incorrect number of unspents" ) ;
1001
+ test_client. generate( 1 , None ) ;
955
1002
956
- assert_eq!( wallet. list_transactions( false ) . unwrap( ) . len( ) , 2 , "incorrect number of txs" ) ;
957
- assert_eq!( wallet. list_unspent( ) . unwrap( ) . len( ) , 1 , "incorrect number of unspents" ) ;
1003
+ // 5. Verify 25_000 sats are received by test bitcoind node taproot wallet
1004
+
1005
+ let taproot_balance = taproot_wallet_client. get_balance( None , None ) . unwrap( ) ;
1006
+ assert_eq!( taproot_balance. as_sat( ) , 25_000 , "node has incorrect taproot wallet balance" ) ;
958
1007
}
959
1008
}
960
1009
} ;
0 commit comments