From ce34ec5c20f65ce923e9401f6e0a17efd4771956 Mon Sep 17 00:00:00 2001 From: aaravm Date: Fri, 5 Jul 2024 01:46:11 +0530 Subject: [PATCH] adding the initial version of taproot contract(not working rn --- .../taproot_contract/generate_descriptor.rs | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 taptrade-cli-demo/coordinator/src/taproot_contract/generate_descriptor.rs diff --git a/taptrade-cli-demo/coordinator/src/taproot_contract/generate_descriptor.rs b/taptrade-cli-demo/coordinator/src/taproot_contract/generate_descriptor.rs new file mode 100644 index 0000000..d630ae1 --- /dev/null +++ b/taptrade-cli-demo/coordinator/src/taproot_contract/generate_descriptor.rs @@ -0,0 +1,105 @@ +use bitcoin::util::address::Address; +use bitcoin::util::psbt::{PartiallySignedTransaction, PSBTInput, PSBTOutput}; +use bitcoin::network::constants::Network; +use bitcoin::blockdata::transaction::{Transaction, TxIn, TxOut}; +use bitcoin::blockdata::script::Builder; +use bitcoin::consensus::encode; +use miniscript::{Miniscript, Descriptor, DescriptorPublicKey, policy::Concrete}; +use miniscript::bitcoin::secp256k1::{Secp256k1, SecretKey, PublicKey, Message, Signature}; +use miniscript::bitcoin::util::bip32::{ExtendedPrivKey, ExtendedPubKey}; +use std::str::FromStr; + +async fn generate_taproot_PSBT() { + // Define the Miniscript policies + let policy_a = format!("and_v(v:pk({}),and_v(v:pk({}),after(144)))", coordinator_pub_key, maker_pub_key); + let policy_b = format!("and_v(v:pk({}),and_v(v:pk({}),pk({})))", maker_pub_key, taker_pub_key, coordinator_pub_key); + let policy_c = format!("and_v(v:pk({}),pk({}))", maker_pub_key, coordinator_pub_key); + let policy_d = format!("and_v(v:pk({}),pk({}))", taker_pub_key, coordinator_pub_key); + let policy_e = format!("and_v(v:pk({}),after(12228))", maker_pub_key); + let policy_f = format!("and_v(and_v(v:pk({}),v:pk({})),after(2048))", maker_pub_key, taker_pub_key); + + // Compile the policies into Miniscript + let miniscript_a: Miniscript = policy_a.parse().unwrap().compile().unwrap(); + let miniscript_b: Miniscript = policy_b.parse().unwrap().compile().unwrap(); + let miniscript_c: Miniscript = policy_c.parse().unwrap().compile().unwrap(); + let miniscript_d: Miniscript = policy_d.parse().unwrap().compile().unwrap(); + let miniscript_e: Miniscript = policy_e.parse().unwrap().compile().unwrap(); + let miniscript_f: Miniscript = policy_f.parse().unwrap().compile().unwrap(); + + // Create the Taproot descriptors + let descriptor_a = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_a]); + let descriptor_b = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_b]); + let descriptor_c = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_c]); + let descriptor_d = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_d]); + let descriptor_e = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_e]); + let descriptor_f = Descriptor::Tr(coordinator_pub_key.clone(), vec![miniscript_f]); + + // Generate the Taproot addresses + let address_a = Address::p2tr(&descriptor_a, Network::Bitcoin); + let address_b = Address::p2tr(&descriptor_b, Network::Bitcoin); + let address_c = Address::p2tr(&descriptor_c, Network::Bitcoin); + let address_d = Address::p2tr(&descriptor_d, Network::Bitcoin); + let address_e = Address::p2tr(&descriptor_e, Network::Bitcoin); + let address_f = Address::p2tr(&descriptor_f, Network::Bitcoin); + + println!("Taproot Address A: {}", address_a); + println!("Taproot Address B: {}", address_b); + println!("Taproot Address C: {}", address_c); + println!("Taproot Address D: {}", address_d); + println!("Taproot Address E: {}", address_e); + println!("Taproot Address F: {}", address_f); + + // Create a sample PSBT (Partially Signed Bitcoin Transaction) + let mut psbt = PartiallySignedTransaction { + global: Default::default(), + inputs: vec![], + outputs: vec![], + }; + + // Add an example input (Replace with actual input) + psbt.inputs.push(PSBTInput { + non_witness_utxo: None, + witness_utxo: Some(TxOut { + value: 1000, + script_pubkey: address_a.script_pubkey(), + }), + ..Default::default() + }); + + // Add the output addresses + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_a.script_pubkey(), + ..Default::default() + }); + + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_b.script_pubkey(), + ..Default::default() + }); + + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_c.script_pubkey(), + ..Default::default() + }); + + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_d.script_pubkey(), + ..Default::default() + }); + + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_e.script_pubkey(), + ..Default::default() + }); + + psbt.outputs.push(PSBTOutput { + value: 1000, + script_pubkey: address_f.script_pubkey(), + ..Default::default() + }); +} \ No newline at end of file