Skip to content

Commit a1807af

Browse files
notmandatoryafilini
authored andcommitted
Add blockchain tests for parsing, signing, finalizing taproot core psbts
1 parent fa2873c commit a1807af

File tree

1 file changed

+85
-1
lines changed

1 file changed

+85
-1
lines changed

src/testutils/blockchain_tests.rs

+85-1
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ macro_rules! bdk_blockchain_tests {
391391
WpkhSingleSig,
392392
TaprootKeySpend,
393393
TaprootScriptSpend,
394+
TaprootScriptSpend2,
395+
TaprootScriptSpend3,
394396
}
395397

396398
fn init_wallet(ty: WalletType) -> (Wallet<MemoryDatabase>, $blockchain, (String, Option<String>), TestClient) {
@@ -405,7 +407,13 @@ macro_rules! bdk_blockchain_tests {
405407
},
406408
WalletType::TaprootScriptSpend => testutils! {
407409
@descriptors ( "tr(Key,and_v(v:pk(Script),older(6)))" ) ( "tr(Key,and_v(v:pk(Script),older(6)))" ) ( @keys ( "Key" => (@literal "30e14486f993d5a2d222770e97286c56cec5af115e1fb2e0065f476a0fcf8788"), "Script" => (@generate_xprv "/0/*", "/1/*") ) )
408-
}
410+
},
411+
WalletType::TaprootScriptSpend2 => testutils! {
412+
@descriptors ( "tr(Alice,pk(Bob))" ) ( "tr(Alice,pk(Bob))" ) ( @keys ( "Alice" => (@literal "30e14486f993d5a2d222770e97286c56cec5af115e1fb2e0065f476a0fcf8788"), "Bob" => (@generate_xprv "/0/*", "/1/*") ) )
413+
},
414+
WalletType::TaprootScriptSpend3 => testutils! {
415+
@descriptors ( "tr(Alice,{pk(Bob),pk(Carol)})" ) ( "tr(Alice,{pk(Bob),pk(Carol)})" ) ( @keys ( "Alice" => (@literal "30e14486f993d5a2d222770e97286c56cec5af115e1fb2e0065f476a0fcf8788"), "Bob" => (@generate_xprv "/0/*", "/1/*"), "Carol" => (@generate_xprv "/0/*", "/1/*") ) )
416+
},
409417
};
410418

411419
let test_client = TestClient::default();
@@ -1269,6 +1277,82 @@ macro_rules! bdk_blockchain_tests {
12691277
};
12701278
blockchain.broadcast(&tx).unwrap();
12711279
}
1280+
1281+
#[test]
1282+
fn test_sign_taproot_core_keyspend_psbt() {
1283+
test_sign_taproot_core_psbt(WalletType::TaprootKeySpend);
1284+
}
1285+
1286+
#[test]
1287+
fn test_sign_taproot_core_scriptspend2_psbt() {
1288+
test_sign_taproot_core_psbt(WalletType::TaprootScriptSpend2);
1289+
}
1290+
1291+
#[test]
1292+
fn test_sign_taproot_core_scriptspend3_psbt() {
1293+
test_sign_taproot_core_psbt(WalletType::TaprootScriptSpend3);
1294+
}
1295+
1296+
fn test_sign_taproot_core_psbt(wallet_type: WalletType) {
1297+
use std::str::FromStr;
1298+
use serde_json;
1299+
use bitcoincore_rpc::jsonrpc::serde_json::Value;
1300+
use bitcoincore_rpc::{Auth, Client, RpcApi};
1301+
1302+
let (wallet, _blockchain, _descriptors, test_client) = init_wallet(wallet_type);
1303+
1304+
// TODO replace once rust-bitcoincore-rpc with PR 174 released
1305+
// https://github.com/rust-bitcoin/rust-bitcoincore-rpc/pull/174
1306+
let _createwallet_result: Value = test_client.bitcoind.client.call("createwallet", &["taproot_wallet".into(), true.into(), true.into(), serde_json::to_value("").unwrap(), false.into(), true.into(), true.into(), false.into()]).expect("created wallet");
1307+
1308+
let external_descriptor = wallet.get_descriptor_for_keychain(KeychainKind::External);
1309+
1310+
// TODO replace once bitcoind released with support for rust-bitcoincore-rpc PR 174
1311+
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();
1312+
1313+
let descriptor_info = taproot_wallet_client.get_descriptor_info(external_descriptor.to_string().as_str()).expect("descriptor info");
1314+
1315+
let import_descriptor_args = json!([{
1316+
"desc": descriptor_info.descriptor,
1317+
"active": true,
1318+
"timestamp": "now",
1319+
"label":"taproot key spend",
1320+
}]);
1321+
let _importdescriptors_result: Value = taproot_wallet_client.call("importdescriptors", &[import_descriptor_args]).expect("import wallet");
1322+
let generate_to_address: bitcoin::Address = taproot_wallet_client.call("getnewaddress", &["test address".into(), "bech32m".into()]).expect("new address");
1323+
let _generatetoaddress_result = taproot_wallet_client.generate_to_address(101, &generate_to_address).expect("generated to address");
1324+
let send_to_address = wallet.get_address($crate::wallet::AddressIndex::New).unwrap().address.to_string();
1325+
let change_address = wallet.get_address($crate::wallet::AddressIndex::New).unwrap().address.to_string();
1326+
let send_addr_amounts = json!([{
1327+
send_to_address: "0.4321"
1328+
}]);
1329+
let send_options = json!({
1330+
"change_address": change_address,
1331+
"psbt": true,
1332+
});
1333+
let send_result: Value = taproot_wallet_client.call("send", &[send_addr_amounts, Value::Null, "unset".into(), Value::Null, send_options]).expect("send psbt");
1334+
let core_psbt = send_result["psbt"].as_str().expect("core psbt str");
1335+
1336+
use bitcoin::util::psbt::PartiallySignedTransaction;
1337+
1338+
// Test parsing core created PSBT
1339+
let mut psbt = PartiallySignedTransaction::from_str(&core_psbt).expect("core taproot psbt");
1340+
1341+
// Test signing core created PSBT
1342+
let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
1343+
assert_eq!(finalized, true);
1344+
1345+
// Test with updated psbt
1346+
let update_result: Value = taproot_wallet_client.call("utxoupdatepsbt", &[core_psbt.into()]).expect("update psbt utxos");
1347+
let core_updated_psbt = update_result.as_str().expect("core updated psbt");
1348+
1349+
// Test parsing core created and updated PSBT
1350+
let mut psbt = PartiallySignedTransaction::from_str(&core_updated_psbt).expect("core taproot psbt");
1351+
1352+
// Test signing core created and updated PSBT
1353+
let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
1354+
assert_eq!(finalized, true);
1355+
}
12721356
}
12731357
};
12741358

0 commit comments

Comments
 (0)