feat: add new types module
This commit is contained in:
parent
05ce7dad31
commit
6b177f0893
@ -1,7 +1,7 @@
|
|||||||
namespace bdk {};
|
namespace bdk {};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// bdk crate - root module
|
// bdk crate - types module
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
enum KeychainKind {
|
enum KeychainKind {
|
||||||
@ -9,6 +9,45 @@ enum KeychainKind {
|
|||||||
"Internal",
|
"Internal",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dictionary AddressInfo {
|
||||||
|
u32 index;
|
||||||
|
Address address;
|
||||||
|
KeychainKind keychain;
|
||||||
|
};
|
||||||
|
|
||||||
|
[Enum]
|
||||||
|
interface AddressIndex {
|
||||||
|
New();
|
||||||
|
LastUnused();
|
||||||
|
Peek(u32 index);
|
||||||
|
};
|
||||||
|
|
||||||
|
dictionary Balance {
|
||||||
|
u64 immature;
|
||||||
|
|
||||||
|
u64 trusted_pending;
|
||||||
|
|
||||||
|
u64 untrusted_pending;
|
||||||
|
|
||||||
|
u64 confirmed;
|
||||||
|
|
||||||
|
u64 trusted_spendable;
|
||||||
|
|
||||||
|
u64 total;
|
||||||
|
};
|
||||||
|
|
||||||
|
dictionary LocalUtxo {
|
||||||
|
OutPoint outpoint;
|
||||||
|
TxOut txout;
|
||||||
|
KeychainKind keychain;
|
||||||
|
boolean is_spent;
|
||||||
|
};
|
||||||
|
|
||||||
|
dictionary TxOut {
|
||||||
|
u64 value;
|
||||||
|
Script script_pubkey;
|
||||||
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// bdk crate - wallet module
|
// bdk crate - wallet module
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -49,33 +88,6 @@ enum ChangeSpendPolicy {
|
|||||||
"ChangeForbidden"
|
"ChangeForbidden"
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary Balance {
|
|
||||||
u64 immature;
|
|
||||||
|
|
||||||
u64 trusted_pending;
|
|
||||||
|
|
||||||
u64 untrusted_pending;
|
|
||||||
|
|
||||||
u64 confirmed;
|
|
||||||
|
|
||||||
u64 trusted_spendable;
|
|
||||||
|
|
||||||
u64 total;
|
|
||||||
};
|
|
||||||
|
|
||||||
dictionary AddressInfo {
|
|
||||||
u32 index;
|
|
||||||
Address address;
|
|
||||||
KeychainKind keychain;
|
|
||||||
};
|
|
||||||
|
|
||||||
[Enum]
|
|
||||||
interface AddressIndex {
|
|
||||||
New();
|
|
||||||
LastUnused();
|
|
||||||
Peek(u32 index);
|
|
||||||
};
|
|
||||||
|
|
||||||
interface Wallet {
|
interface Wallet {
|
||||||
[Name=new_no_persist, Throws=BdkError]
|
[Name=new_no_persist, Throws=BdkError]
|
||||||
constructor(Descriptor descriptor, Descriptor? change_descriptor, Network network);
|
constructor(Descriptor descriptor, Descriptor? change_descriptor, Network network);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use bdk::bitcoin::address::{NetworkChecked, NetworkUnchecked};
|
use bdk::bitcoin::address::{NetworkChecked, NetworkUnchecked};
|
||||||
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
||||||
|
use bdk::bitcoin::blockdata::transaction::TxOut as BdkTxOut;
|
||||||
use bdk::bitcoin::consensus::Decodable;
|
use bdk::bitcoin::consensus::Decodable;
|
||||||
use bdk::bitcoin::network::constants::Network as BdkNetwork;
|
use bdk::bitcoin::network::constants::Network as BdkNetwork;
|
||||||
use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction;
|
use bdk::bitcoin::psbt::PartiallySignedTransaction as BdkPartiallySignedTransaction;
|
||||||
@ -309,3 +310,21 @@ impl From<&OutPoint> for BdkOutPoint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A transaction output, which defines new coins to be created from old ones.
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct TxOut {
|
||||||
|
/// The value of the output, in satoshis.
|
||||||
|
pub value: u64,
|
||||||
|
/// The address of the output.
|
||||||
|
pub script_pubkey: Arc<Script>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&BdkTxOut> for TxOut {
|
||||||
|
fn from(tx_out: &BdkTxOut) -> Self {
|
||||||
|
TxOut {
|
||||||
|
value: tx_out.value,
|
||||||
|
script_pubkey: Arc::new(Script(tx_out.script_pubkey.clone())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -284,9 +284,12 @@ impl Descriptor {
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use assert_matches::assert_matches;
|
use assert_matches::assert_matches;
|
||||||
|
|
||||||
use bdk::descriptor::DescriptorError::Key;
|
use bdk::descriptor::DescriptorError::Key;
|
||||||
use bdk::keys::KeyError::InvalidNetwork;
|
use bdk::keys::KeyError::InvalidNetwork;
|
||||||
|
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
fn get_descriptor_secret_key() -> DescriptorSecretKey {
|
fn get_descriptor_secret_key() -> DescriptorSecretKey {
|
||||||
let mnemonic = Mnemonic::from_string("chaos fabric time speed sponsor all flat solution wisdom trophy crack object robot pave observe combine where aware bench orient secret primary cable detect".to_string()).unwrap();
|
let mnemonic = Mnemonic::from_string("chaos fabric time speed sponsor all flat solution wisdom trophy crack object robot pave observe combine where aware bench orient secret primary cable detect".to_string()).unwrap();
|
||||||
DescriptorSecretKey::new(Network::Testnet, Arc::new(mnemonic), None)
|
DescriptorSecretKey::new(Network::Testnet, Arc::new(mnemonic), None)
|
||||||
|
@ -2,278 +2,38 @@ mod bitcoin;
|
|||||||
mod descriptor;
|
mod descriptor;
|
||||||
mod esplora;
|
mod esplora;
|
||||||
mod keys;
|
mod keys;
|
||||||
|
mod types;
|
||||||
mod wallet;
|
mod wallet;
|
||||||
|
|
||||||
// TODO 6: Why are these imports required?
|
|
||||||
use crate::bitcoin::Address;
|
use crate::bitcoin::Address;
|
||||||
use crate::bitcoin::Network;
|
use crate::bitcoin::Network;
|
||||||
use crate::bitcoin::OutPoint;
|
use crate::bitcoin::OutPoint;
|
||||||
use crate::bitcoin::PartiallySignedTransaction;
|
use crate::bitcoin::PartiallySignedTransaction;
|
||||||
use crate::bitcoin::Script;
|
use crate::bitcoin::Script;
|
||||||
use crate::bitcoin::Transaction;
|
use crate::bitcoin::Transaction;
|
||||||
|
use crate::bitcoin::TxOut;
|
||||||
use crate::descriptor::Descriptor;
|
use crate::descriptor::Descriptor;
|
||||||
use crate::esplora::EsploraClient;
|
use crate::esplora::EsploraClient;
|
||||||
use crate::keys::DerivationPath;
|
use crate::keys::DerivationPath;
|
||||||
use crate::keys::DescriptorPublicKey;
|
use crate::keys::DescriptorPublicKey;
|
||||||
use crate::keys::DescriptorSecretKey;
|
use crate::keys::DescriptorSecretKey;
|
||||||
use crate::keys::Mnemonic;
|
use crate::keys::Mnemonic;
|
||||||
|
use crate::types::AddressIndex;
|
||||||
|
use crate::types::AddressInfo;
|
||||||
|
use crate::types::Balance;
|
||||||
|
use crate::types::LocalUtxo;
|
||||||
|
use crate::types::ScriptAmount;
|
||||||
use crate::wallet::TxBuilder;
|
use crate::wallet::TxBuilder;
|
||||||
use crate::wallet::Update;
|
use crate::wallet::Update;
|
||||||
use crate::wallet::Wallet;
|
use crate::wallet::Wallet;
|
||||||
|
|
||||||
use bdk::keys::bip39::WordCount;
|
use bdk::keys::bip39::WordCount;
|
||||||
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
||||||
use bdk::wallet::AddressIndex as BdkAddressIndex;
|
|
||||||
use bdk::wallet::AddressInfo as BdkAddressInfo;
|
|
||||||
use bdk::wallet::Balance as BdkBalance;
|
|
||||||
use bdk::Error as BdkError;
|
use bdk::Error as BdkError;
|
||||||
use bdk::KeychainKind;
|
use bdk::KeychainKind;
|
||||||
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
uniffi::include_scaffolding!("bdk");
|
uniffi::include_scaffolding!("bdk");
|
||||||
|
|
||||||
/// A output script and an amount of satoshis.
|
|
||||||
pub struct ScriptAmount {
|
|
||||||
pub script: Arc<Script>,
|
|
||||||
pub amount: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A derived address and the index it was found at.
|
|
||||||
pub struct AddressInfo {
|
|
||||||
/// Child index of this address.
|
|
||||||
pub index: u32,
|
|
||||||
/// Address.
|
|
||||||
pub address: Arc<Address>,
|
|
||||||
/// Type of keychain.
|
|
||||||
pub keychain: KeychainKind,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<BdkAddressInfo> for AddressInfo {
|
|
||||||
fn from(address_info: BdkAddressInfo) -> Self {
|
|
||||||
AddressInfo {
|
|
||||||
index: address_info.index,
|
|
||||||
address: Arc::new(address_info.address.into()),
|
|
||||||
keychain: address_info.keychain,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The address index selection strategy to use to derived an address from the wallet's external
|
|
||||||
/// descriptor.
|
|
||||||
pub enum AddressIndex {
|
|
||||||
/// Return a new address after incrementing the current descriptor index.
|
|
||||||
New,
|
|
||||||
/// Return the address for the current descriptor index if it has not been used in a received
|
|
||||||
/// transaction. Otherwise return a new address as with AddressIndex::New.
|
|
||||||
/// Use with caution, if the wallet has not yet detected an address has been used it could
|
|
||||||
/// return an already used address. This function is primarily meant for situations where the
|
|
||||||
/// caller is untrusted; for example when deriving donation addresses on-demand for a public
|
|
||||||
/// web page.
|
|
||||||
LastUnused,
|
|
||||||
/// Return the address for a specific descriptor index. Does not change the current descriptor
|
|
||||||
/// index used by `AddressIndex::New` and `AddressIndex::LastUsed`.
|
|
||||||
/// Use with caution, if an index is given that is less than the current descriptor index
|
|
||||||
/// then the returned address may have already been used.
|
|
||||||
Peek { index: u32 },
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AddressIndex> for BdkAddressIndex {
|
|
||||||
fn from(address_index: AddressIndex) -> Self {
|
|
||||||
match address_index {
|
|
||||||
AddressIndex::New => BdkAddressIndex::New,
|
|
||||||
AddressIndex::LastUnused => BdkAddressIndex::LastUnused,
|
|
||||||
AddressIndex::Peek { index } => BdkAddressIndex::Peek(index),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO 9: Peek is not correctly implemented
|
|
||||||
impl From<&AddressIndex> for BdkAddressIndex {
|
|
||||||
fn from(address_index: &AddressIndex) -> Self {
|
|
||||||
match address_index {
|
|
||||||
AddressIndex::New => BdkAddressIndex::New,
|
|
||||||
AddressIndex::LastUnused => BdkAddressIndex::LastUnused,
|
|
||||||
AddressIndex::Peek { index } => BdkAddressIndex::Peek(*index),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<BdkAddressIndex> for AddressIndex {
|
|
||||||
fn from(address_index: BdkAddressIndex) -> Self {
|
|
||||||
match address_index {
|
|
||||||
BdkAddressIndex::New => AddressIndex::New,
|
|
||||||
BdkAddressIndex::LastUnused => AddressIndex::LastUnused,
|
|
||||||
_ => panic!("Mmmm not working"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<&BdkAddressIndex> for AddressIndex {
|
|
||||||
fn from(address_index: &BdkAddressIndex) -> Self {
|
|
||||||
match address_index {
|
|
||||||
BdkAddressIndex::New => AddressIndex::New,
|
|
||||||
BdkAddressIndex::LastUnused => AddressIndex::LastUnused,
|
|
||||||
_ => panic!("Mmmm not working"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /// A wallet transaction
|
|
||||||
// #[derive(Debug, Clone, PartialEq, Eq, Default)]
|
|
||||||
// pub struct TransactionDetails {
|
|
||||||
// pub transaction: Option<Arc<Transaction>>,
|
|
||||||
// /// Transaction id.
|
|
||||||
// pub txid: String,
|
|
||||||
// /// Received value (sats)
|
|
||||||
// /// Sum of owned outputs of this transaction.
|
|
||||||
// pub received: u64,
|
|
||||||
// /// Sent value (sats)
|
|
||||||
// /// Sum of owned inputs of this transaction.
|
|
||||||
// pub sent: u64,
|
|
||||||
// /// Fee value (sats) if confirmed.
|
|
||||||
// /// The availability of the fee depends on the backend. It's never None with an Electrum
|
|
||||||
// /// Server backend, but it could be None with a Bitcoin RPC node without txindex that receive
|
|
||||||
// /// funds while offline.
|
|
||||||
// pub fee: Option<u64>,
|
|
||||||
// /// If the transaction is confirmed, contains height and timestamp of the block containing the
|
|
||||||
// /// transaction, unconfirmed transaction contains `None`.
|
|
||||||
// pub confirmation_time: Option<BlockTime>,
|
|
||||||
// }
|
|
||||||
|
|
||||||
//
|
|
||||||
// impl From<BdkTransactionDetails> for TransactionDetails {
|
|
||||||
// fn from(tx_details: BdkTransactionDetails) -> Self {
|
|
||||||
// let optional_tx: Option<Arc<Transaction>> =
|
|
||||||
// tx_details.transaction.map(|tx| Arc::new(tx.into()));
|
|
||||||
//
|
|
||||||
// TransactionDetails {
|
|
||||||
// transaction: optional_tx,
|
|
||||||
// fee: tx_details.fee,
|
|
||||||
// txid: tx_details.txid.to_string(),
|
|
||||||
// received: tx_details.received,
|
|
||||||
// sent: tx_details.sent,
|
|
||||||
// confirmation_time: tx_details.confirmation_time,
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// A reference to a transaction output.
|
|
||||||
// #[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
|
||||||
// pub struct OutPoint {
|
|
||||||
// /// The referenced transaction's txid.
|
|
||||||
// txid: String,
|
|
||||||
// /// The index of the referenced output in its transaction's vout.
|
|
||||||
// vout: u32,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// impl From<&OutPoint> for BdkOutPoint {
|
|
||||||
// fn from(outpoint: &OutPoint) -> Self {
|
|
||||||
// BdkOutPoint {
|
|
||||||
// txid: Txid::from_str(&outpoint.txid).unwrap(),
|
|
||||||
// vout: outpoint.vout,
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub struct Balance {
|
|
||||||
// All coinbase outputs not yet matured
|
|
||||||
pub immature: u64,
|
|
||||||
/// Unconfirmed UTXOs generated by a wallet tx
|
|
||||||
pub trusted_pending: u64,
|
|
||||||
/// Unconfirmed UTXOs received from an external wallet
|
|
||||||
pub untrusted_pending: u64,
|
|
||||||
/// Confirmed and immediately spendable balance
|
|
||||||
pub confirmed: u64,
|
|
||||||
/// Get sum of trusted_pending and confirmed coins
|
|
||||||
pub trusted_spendable: u64,
|
|
||||||
/// Get the whole balance visible to the wallet
|
|
||||||
pub total: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<BdkBalance> for Balance {
|
|
||||||
fn from(bdk_balance: BdkBalance) -> Self {
|
|
||||||
Balance {
|
|
||||||
immature: bdk_balance.immature,
|
|
||||||
trusted_pending: bdk_balance.trusted_pending,
|
|
||||||
untrusted_pending: bdk_balance.untrusted_pending,
|
|
||||||
confirmed: bdk_balance.confirmed,
|
|
||||||
trusted_spendable: bdk_balance.trusted_spendable(),
|
|
||||||
total: bdk_balance.total(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /// A transaction output, which defines new coins to be created from old ones.
|
|
||||||
// #[derive(Debug, Clone)]
|
|
||||||
// pub struct TxOut {
|
|
||||||
// /// The value of the output, in satoshis.
|
|
||||||
// value: u64,
|
|
||||||
// /// The address of the output.
|
|
||||||
// script_pubkey: Arc<Script>,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// impl From<&BdkTxOut> for TxOut {
|
|
||||||
// fn from(tx_out: &BdkTxOut) -> Self {
|
|
||||||
// TxOut {
|
|
||||||
// value: tx_out.value,
|
|
||||||
// script_pubkey: Arc::new(Script {
|
|
||||||
// inner: tx_out.script_pubkey.clone(),
|
|
||||||
// }),
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pub struct LocalUtxo {
|
|
||||||
// outpoint: OutPoint,
|
|
||||||
// txout: TxOut,
|
|
||||||
// keychain: KeychainKind,
|
|
||||||
// is_spent: bool,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// impl From<BdkLocalUtxo> for LocalUtxo {
|
|
||||||
// fn from(local_utxo: BdkLocalUtxo) -> Self {
|
|
||||||
// LocalUtxo {
|
|
||||||
// outpoint: OutPoint {
|
|
||||||
// txid: local_utxo.outpoint.txid.to_string(),
|
|
||||||
// vout: local_utxo.outpoint.vout,
|
|
||||||
// },
|
|
||||||
// txout: TxOut {
|
|
||||||
// value: local_utxo.txout.value,
|
|
||||||
// script_pubkey: Arc::new(Script {
|
|
||||||
// inner: local_utxo.txout.script_pubkey,
|
|
||||||
// }),
|
|
||||||
// },
|
|
||||||
// keychain: local_utxo.keychain,
|
|
||||||
// is_spent: local_utxo.is_spent,
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// Trait that logs at level INFO every update received (if any).
|
|
||||||
// pub trait Progress: Send + Sync + 'static {
|
|
||||||
// /// Send a new progress update. The progress value should be in the range 0.0 - 100.0, and the message value is an
|
|
||||||
// /// optional text message that can be displayed to the user.
|
|
||||||
// fn update(&self, progress: f32, message: Option<String>);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// struct ProgressHolder {
|
|
||||||
// progress: Box<dyn Progress>,
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// impl BdkProgress for ProgressHolder {
|
|
||||||
// fn update(&self, progress: f32, message: Option<String>) -> Result<(), BdkError> {
|
|
||||||
// self.progress.update(progress, message);
|
|
||||||
// Ok(())
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// impl Debug for ProgressHolder {
|
|
||||||
// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
// f.debug_struct("ProgressHolder").finish_non_exhaustive()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[derive(Debug, Clone)]
|
// #[derive(Debug, Clone)]
|
||||||
// pub struct TxIn {
|
// pub struct TxIn {
|
||||||
// pub previous_output: OutPoint,
|
// pub previous_output: OutPoint,
|
||||||
@ -314,18 +74,6 @@ impl From<BdkBalance> for Balance {
|
|||||||
// },
|
// },
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// impl From<BdkScript> for Script {
|
|
||||||
// fn from(bdk_script: BdkScript) -> Self {
|
|
||||||
// Script { inner: bdk_script }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[derive(Clone, Debug)]
|
|
||||||
// enum RbfValue {
|
|
||||||
// Default,
|
|
||||||
// Value(u32),
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /// The result after calling the TxBuilder finish() function. Contains unsigned PSBT and
|
// /// The result after calling the TxBuilder finish() function. Contains unsigned PSBT and
|
||||||
// /// transaction details.
|
// /// transaction details.
|
||||||
// pub struct TxBuilderResult {
|
// pub struct TxBuilderResult {
|
||||||
|
148
bdk-ffi/src/types.rs
Normal file
148
bdk-ffi/src/types.rs
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
use crate::bitcoin::{Address, OutPoint, Script, TxOut};
|
||||||
|
|
||||||
|
use bdk::wallet::AddressIndex as BdkAddressIndex;
|
||||||
|
use bdk::wallet::AddressInfo as BdkAddressInfo;
|
||||||
|
use bdk::wallet::Balance as BdkBalance;
|
||||||
|
use bdk::KeychainKind;
|
||||||
|
|
||||||
|
use bdk::LocalUtxo as BdkLocalUtxo;
|
||||||
|
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
/// A output script and an amount of satoshis.
|
||||||
|
pub struct ScriptAmount {
|
||||||
|
pub script: Arc<Script>,
|
||||||
|
pub amount: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A derived address and the index it was found at.
|
||||||
|
pub struct AddressInfo {
|
||||||
|
/// Child index of this address.
|
||||||
|
pub index: u32,
|
||||||
|
/// Address.
|
||||||
|
pub address: Arc<Address>,
|
||||||
|
/// Type of keychain.
|
||||||
|
pub keychain: KeychainKind,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BdkAddressInfo> for AddressInfo {
|
||||||
|
fn from(address_info: BdkAddressInfo) -> Self {
|
||||||
|
AddressInfo {
|
||||||
|
index: address_info.index,
|
||||||
|
address: Arc::new(address_info.address.into()),
|
||||||
|
keychain: address_info.keychain,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The address index selection strategy to use to derived an address from the wallet's external
|
||||||
|
/// descriptor.
|
||||||
|
pub enum AddressIndex {
|
||||||
|
/// Return a new address after incrementing the current descriptor index.
|
||||||
|
New,
|
||||||
|
/// Return the address for the current descriptor index if it has not been used in a received
|
||||||
|
/// transaction. Otherwise return a new address as with AddressIndex::New.
|
||||||
|
/// Use with caution, if the wallet has not yet detected an address has been used it could
|
||||||
|
/// return an already used address. This function is primarily meant for situations where the
|
||||||
|
/// caller is untrusted; for example when deriving donation addresses on-demand for a public
|
||||||
|
/// web page.
|
||||||
|
LastUnused,
|
||||||
|
/// Return the address for a specific descriptor index. Does not change the current descriptor
|
||||||
|
/// index used by `AddressIndex::New` and `AddressIndex::LastUsed`.
|
||||||
|
/// Use with caution, if an index is given that is less than the current descriptor index
|
||||||
|
/// then the returned address may have already been used.
|
||||||
|
Peek { index: u32 },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<AddressIndex> for BdkAddressIndex {
|
||||||
|
fn from(address_index: AddressIndex) -> Self {
|
||||||
|
match address_index {
|
||||||
|
AddressIndex::New => BdkAddressIndex::New,
|
||||||
|
AddressIndex::LastUnused => BdkAddressIndex::LastUnused,
|
||||||
|
AddressIndex::Peek { index } => BdkAddressIndex::Peek(index),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BdkAddressIndex> for AddressIndex {
|
||||||
|
fn from(address_index: BdkAddressIndex) -> Self {
|
||||||
|
match address_index {
|
||||||
|
BdkAddressIndex::New => AddressIndex::New,
|
||||||
|
BdkAddressIndex::LastUnused => AddressIndex::LastUnused,
|
||||||
|
_ => panic!("Mmmm not working"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO 9: Peek is not correctly implemented
|
||||||
|
impl From<&AddressIndex> for BdkAddressIndex {
|
||||||
|
fn from(address_index: &AddressIndex) -> Self {
|
||||||
|
match address_index {
|
||||||
|
AddressIndex::New => BdkAddressIndex::New,
|
||||||
|
AddressIndex::LastUnused => BdkAddressIndex::LastUnused,
|
||||||
|
AddressIndex::Peek { index } => BdkAddressIndex::Peek(*index),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&BdkAddressIndex> for AddressIndex {
|
||||||
|
fn from(address_index: &BdkAddressIndex) -> Self {
|
||||||
|
match address_index {
|
||||||
|
BdkAddressIndex::New => AddressIndex::New,
|
||||||
|
BdkAddressIndex::LastUnused => AddressIndex::LastUnused,
|
||||||
|
_ => panic!("Mmmm not working"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Balance {
|
||||||
|
// All coinbase outputs not yet matured
|
||||||
|
pub immature: u64,
|
||||||
|
/// Unconfirmed UTXOs generated by a wallet tx
|
||||||
|
pub trusted_pending: u64,
|
||||||
|
/// Unconfirmed UTXOs received from an external wallet
|
||||||
|
pub untrusted_pending: u64,
|
||||||
|
/// Confirmed and immediately spendable balance
|
||||||
|
pub confirmed: u64,
|
||||||
|
/// Get sum of trusted_pending and confirmed coins
|
||||||
|
pub trusted_spendable: u64,
|
||||||
|
/// Get the whole balance visible to the wallet
|
||||||
|
pub total: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BdkBalance> for Balance {
|
||||||
|
fn from(bdk_balance: BdkBalance) -> Self {
|
||||||
|
Balance {
|
||||||
|
immature: bdk_balance.immature,
|
||||||
|
trusted_pending: bdk_balance.trusted_pending,
|
||||||
|
untrusted_pending: bdk_balance.untrusted_pending,
|
||||||
|
confirmed: bdk_balance.confirmed,
|
||||||
|
trusted_spendable: bdk_balance.trusted_spendable(),
|
||||||
|
total: bdk_balance.total(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct LocalUtxo {
|
||||||
|
pub outpoint: OutPoint,
|
||||||
|
pub txout: TxOut,
|
||||||
|
pub keychain: KeychainKind,
|
||||||
|
pub is_spent: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<BdkLocalUtxo> for LocalUtxo {
|
||||||
|
fn from(local_utxo: BdkLocalUtxo) -> Self {
|
||||||
|
LocalUtxo {
|
||||||
|
outpoint: OutPoint {
|
||||||
|
txid: local_utxo.outpoint.txid.to_string(),
|
||||||
|
vout: local_utxo.outpoint.vout,
|
||||||
|
},
|
||||||
|
txout: TxOut {
|
||||||
|
value: local_utxo.txout.value,
|
||||||
|
script_pubkey: Arc::new(Script(local_utxo.txout.script_pubkey)),
|
||||||
|
},
|
||||||
|
keychain: local_utxo.keychain,
|
||||||
|
is_spent: local_utxo.is_spent,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,9 @@
|
|||||||
use crate::bitcoin::{OutPoint, PartiallySignedTransaction};
|
use crate::bitcoin::{OutPoint, PartiallySignedTransaction};
|
||||||
use crate::descriptor::Descriptor;
|
use crate::descriptor::Descriptor;
|
||||||
use crate::{AddressIndex, AddressInfo, Network, ScriptAmount};
|
use crate::types::Balance;
|
||||||
use crate::{Balance, Script};
|
use crate::types::ScriptAmount;
|
||||||
|
use crate::Script;
|
||||||
|
use crate::{AddressIndex, AddressInfo, Network};
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
use bdk::bitcoin::blockdata::script::ScriptBuf as BdkScriptBuf;
|
||||||
@ -11,6 +13,7 @@ use bdk::{Error as BdkError, FeeRate};
|
|||||||
use bdk::{SignOptions, Wallet as BdkWallet};
|
use bdk::{SignOptions, Wallet as BdkWallet};
|
||||||
|
|
||||||
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
use bdk::wallet::tx_builder::ChangeSpendPolicy;
|
||||||
|
|
||||||
use std::sync::{Arc, Mutex, MutexGuard};
|
use std::sync::{Arc, Mutex, MutexGuard};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -609,6 +612,12 @@ impl TxBuilder {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// #[derive(Clone, Debug)]
|
||||||
|
// enum RbfValue {
|
||||||
|
// Default,
|
||||||
|
// Value(u32),
|
||||||
|
// }
|
||||||
|
|
||||||
// // The goal of these tests to to ensure `bdk-ffi` intermediate code correctly calls `bdk` APIs.
|
// // The goal of these tests to to ensure `bdk-ffi` intermediate code correctly calls `bdk` APIs.
|
||||||
// // These tests should not be used to verify `bdk` behavior that is already tested in the `bdk`
|
// // These tests should not be used to verify `bdk` behavior that is already tested in the `bdk`
|
||||||
// // crate.
|
// // crate.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user