Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add docstrings to Wallet #615

Merged
merged 1 commit into from
Nov 15, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions bdk-ffi/src/bdk.udl
Original file line number Diff line number Diff line change
Expand Up @@ -362,9 +362,13 @@ interface ChangeSet {};
// bdk_wallet crate - wallet module
// ------------------------------------------------------------------------

/// Policy regarding the use of change outputs when creating a transaction
enum ChangeSpendPolicy {
/// Use both change and non-change outputs (default)
"ChangeAllowed",
/// Only use change outputs (see [`TxBuilder::only_spend_change`])
"OnlyChange",
/// Only use non-change outputs
"ChangeForbidden"
};

Expand All @@ -375,64 +379,188 @@ interface Wallet {
[Name=load, Throws=LoadWithPersistError]
constructor(Descriptor descriptor, Descriptor change_descriptor, Connection connection);

/// Informs the wallet that you no longer intend to broadcast a tx that was built from it.
///
/// This frees up the change address used when creating the tx for use in future transactions.
void cancel_tx([ByRef] Transaction tx);

/// The derivation index of this wallet. It will return `None` if it has not derived any addresses.
/// Otherwise, it will return the index of the highest address it has derived.
u32? derivation_index(KeychainKind keychain);

/// Returns the utxo owned by this wallet corresponding to `outpoint` if it exists in the
/// wallet's database.
LocalOutput? get_utxo(OutPoint op);

/// Finds how the wallet derived the script pubkey `spk`.
///
/// Will only return `Some(_)` if the wallet has given out the spk.
KeychainAndIndex? derivation_of_spk(Script spk);

/// Attempt to reveal the next address of the given `keychain`.
///
/// This will increment the keychain's derivation index. If the keychain's descriptor doesn't
/// contain a wildcard or every address is already revealed up to the maximum derivation
/// index defined in [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki),
/// then the last revealed address will be returned.
AddressInfo reveal_next_address(KeychainKind keychain);

/// Peek an address of the given `keychain` at `index` without revealing it.
///
/// For non-wildcard descriptors this returns the same address at every provided index.
///
/// # Panics
///
/// This panics when the caller requests for an address of derivation index greater than the
/// [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) max index.
AddressInfo peek_address(KeychainKind keychain, u32 index);

/// The index of the next address that you would get if you were to ask the wallet for a new address
u32 next_derivation_index(KeychainKind keychain);

/// Get the next unused address for the given `keychain`, i.e. the address with the lowest
/// derivation index that hasn't been used.
///
/// This will attempt to derive and reveal a new address if no newly revealed addresses
/// are available. See also [`reveal_next_address`](Self::reveal_next_address).
///
/// **WARNING**: To avoid address reuse you must persist the changes resulting from one or more
/// calls to this method before closing the wallet. See [`Wallet::reveal_next_address`].
AddressInfo next_unused_address(KeychainKind keychain);

/// Marks an address used of the given `keychain` at `index`.
///
/// Returns whether the given index was present and then removed from the unused set.
boolean mark_used(KeychainKind keychain, u32 index);

/// Reveal addresses up to and including the target `index` and return an iterator
/// of newly revealed addresses.
///
/// If the target `index` is unreachable, we make a best effort to reveal up to the last
/// possible index. If all addresses up to the given `index` are already revealed, then
/// no new addresses are returned.
///
/// **WARNING**: To avoid address reuse you must persist the changes resulting from one or more
/// calls to this method before closing the wallet. See [`Wallet::reveal_next_address`].
sequence<AddressInfo> reveal_addresses_to(KeychainKind keychain, u32 index);

/// List addresses that are revealed but unused.
///
/// Note if the returned iterator is empty you can reveal more addresses
/// by using [`reveal_next_address`](Self::reveal_next_address) or
/// [`reveal_addresses_to`](Self::reveal_addresses_to).
sequence<AddressInfo> list_unused_addresses(KeychainKind keychain);

/// Get the Bitcoin network the wallet is using.
Network network();

/// Return the checksum of the public descriptor associated to `keychain`
///
/// Internally calls [`Self::public_descriptor`] to fetch the right descriptor
string descriptor_checksum(KeychainKind keychain);

/// Return the balance, separated into available, trusted-pending, untrusted-pending and immature
/// values.
Balance balance();

/// Applies an update to the wallet and stages the changes (but does not persist them).
///
/// Usually you create an `update` by interacting with some blockchain data source and inserting
/// transactions related to your wallet into it.
///
/// After applying updates you should persist the staged wallet changes. For an example of how
/// to persist staged wallet changes see [`Wallet::reveal_next_address`].
[Throws=CannotConnectError]
void apply_update(Update update);

/// Return whether or not a `script` is part of this wallet (either internal or external)
boolean is_mine(Script script);

/// Sign a transaction with all the wallet's signers, in the order specified by every signer's
/// [`SignerOrdering`]. This function returns the `Result` type with an encapsulated `bool` that has the value true if the PSBT was finalized, or false otherwise.
///
/// The [`SignOptions`] can be used to tweak the behavior of the software signers, and the way
/// the transaction is finalized at the end. Note that it can't be guaranteed that *every*
/// signers will follow the options, but the "software signers" (WIF keys and `xprv`) defined
/// in this library will.
[Throws=SignerError]
boolean sign(Psbt psbt);

/// Finalize a PSBT, i.e., for each input determine if sufficient data is available to pass
/// validation and construct the respective `scriptSig` or `scriptWitness`. Please refer to
/// [BIP174](https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#Input_Finalizer),
/// and [BIP371](https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki)
/// for further information.
///
/// Returns `true` if the PSBT could be finalized, and `false` otherwise.
///
/// The [`SignOptions`] can be used to tweak the behavior of the finalizer.
[Throws=SignerError]
boolean finalize_psbt(Psbt psbt);

/// Compute the `tx`'s sent and received [`Amount`]s.
///
/// This method returns a tuple `(sent, received)`. Sent is the sum of the txin amounts
/// that spend from previous txouts tracked by this wallet. Received is the summation
/// of this tx's outputs that send to script pubkeys tracked by this wallet.
SentAndReceivedValues sent_and_received([ByRef] Transaction tx);

/// Iterate over the transactions in the wallet.
sequence<CanonicalTx> transactions();

/// Get a single transaction from the wallet as a [`WalletTx`] (if the transaction exists).
///
/// `WalletTx` contains the full transaction alongside meta-data such as:
/// * Blocks that the transaction is [`Anchor`]ed in. These may or may not be blocks that exist
/// in the best chain.
/// * The [`ChainPosition`] of the transaction in the best chain - whether the transaction is
/// confirmed or unconfirmed. If the transaction is confirmed, the anchor which proves the
/// confirmation is provided. If the transaction is unconfirmed, the unix timestamp of when
/// the transaction was last seen in the mempool is provided.
[Throws=TxidParseError]
CanonicalTx? get_tx(string txid);

/// Calculates the fee of a given transaction. Returns [`Amount::ZERO`] if `tx` is a coinbase transaction.
///
/// To calculate the fee for a [`Transaction`] with inputs not owned by this wallet you must
/// manually insert the TxOut(s) into the tx graph using the [`insert_txout`] function.
///
/// Note `tx` does not have to be in the graph for this to work.
[Throws=CalculateFeeError]
Amount calculate_fee([ByRef] Transaction tx);

/// Calculate the [`FeeRate`] for a given transaction.
///
/// To calculate the fee rate for a [`Transaction`] with inputs not owned by this wallet you must
/// manually insert the TxOut(s) into the tx graph using the [`insert_txout`] function.
///
/// Note `tx` does not have to be in the graph for this to work.
[Throws=CalculateFeeError]
FeeRate calculate_fee_rate([ByRef] Transaction tx);

/// Return the list of unspent outputs of this wallet
sequence<LocalOutput> list_unspent();

/// List all relevant outputs (includes both spent and unspent, confirmed and unconfirmed).
///
/// To list only unspent outputs (UTXOs), use [`Wallet::list_unspent`] instead.
sequence<LocalOutput> list_output();

/// Create a [`FullScanRequest] for this wallet.
///
/// This is the first step when performing a spk-based wallet full scan, the returned
/// [`FullScanRequest] collects iterators for the wallet's keychain script pub keys needed to
/// start a blockchain full scan with a spk based blockchain client.
///
/// This operation is generally only used when importing or restoring a previously used wallet
/// in which the list of used scripts is not known.
FullScanRequestBuilder start_full_scan();

/// Create a partial [`SyncRequest`] for this wallet for all revealed spks.
///
/// This is the first step when performing a spk-based wallet partial sync, the returned
/// [`SyncRequest`] collects all revealed script pubkeys from the wallet keychain needed to
/// start a blockchain sync with a spk based blockchain client.
SyncRequestBuilder start_sync_with_revealed_spks();

[Throws=SqliteError]
Expand Down
Loading