diff --git a/src/lib.rs b/src/lib.rs index 6ebf5e7..537fc6c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,10 @@ use ::safer_ffi::prelude::*; +use bdk::bitcoin::network::constants::Network::Testnet; +use bdk::blockchain::{ElectrumBlockchain, log_progress}; +use bdk::electrum_client::Client; +use bdk::sled; +use bdk::sled::Tree; +use bdk::Wallet; /// A `struct` usable from both Rust and C #[derive_ReprC] @@ -37,6 +43,58 @@ fn free_point(point: Option>) { drop(point) } +#[derive_ReprC] +#[ReprC::opaque] +pub struct WalletPtr { + raw: Wallet, +} + +impl From> for WalletPtr { + fn from(wallet: Wallet) -> Self { + WalletPtr { + raw: wallet, + } + } +} + +#[ffi_export] +fn new_wallet( + name: char_p::Ref<'_>, + descriptor: char_p::Ref<'_>, + change_descriptor: Option>, +) -> repr_c::Box { + let name = name.to_string(); + let descriptor = descriptor.to_string(); + let change_descriptor = change_descriptor.map(|s| s.to_string()); + + let database = sled::open("./wallet_db").unwrap(); + let tree = database.open_tree(name.clone()).unwrap(); + + let descriptor: &str = descriptor.as_str(); + let change_descriptor: Option<&str> = change_descriptor.as_deref(); + + let electrum_url = "ssl://electrum.blockstream.info:60002"; + let client = Client::new(&electrum_url).unwrap(); + + let wallet = Wallet::new( + descriptor, + change_descriptor, + Testnet, + tree, + ElectrumBlockchain::from(client), + ) + .unwrap(); + + repr_c::Box::new(WalletPtr::from(wallet)) +} + +#[ffi_export] +fn sync_wallet( wallet: repr_c::Box) { + println!("before sync"); + wallet.raw.sync(log_progress(), Some(100)); + println!("after sync"); +} + /// The following test function is necessary for the header generation. #[::safer_ffi::cfg_headers] #[test]