Skip to content

Commit

Permalink
implemented the FromStr and Display (implies ToString) traits for Ele…
Browse files Browse the repository at this point in the history
…ctrumWalletFile
  • Loading branch information
ulrichard committed Nov 21, 2024
1 parent 39d8ce0 commit 91beb3a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
17 changes: 17 additions & 0 deletions src/electrum_wallet_file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,23 @@ impl ElectrumWalletFile {
}
}

impl FromStr for ElectrumWalletFile {
type Err = Electrum2DescriptorError;

/// Parse an electrum wallet file from string
fn from_str(wallet_file: &str) -> Result<Self, Electrum2DescriptorError> {
Ok(serde_json::from_str(wallet_file)?)
}
}

impl std::fmt::Display for ElectrumWalletFile {
/// Write to a string as electrum wallet file format
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let json = serde_json::to_string_pretty(self).map_err(|_| std::fmt::Error {})?;
write!(f, "{}", json)
}
}

impl Serialize for ElectrumWalletFile {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
Expand Down
32 changes: 31 additions & 1 deletion tests/wallets2descriptors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
use bdk::{bitcoin::Network, database::MemoryDatabase, wallet::AddressIndex, Wallet};
use libelectrum2descriptors::{Descriptors, ElectrumWalletFile};
use rstest::rstest;
use std::path::{Path, PathBuf};
use std::{
path::{Path, PathBuf},
str::FromStr,
};
use tempfile::tempdir;

#[rstest]
Expand Down Expand Up @@ -108,3 +111,30 @@ fn descriptor_electrum_wallet_roundtrip(#[case] wallet_name: &str, #[case] descr
let desc = wallet.to_descriptors().unwrap();
assert_eq!(desc.external, descriptor);
}

#[rstest]
#[case::default_legacy(
"pkh(tprv8ZgxMBicQKsPeYnCHtn5QZqhTgkkDmXebfQMXWmX7ThXJFCbzDTKFNRsB43GUmHzu2pdGcnnegFy175kFcgZQYC5BFPnRdYDPQyqetpyjb5/0/*)")]
#[case::default_legacy_watch(
"pkh(tpubD6NzVbkrYhZ4Y1ozBYSfoyVp2iGgP6iZAy18p2opXjVv8jTNccGuRs3jMCMe4ncfwy2RUJsoZLSXsGiFhN47xFbJgtRvCuV3RP3UnxpsrZt/0/*)")]
#[case::default_segwit(
"wpkh(tprv8cvkZzx9zA7EfFDbH945mK23r7hg6EHXUk79wVUSRukwyctFS1AdpSpkZcykAMDveCj8RA3R4jwFTKMwMbWexJox8NMqq7YphJLDumfCSfu/0/*)")]
#[case::multisig_hw_segwit(
"wsh(sortedmulti(2,tpubDEcw4ooTbmw62zBKdkYepoP3z4WWugdeRzPHHAbk8XVsPfBE9AAZMNghiqwtdFgtabaeppBTPmezUkRkQZidLcSJp3XTASbMakHcYauWehZ/0/*,tpubDEbkvhmJoZMq3SUNqEf3aEsubvqsCUPc7rroHkGERgS7qA1gQVMxUPrgzth6x43odirLohwf4aMHpvcnWi3jCB2xkizv8T4B2KqLRZVLC6K/0/*))")]
#[case::multisig_legacy(
"sh(sortedmulti(2,tprv8ZgxMBicQKsPeLPWr5WbJDAhANr6irc1Yf7eUNCYjGYap27HU4bDBXWGMT3X75FhDyxNXr6pK4QeHcCBvkqchQzK8wZ4JbGv5X5MWtXQtqy/0/*,tpubD6NzVbkrYhZ4Y1ozBYSfoyVp2iGgP6iZAy18p2opXjVv8jTNccGuRs3jMCMe4ncfwy2RUJsoZLSXsGiFhN47xFbJgtRvCuV3RP3UnxpsrZt/0/*))")]
#[case::multisig_segwit(
"wsh(sortedmulti(2,tprv8dNybiDsdyms39SAWTxyiNHABTTgiqmJpScmxGrdKEuZ7TwXcaYXT4f4ddVjWiiQs9zowHqyDmvaebN6fU2Lu6iAYnYuepiLkvzGdcZZi8D/0/*,tpubD9cniQzQ8XnuagyP9Xwg3sWCX77wQPWoLPW7jqzcPn37r8hq2X86uztCEyFbMY16amzwdJ1CcNRXhF3vykn1wuDv2ULzryRtaCcN5Cr8F9y/0/*))")]
#[case::multisig_wrapped_watch(
"sh(wsh(sortedmulti(3,tpubDEsqS36T4DVsKJd9UH8pAKzrkGBYPLEt9jZMwpKtzh1G6mgYehfHt9WCgk7MJG5QGSFWf176KaBNoXbcuFcuadAFKxDpUdMDKGBha7bY3QM/0/*,tpubDF3cpwfs7fMvXXuoQbohXtLjNM6ehwYT287LWtmLsd4r77YLg6MZg4vTETx5MSJ2zkfigbYWu31VA2Z2Vc1cZugCYXgS7FQu6pE8V6TriEH/0/*,tpubDE1SKfcW76Tb2AASv5bQWMuScYNAdoqLHoexw13sNDXwmUhQDBbCD3QAedKGLhxMrWQdMDKENzYtnXPDRvexQPNuDrLj52wAjHhNEm8sJ4p/0/*,tpubDFLc6oXwJmhm3FGGzXkfJNTh2KitoY3WhmmQvuAjMhD8YbyWn5mAqckbxXfm2etM3p5J6JoTpSrMqRSTfMLtNW46poDaEZJ1kjd3csRSjwH/0/*,tpubDEWD9NBeWP59xXmdqSNt4VYdtTGwbpyP8WS962BuqpQeMZmX9Pur14dhXdZT5a7wR1pK6dPtZ9fP5WR493hPzemnBvkfLLYxnUjAKj1JCQV/0/*,tpubDEHyZkkwd7gZWCTgQuYQ9C4myF2hMEmyHsBCCmLssGqoqUxeT3gzohF5uEVURkf9TtmeepJgkSUmteac38FwZqirjApzNX59XSHLcwaTZCH/0/*,tpubDEqLouCekwnMUWN486kxGzD44qVgeyuqHyxUypNEiQt5RnUZNJe386TKPK99fqRV1vRkZjYAjtXGTECz98MCsdLcnkM67U6KdYRzVubeCgZ/0/*)))")]
fn descriptor_string_roundtrip(#[case] descriptor: &str) {
let wallet = ElectrumWalletFile::from_descriptor(descriptor).unwrap();

let electrum_string = wallet.to_string();

let imported = ElectrumWalletFile::from_str(&electrum_string).unwrap();
assert_eq!(wallet, imported);

let desc = wallet.to_descriptors().unwrap();
assert_eq!(desc.external, descriptor);
}

0 comments on commit 91beb3a

Please sign in to comment.