diff --git a/src/bdk.udl b/src/bdk.udl index 39bdf12..e9d1d24 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -149,6 +149,27 @@ callback interface Progress { void update(f32 progress, string? message); }; +dictionary OutPoint { + string txid; + u32 vout; +}; + +dictionary TxOut { + u64 value; + string address; +}; + +enum KeychainKind { + "External", + "Internal", +}; + +dictionary LocalUtxo { + OutPoint outpoint; + TxOut txout; + KeychainKind keychain; +}; + interface Wallet { [Throws=BdkError] constructor(string descriptor, string? change_descriptor, Network network, DatabaseConfig database_config); @@ -169,6 +190,9 @@ interface Wallet { [Throws=BdkError] void sync([ByRef] Blockchain blockchain, Progress? progress); + + [Throws=BdkError] + sequence list_unspent(); }; interface PartiallySignedBitcoinTransaction { diff --git a/src/lib.rs b/src/lib.rs index 0e49d29..54b749d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -172,6 +172,57 @@ struct Wallet { wallet_mutex: Mutex>, } +pub struct OutPoint { + txid: String, + vout: u32, +} + +pub struct TxOut { + value: u64, + address: String, +} + +pub enum KeychainKind { + External = 0, + Internal = 1, +} + +impl From for KeychainKind { + fn from(x: bdk::KeychainKind) -> KeychainKind { + match x { + bdk::KeychainKind::External => KeychainKind::External, + bdk::KeychainKind::Internal => KeychainKind::Internal, + } + } +} + +pub struct LocalUtxo { + outpoint: OutPoint, + txout: TxOut, + keychain: KeychainKind, +} + +trait NetworkLocalUtxo: { + fn from_utxo(x: &bdk::LocalUtxo, network: Network) -> LocalUtxo; +} + +impl NetworkLocalUtxo for LocalUtxo { + fn from_utxo(x: &bdk::LocalUtxo, network: Network) -> LocalUtxo { + LocalUtxo { + outpoint: OutPoint { + txid: x.outpoint.txid.to_string(), + vout: x.outpoint.vout, + }, + txout: TxOut { + value: x.txout.value, + address: bdk::bitcoin::util::address::Address::from_script( + &x.txout.script_pubkey, network).unwrap().to_string(), + }, + keychain: KeychainKind::from(x.keychain), + } + } +} + pub trait Progress: Send + Sync + 'static { fn update(&self, progress: f32, message: Option); } @@ -283,6 +334,11 @@ impl Wallet { let transactions = self.get_wallet().list_transactions(true)?; Ok(transactions.iter().map(Transaction::from).collect()) } + + fn list_unspent(&self) -> Result, Error> { + let unspents = self.get_wallet().list_unspent()?; + Ok(unspents.iter().map(|u| LocalUtxo::from_utxo(u, self.get_network())).collect()) + } } pub struct ExtendedKeyInfo {