diff --git a/bdk-ffi/src/bdk.udl b/bdk-ffi/src/bdk.udl index 836cd65..1ddbc4e 100644 --- a/bdk-ffi/src/bdk.udl +++ b/bdk-ffi/src/bdk.udl @@ -94,7 +94,7 @@ interface TxBuilder { TxBuilder fee_rate(float sat_per_vbyte); [Throws=BdkError] - string finish([ByRef] Wallet wallet); + PartiallySignedTransaction finish([ByRef] Wallet wallet); }; // ------------------------------------------------------------------------ @@ -225,7 +225,37 @@ interface Address { Network network(); + Script script_pubkey(); + string to_qr_uri(); string as_string(); }; + +interface Transaction { + [Throws=BdkError] + constructor(sequence transaction_bytes); + + string txid(); + + u64 size(); + + u64 vsize(); + + boolean is_coin_base(); + + boolean is_explicitly_rbf(); + + boolean is_lock_time_enabled(); + + i32 version(); +}; + +interface PartiallySignedTransaction { + [Throws=BdkError] + constructor(string psbt_base64); + + string serialize(); + + Transaction extract_tx(); +}; diff --git a/bdk-ffi/src/bitcoin.rs b/bdk-ffi/src/bitcoin.rs index 587e6e7..2730e20 100644 --- a/bdk-ffi/src/bitcoin.rs +++ b/bdk-ffi/src/bitcoin.rs @@ -1,4 +1,15 @@ +use bdk::bitcoin::address::{NetworkChecked, NetworkUnchecked}; use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf; +use bdk::bitcoin::consensus::Decodable; +use bdk::bitcoin::network::constants::Network as BdkNetwork; +use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction; +use bdk::bitcoin::Address as BdkAddress; +use bdk::bitcoin::Transaction as BdkTransaction; +use bdk::Error as BdkError; + +use std::io::Cursor; +use std::str::FromStr; +use std::sync::{Arc, Mutex}; /// A Bitcoin script. #[derive(Clone, Debug, PartialEq, Eq)] @@ -20,3 +31,251 @@ impl From for Script { Script(script) } } + +pub enum Network { + /// Mainnet Bitcoin. + Bitcoin, + /// Bitcoin's testnet network. + Testnet, + /// Bitcoin's signet network. + Signet, + /// Bitcoin's regtest network. + Regtest, +} + +impl From for BdkNetwork { + fn from(network: Network) -> Self { + match network { + Network::Bitcoin => BdkNetwork::Bitcoin, + Network::Testnet => BdkNetwork::Testnet, + Network::Signet => BdkNetwork::Signet, + Network::Regtest => BdkNetwork::Regtest, + } + } +} + +impl From for Network { + fn from(network: BdkNetwork) -> Self { + match network { + BdkNetwork::Bitcoin => Network::Bitcoin, + BdkNetwork::Testnet => Network::Testnet, + BdkNetwork::Signet => Network::Signet, + BdkNetwork::Regtest => Network::Regtest, + _ => panic!("Network {} not supported", network), + } + } +} + +/// A Bitcoin address. +#[derive(Debug, PartialEq, Eq)] +pub struct Address { + inner: BdkAddress, +} + +impl Address { + pub fn new(address: String, network: Network) -> Result { + Ok(Address { + inner: address + .parse::>() + .unwrap() // TODO 11: Handle error correctly by rethrowing it as a BdkError + .require_network(network.into()) + .map_err(|e| BdkError::Generic(e.to_string()))?, + }) + } + + /// alternative constructor + // fn from_script(script: Arc