- Add the ability to specify which leaves to sign in a taproot transaction through `TapLeavesOptions` in `SignOptions`
- Add the ability to specify whether a taproot transaction should be signed using the internal key or not, using `sign_with_tap_internal_key` in `SignOptions`
- Consolidate params `fee_amount` and `amount_needed` in `target_amount` in `CoinSelectionAlgorithm::coin_select` signature.
-- Change the meaning of the `fee_amount` field inside `CoinSelectionResult`: from now on the `fee_amount` will represent only the fees asociated with the utxos in the `selected` field of `CoinSelectionResult`.
+- Change the meaning of the `fee_amount` field inside `CoinSelectionResult`: from now on the `fee_amount` will represent only the fees associated with the utxos in the `selected` field of `CoinSelectionResult`.
- New `RpcBlockchain` implementation with various fixes.
- Return balance in separate categories, namely `confirmed`, `trusted_pending`, `untrusted_pending` & `immature`.
#### Changed
- Simplify the architecture of blockchain traits
- Improve sync
-- Remove unused varaint HeaderParseFail
+- Remove unused variant `HeaderParseFail`
### CLI
#### Added
- Use TXIN_DEFAULT_WEIGHT constant in coin selection
- Replace `must_use` with `required` in coin selection
- Take both spending policies into account in create_tx
-- Check last derivation in cache to avoid recomputation
+- Check last derivation in cache to avoid recomputing
- Use the branch-and-bound cs by default
- Make coin_select return UTXOs instead of TxIns
- Build output lookup inside complete transaction
- Require esplora feature for repl example
#### Security
-- Use dirs-next instead of dirs since the latter is unmantained
+- Use dirs-next instead of dirs since the latter is unmaintained
## [0.1.0-beta.1] - 2020-09-08
Security
--------
-Security is a high priority of BDK; disclosure of security vulnerabilites helps
+Security is a high priority of BDK; disclosure of security vulnerabilities helps
prevent user loss of funds.
Note that BDK is currently considered "pre-production" during this time, there
pub enum NewError<P> {
/// There was problem with the descriptors passed in
Descriptor(crate::descriptor::DescriptorError),
- /// We were unable to load the wallet's data from the persistance backend
+ /// We were unable to load the wallet's data from the persistence backend
Persist(P),
}
match self {
NewError::Descriptor(e) => e.fmt(f),
NewError::Persist(e) => {
- write!(f, "failed to load wallet from persistance backend: {}", e)
+ write!(f, "failed to load wallet from persistence backend: {}", e)
}
}
}
/// Returns a iterators of all the script pubkeys for the `Internal` and External` variants in `KeychainKind`.
///
- /// This is inteded to be used when doing a full scan of your addresses (e.g. after restoring
+ /// This is intended to be used when doing a full scan of your addresses (e.g. after restoring
/// from seed words). You pass the `BTreeMap` of iterators to a blockchain data source (e.g.
- /// electrum server) which will go through each address until it reaches a *stop grap*.
+ /// electrum server) which will go through each address until it reaches a *stop gap*.
///
/// Note carefully that iterators go over **all** script pubkeys on the keychains (not what
/// script pubkeys the wallet is storing internally).
/// Whether the `txout` is considered mature.
///
/// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
- /// method may return false-negatives. In other words, interpretted confirmation count may be
+ /// method may return false-negatives. In other words, interpreted confirmation count may be
/// less than the actual value.
///
/// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
/// Whether the utxo is/was/will be spendable with chain `tip`.
///
- /// This method does not take into account the locktime.
+ /// This method does not take into account the lock time.
///
/// Depending on the implementation of [`confirmation_height_upper_bound`] in [`Anchor`], this
- /// method may return false-negatives. In other words, interpretted confirmation count may be
+ /// method may return false-negatives. In other words, interpreted confirmation count may be
/// less than the actual value.
///
/// [`confirmation_height_upper_bound`]: Anchor::confirmation_height_upper_bound
///
/// Each checkpoint contains the height and hash of a block ([`BlockId`]).
///
-/// Internaly, checkpoints are nodes of a reference-counted linked-list. This allows the caller to
+/// Internally, checkpoints are nodes of a reference-counted linked-list. This allows the caller to
/// cheaply clone a [`CheckPoint`] without copying the whole list and to view the entire chain
/// without holding a lock on [`LocalChain`].
#[derive(Debug, Clone)]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(
f,
- "failed to insert block at height {} as blockhashes conflict: original={}, update={}",
+ "failed to insert block at height {} as block hashes conflict: original={}, update={}",
self.height, self.original_hash, self.update_hash
)
}
prev_orig = curr_orig.take();
// OPTIMIZATION: we have run out of update blocks so we don't need to continue
- // iterating becuase there's no possibility of adding anything to changeset.
+ // iterating because there's no possibility of adding anything to changeset.
if u.is_none() {
break;
}
if o.hash() == u.hash() {
// We have found our point of agreement 🎉 -- we require that the previous (i.e.
// higher because we are iterating backwards) block in the original chain was
- // invalidated (if it exists). This ensures that there is an unambigious point of
+ // invalidated (if it exists). This ensures that there is an unambiguous point of
// connection to the original chain from the update chain (i.e. we know the
// precisely which original blocks are invalid).
if !prev_orig_was_invalidated && !point_of_agreement_found {
}
}
- /// Stage a `changeset` to be commited later with [`commit`].
+ /// Stage a `changeset` to be committed later with [`commit`].
///
/// [`commit`]: Self::commit
pub fn stage(&mut self, changeset: C) {
self.stage.append(changeset)
}
- /// Get the changes that have not been commited yet.
+ /// Get the changes that have not been committed yet.
pub fn staged(&self) -> &C {
&self.stage
}
- /// Commit the staged changes to the underlying persistance backend.
+ /// Commit the staged changes to the underlying persistence backend.
///
/// Changes that are committed (if any) are returned.
///
# BDK Esplora
-BDK Esplora extends [`esplora_client`](crate::esplora_client) to update [`bdk_chain`] structures
+BDK Esplora extends [`esplora-client`] to update [`bdk_chain`] structures
from an Esplora server.
## Usage
```
For full examples, refer to [`example-crates/wallet_esplora`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora) (blocking) and [`example-crates/wallet_esplora_async`](https://github.com/bitcoindevkit/bdk/tree/master/example-crates/wallet_esplora_async).
+
+[`esplora-client`]: https://docs.rs/esplora-client/
+[`bdk_chain`]: https://docs.rs/bdk-chain/
// the updated hash (block hash at this height after the update), can either be:
// 1. a block that already existed in `fetched_blocks`
- // 2. a block that exists locally and atleast has a depth of ASSUME_FINAL_DEPTH
+ // 2. a block that exists locally and at least has a depth of ASSUME_FINAL_DEPTH
// 3. otherwise we can freshly fetch the block from remote, which is safe as it
// is guaranteed that this would be at or below ASSUME_FINAL_DEPTH from the
// remote tip
let first_new_height = *fetched_blocks
.keys()
.next()
- .expect("must have atleast one new block");
+ .expect("must have at least one new block");
if first_new_height >= local_block.height {
break;
}
let (&height, &hash) = fetched_blocks
.iter()
.next()
- .expect("must have atleast one new block");
+ .expect("must have at least one new block");
CheckPoint::new(BlockId { height, hash })
}
};
// the updated hash (block hash at this height after the update), can either be:
// 1. a block that already existed in `fetched_blocks`
- // 2. a block that exists locally and atleast has a depth of ASSUME_FINAL_DEPTH
+ // 2. a block that exists locally and at least has a depth of ASSUME_FINAL_DEPTH
// 3. otherwise we can freshly fetch the block from remote, which is safe as it
// is guaranteed that this would be at or below ASSUME_FINAL_DEPTH from the
// remote tip
let first_new_height = *fetched_blocks
.keys()
.next()
- .expect("must have atleast one new block");
+ .expect("must have at least one new block");
if first_new_height >= local_block.height {
break;
}
let (&height, &hash) = fetched_blocks
.iter()
.next()
- .expect("must have atleast one new block");
+ .expect("must have at least one new block");
CheckPoint::new(BlockId { height, hash })
}
};
This is a directory for crates that are experimental and have not been released yet.
Keep in mind that they may never be released.
-Things in `/example-crates` may use them to demonsrate how things might look in the future.
+Things in `/example-crates` may use them to demonstrate how things might look in the future.
impl<Ak> TemplateItem<Ak> {
pub fn expected_size(&self) -> usize {
match self {
- TemplateItem::Sign { .. } => 64, /* size of sig TODO: take into consideration sighash falg */
+ TemplateItem::Sign { .. } => 64, /* size of sig TODO: take into consideration sighash flag */
TemplateItem::Pk { .. } => 32,
TemplateItem::One => varint_len(1),
TemplateItem::Zero => 0, /* zero means an empty witness element */