rustywallet_multisig/
lib.rs

1//! # rustywallet-multisig
2//!
3//! Bitcoin multi-signature wallet utilities with Shamir Secret Sharing and MuSig2 support.
4//!
5//! ## Features
6//!
7//! - Create M-of-N multisig wallets (up to 15-of-15)
8//! - Generate P2SH, P2WSH, and P2SH-P2WSH addresses
9//! - Sign and combine multisig transactions
10//! - PSBT integration for hardware wallet interoperability
11//! - MuSig2 key aggregation for Schnorr multisig
12//! - Shamir Secret Sharing for key backup
13//!
14//! ## Quick Start
15//!
16//! ```rust
17//! use rustywallet_multisig::prelude::*;
18//! use rustywallet_keys::prelude::PrivateKey;
19//!
20//! // Generate 3 keys
21//! let key1 = PrivateKey::random();
22//! let key2 = PrivateKey::random();
23//! let key3 = PrivateKey::random();
24//!
25//! let pubkeys = vec![
26//!     key1.public_key().to_compressed(),
27//!     key2.public_key().to_compressed(),
28//!     key3.public_key().to_compressed(),
29//! ];
30//!
31//! // Create 2-of-3 multisig wallet
32//! let wallet = MultisigWallet::from_pubkeys(2, pubkeys, Network::Mainnet).unwrap();
33//!
34//! println!("P2SH address: {}", wallet.address_p2sh);
35//! println!("P2WSH address: {}", wallet.address_p2wsh);
36//! println!("P2SH-P2WSH address: {}", wallet.address_p2sh_p2wsh);
37//! ```
38//!
39//! ## PSBT Integration
40//!
41//! ```rust
42//! use rustywallet_multisig::{MultisigWallet, MultisigPsbtBuilder, Network};
43//! use rustywallet_keys::prelude::PrivateKey;
44//!
45//! let key1 = PrivateKey::random();
46//! let key2 = PrivateKey::random();
47//! let pubkeys = vec![
48//!     key1.public_key().to_compressed(),
49//!     key2.public_key().to_compressed(),
50//! ];
51//!
52//! let wallet = MultisigWallet::from_pubkeys(2, pubkeys, Network::Mainnet).unwrap();
53//! let mut builder = MultisigPsbtBuilder::new(wallet, 1);
54//!
55//! // Each party signs
56//! let sighash = [0u8; 32]; // Compute actual sighash
57//! builder.sign_input(0, &sighash, &key1).unwrap();
58//! builder.sign_input(0, &sighash, &key2).unwrap();
59//!
60//! // Build final witness
61//! let witness = builder.build_witness(0).unwrap();
62//! ```
63//!
64//! ## MuSig2 Key Aggregation
65//!
66//! ```rust
67//! use rustywallet_multisig::{MuSigKeyAgg, musig_to_p2tr_address, Network};
68//! use rustywallet_keys::prelude::PrivateKey;
69//!
70//! let key1 = PrivateKey::random();
71//! let key2 = PrivateKey::random();
72//! let pubkeys = vec![
73//!     key1.public_key().to_compressed(),
74//!     key2.public_key().to_compressed(),
75//! ];
76//!
77//! // Aggregate keys for n-of-n Schnorr multisig
78//! let key_agg = MuSigKeyAgg::new(pubkeys).unwrap();
79//!
80//! // Get P2TR address
81//! let address = musig_to_p2tr_address(&key_agg, Network::Mainnet).unwrap();
82//! println!("MuSig P2TR address: {}", address);
83//! ```
84//!
85//! ## Shamir Secret Sharing
86//!
87//! ```rust
88//! use rustywallet_multisig::{split_secret, combine_shares};
89//!
90//! // Split a 32-byte secret into 5 shares, requiring 3 to recover
91//! let secret = [0x42u8; 32];
92//! let shares = split_secret(&secret, 3, 5).unwrap();
93//!
94//! // Recover with any 3 shares
95//! let recovered = combine_shares(&shares[0..3]).unwrap();
96//! assert_eq!(recovered, secret);
97//! ```
98
99pub mod error;
100pub mod config;
101pub mod script;
102pub mod address;
103pub mod signer;
104pub mod combiner;
105pub mod shamir;
106pub mod psbt;
107pub mod musig;
108
109pub use error::{MultisigError, Result};
110pub use config::MultisigConfig;
111pub use address::{MultisigWallet, Network, hash160, sha256};
112pub use script::{build_multisig_script, parse_multisig_script};
113pub use signer::{sign_p2sh_multisig, sign_p2wsh_multisig, PartialSignature};
114pub use combiner::{combine_signatures, CombinedSignatures};
115pub use shamir::{split_secret, combine_shares, ShamirShare};
116pub use psbt::{MultisigPsbtBuilder, PsbtPartialSig};
117pub use musig::{MuSigKeyAgg, musig_to_p2tr_address};
118
119/// Prelude module for convenient imports.
120pub mod prelude {
121    pub use crate::{
122        MultisigConfig, MultisigWallet, Network,
123        MultisigError, Result,
124        sign_p2sh_multisig, sign_p2wsh_multisig,
125        combine_signatures, CombinedSignatures,
126        split_secret, combine_shares, ShamirShare,
127        MultisigPsbtBuilder, PsbtPartialSig,
128        MuSigKeyAgg, musig_to_p2tr_address,
129    };
130}