Exploring the bitcoindevkit CLI part 1

Getting Started

There are a few ways to use bdk-cli:

1. Building from source

By cloning the repo, building the library, and calling the resulting executable like so:

git clone https://github.com/bitcoindevkit/bdk-cli.git
cargo run -- wallet --descriptor "wpkh(tpubEBr4i6yk5nf5DAaJpsi9N2pPYBeJ7fZ5Z9rmN4977iYLCGco1VyjB9tvvuvYtfZzjD5A8igzgw3HeWeeKFmanHYqksqZXYXGsw5zjnj7KM9/*)" sync  

The first set of double dashes indicates to cargo that what follows are arguments to send to the executable.

You can keep using bdk-cli this way (with cargo run), or you build from source and install the binaries so as to be able to use bdk-cli directly (as in #2 below). To build/install, use

cargo install --path . --features repl,electrum,esplora

2. Installing the binary directly from crates.io

By installing the binaries directly from crates.io and calling the cli like so:

cargo install bdk-cli
bdk-cli wallet --descriptor "wpkh(tpubEBr4i6yk5nf5DAaJpsi9N2pPYBeJ7fZ5Z9rmN4977iYLCGco1VyjB9tvvuvYtfZzjD5A8igzgw3HeWeeKFmanHYqksqZXYXGsw5zjnj7KM9/*)" sync  

3. REPL

By entering the repl like this:

cargo install bdk-cli
bdk-cli repl --descriptor "wpkh(tpubEBr4i6yk5nf5DAaJpsi9N2pPYBeJ7fZ5Z9rmN4977iYLCGco1VyjB9tvvuvYtfZzjD5A8igzgw3HeWeeKFmanHYqksqZXYXGsw5zjnj7KM9/*)"  

The repl allows you to set the descriptor once and enter a read-eval-print-loop, where the cli tool will allow you to enter as many subcommands as you wish until you break out of the loop. It looks something like this:

bdk-cli repl --descriptor "wpkh(tpubEBr4i6yk5nf5DAaJpsi9N2pPYBeJ7fZ5Z9rmN4977iYLCGco1VyjB9tvvuvYtfZzjD5A8igzgw3HeWeeKFmanHYqksqZXYXGsw5zjnj7KM9/*)"  

>> sync
{}

>> list_transactions
[
  {
    "fees": 205,
    "height": 1903506,
    "received": 1580,
    "sent": 0,
    "timestamp": 1610371954,
    "transaction": null,
    "txid": "5a583f5f41eff6009a36bc0ad7fcbec494ac7f0719707dd4dd0f8fddbb3e0b26"
  }
]

>> get_new_address
{
  "address": "tb1q4er7kxx6sssz3q7qp7zsqsdx4erceahhax77d7"
}

Basic Workflow

The basic workflow of bdk-cli looks like this:

  1. If you are using the cli, you provide a descriptor every time, followed by a subcommand
bdk-cli wallet --descriptor "wpkh(tprv8Z...fQtF/84'/1'/0'/0/*)" sync
bdk-cli wallet --descriptor "wpkh(tprv8Z...fQtF/84'/1'/0'/0/*)" list_transactions
bdk-cli wallet --descriptor "wpkh(tprv8Z...fQtF/84'/1'/0'/0/*)" get_new_address
  1. If you are using the repl, you provide a descriptor once (when entering the repl), and then as many subcommands as you want until you exit (but these subcommands can only apply to that one descriptor):
bdk-cli repl --descriptor "wpkh(tprv8Z...fQtF/84'/1'/0'/0/*)"
>> sync
>> list_transactions
>> get_new_address

Using the Manual Pages

You can get information about how to use bdk-cli by using

# cli
bdk-cli --help

# repl
>> help

You can also get additional information on specific commands and subcommands by adding them to the help subcommand like so:

# cli
bdk-cli help list_transactions
bdk-cli help key generate

# repl
>> help list_transactions

or by using the --help or -h flag on any command and subcommand:

bdk-cli key --help
bdk-cli key restore --help

Map of Subcommands

The whole tree of subcommands for bdk-cli can be mapped like so:

bdk-cli ---| help
           | repl
           | key ------| help
                       | generate
                       | restore
                       | derive
           | wallet ---| help
                       | broadcast
                       | bump_fee
                       | combine_psbt
                       | create_tx
                       | extract_psbt
                       | finalize_psbt
                       | get_balance
                       | get_new_address
                       | list_transactions
                       | list_unspent
                       | policies
                       | public_descriptor
                       | sign
                       | sync