Merge bitcoindevkit/bdk#682: Add a custom signer for hardware wallets
138acc3b7dChange `populate_test_db` to not return empty input (wszdexdrf)d6e1dd1040Change CI to add test using ledger emulator (wszdexdrf)76034772cbAdd a custom signer for hardware wallets (wszdexdrf) Pull request description: Also adds a new test in CI for building and testing on a virtual hardware wallet. ### Description This PR would enable BDK users to sign transactions using a hardware wallet. It is just the beginning hence there are no complex features, but I hope not for long. I have added a test in CI for building a ledger emulator and running the new test on it. The test is similar to the one on bitcoindevkit/rust-hwi. ### Notes to the reviewers The PR is incomplete (and wouldn't work, as the rust-hwi in `cargo.toml` is pointing to a local crate, temporarily) as a small change is required in rust-hwi (https://github.com/bitcoindevkit/rust-hwi/pull/42). ### Checklists #### All Submissions: * [x] I've signed all my commits * [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md) * [x] I ran `cargo fmt` and `cargo clippy` before committing #### New Features: * [x] I've added tests for the new feature * [x] I've added docs for the new feature * [x] I've updated `CHANGELOG.md` ACKs for top commit: afilini: ACK138acc3b7dTree-SHA512: 54337f06247829242b4dc60f733346173d957de8e9f8b80beb91304d679cfb4e0e4db722c967469265a5b6ede2bd641ba5c089760391c671995dc30de37897de
This commit is contained in:
@@ -48,6 +48,9 @@ pub(crate) mod utils;
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "verify")))]
|
||||
pub mod verify;
|
||||
|
||||
#[cfg(feature = "hardware-signer")]
|
||||
pub mod hardwaresigner;
|
||||
|
||||
pub use utils::IsDust;
|
||||
|
||||
#[allow(deprecated)]
|
||||
@@ -5466,4 +5469,33 @@ pub(crate) mod test {
|
||||
// ...and checking that everything is fine
|
||||
assert_fee_rate!(psbt, details.fee.unwrap_or(0), fee_rate);
|
||||
}
|
||||
|
||||
#[cfg(feature = "test-hardware-signer")]
|
||||
#[test]
|
||||
fn test_create_signer() {
|
||||
use crate::wallet::hardwaresigner::HWISigner;
|
||||
use hwi::types::HWIChain;
|
||||
use hwi::HWIClient;
|
||||
|
||||
let devices = HWIClient::enumerate().unwrap();
|
||||
let device = devices.first().expect("No devices found");
|
||||
let client = HWIClient::get_client(device, true, HWIChain::Regtest).unwrap();
|
||||
let descriptors = client.get_descriptors(None).unwrap();
|
||||
let custom_signer = HWISigner::from_device(device, HWIChain::Regtest).unwrap();
|
||||
|
||||
let (mut wallet, _, _) = get_funded_wallet(&descriptors.internal[0]);
|
||||
wallet.add_signer(
|
||||
KeychainKind::External,
|
||||
SignerOrdering(200),
|
||||
Arc::new(custom_signer),
|
||||
);
|
||||
|
||||
let addr = wallet.get_address(LastUnused).unwrap();
|
||||
let mut builder = wallet.build_tx();
|
||||
builder.drain_to(addr.script_pubkey()).drain_wallet();
|
||||
let (mut psbt, _) = builder.finish().unwrap();
|
||||
|
||||
let finalized = wallet.sign(&mut psbt, Default::default()).unwrap();
|
||||
assert!(finalized);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user