// Bitcoin Dev Kit // Written in 2020 by Alekos Filini // // Copyright (c) 2020-2021 Bitcoin Dev Kit Developers // // This file is licensed under the Apache License, Version 2.0 or the MIT license // , at your option. // You may not use this file except in accordance with one or both of these // licenses. extern crate bdk; extern crate env_logger; extern crate log; use std::error::Error; use bdk::bitcoin::Network; use bdk::descriptor::{policy::BuildSatisfaction, ExtractPolicy, IntoWalletDescriptor}; use bdk::wallet::signer::SignersContainer; /// This example describes the use of the BDK's [`bdk::descriptor::policy`] module. /// /// Policy is higher abstraction representation of the wallet descriptor spending condition. /// This is useful to express complex miniscript spending conditions into more human readable form. /// The resulting `Policy` structure can be used to derive spending conditions the wallet is capable /// to spend from. /// /// This example demos a Policy output for a 2of2 multisig between between 2 parties, where the wallet holds /// one of the Extend Private key. fn main() -> Result<(), Box> { env_logger::init_from_env( env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"), ); let secp = bitcoin::secp256k1::Secp256k1::new(); // The descriptor used in the example // The form is "wsh(multi(2, , ))" let desc = "wsh(multi(2,tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/*,tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/1/*))"; // Use the descriptor string to derive the full descriptor and a keymap. // The wallet descriptor can be used to create a new bdk::wallet. // While the `keymap` can be used to create a `SignerContainer`. // // The `SignerContainer` can sign for `PSBT`s. // a bdk::wallet internally uses these to handle transaction signing. // But they can be used as independent tools also. let (wallet_desc, keymap) = desc.into_wallet_descriptor(&secp, Network::Testnet)?; log::info!("Example Descriptor for policy analysis : {}", wallet_desc); // Create the signer with the keymap and descriptor. let signers_container = SignersContainer::build(keymap, &wallet_desc, &secp); // Extract the Policy from the given descriptor and signer. // Note that Policy is a wallet specific structure. It depends on the the descriptor, and // what the concerned wallet with a given signer can sign for. let policy = wallet_desc .extract_policy(&signers_container, BuildSatisfaction::None, &secp)? .expect("We expect a policy"); log::info!("Derived Policy for the descriptor {:#?}", policy); Ok(()) }