mirror of
https://github.com/RoboSats/taptrade-core.git
synced 2025-07-25 04:03:15 +00:00
adding the initial version of taproot contract(not working rn
This commit is contained in:
@ -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<DescriptorPublicKey> = policy_a.parse().unwrap().compile().unwrap();
|
||||||
|
let miniscript_b: Miniscript<DescriptorPublicKey> = policy_b.parse().unwrap().compile().unwrap();
|
||||||
|
let miniscript_c: Miniscript<DescriptorPublicKey> = policy_c.parse().unwrap().compile().unwrap();
|
||||||
|
let miniscript_d: Miniscript<DescriptorPublicKey> = policy_d.parse().unwrap().compile().unwrap();
|
||||||
|
let miniscript_e: Miniscript<DescriptorPublicKey> = policy_e.parse().unwrap().compile().unwrap();
|
||||||
|
let miniscript_f: Miniscript<DescriptorPublicKey> = 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()
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user