bitbox-api 0.12.0

A library to interact with BitBox hardware wallets
Documentation
// SPDX-License-Identifier: Apache-2.0

use bitbox_api::pb;

async fn signtx<R: bitbox_api::runtime::Runtime>() {
    let noise_config = Box::new(bitbox_api::NoiseConfigNoCache {});
    let bitbox = bitbox_api::BitBox::<R>::from_hid_device(
        bitbox_api::usb::get_any_bitbox02().unwrap(),
        noise_config,
    )
    .await
    .unwrap();
    let pairing_bitbox = bitbox.unlock_and_pair().await.unwrap();
    if let Some(pairing_code) = pairing_bitbox.get_pairing_code().as_ref() {
        println!("Pairing code\n{pairing_code}");
    }
    let paired_bitbox = pairing_bitbox.wait_confirm().await.unwrap();

    let prevtx = bitbox_api::btc::PrevTx {
        version: 1,
        inputs: vec![bitbox_api::btc::PrevTxInput {
            prev_out_hash: vec![b'1'; 32],
            prev_out_index: 0,
            signature_script: b"some signature script".to_vec(),
            sequence: 0xFFFFFFFF,
        }],
        outputs: vec![bitbox_api::btc::PrevTxOutput {
            value: 60005000,
            pubkey_script: b"some pubkey script".to_vec(),
        }],
        locktime: 0,
    };
    let transaction = bitbox_api::btc::Transaction {
        script_configs: vec![
            pb::BtcScriptConfigWithKeypath {
                script_config: Some(bitbox_api::btc::make_script_config_simple(
                    pb::btc_script_config::SimpleType::P2wpkh,
                )),
                keypath: bitbox_api::Keypath::try_from("m/84'/0'/0'")
                    .unwrap()
                    .to_vec(),
            },
            pb::BtcScriptConfigWithKeypath {
                script_config: Some(bitbox_api::btc::make_script_config_simple(
                    pb::btc_script_config::SimpleType::P2wpkhP2sh,
                )),
                keypath: bitbox_api::Keypath::try_from("m/49'/0'/0'")
                    .unwrap()
                    .to_vec(),
            },
        ],
        version: 1,
        inputs: vec![
            bitbox_api::btc::TxInput {
                prev_out_hash: hex::decode(
                    "c58b7e3f1200e0c0ec9a5e81e925baface2cc1d4715514f2d8205be2508b48ee",
                )
                .unwrap(),
                prev_out_index: 0,
                prev_out_value: 60005000,
                sequence: 0xFFFFFFFF,
                keypath: "m/84'/0'/0'/0/0".try_into().unwrap(),
                script_config_index: 0,
                prev_tx: Some(prevtx.clone()),
            },
            bitbox_api::btc::TxInput {
                prev_out_hash: hex::decode(
                    "c58b7e3f1200e0c0ec9a5e81e925baface2cc1d4715514f2d8205be2508b48ee",
                )
                .unwrap(),
                prev_out_index: 0,
                prev_out_value: 60005000,
                sequence: 0xFFFFFFFF,
                keypath: "m/49'/0'/0'/0/1".try_into().unwrap(),
                script_config_index: 1,
                prev_tx: Some(prevtx.clone()),
            },
        ],
        outputs: vec![
            bitbox_api::btc::TxOutput::Internal(bitbox_api::btc::TxInternalOutput {
                keypath: "m/84'/0'/0'/1/0".try_into().unwrap(),
                value: 100000000,
                script_config_index: 0,
            }),
            bitbox_api::btc::TxOutput::External(bitbox_api::btc::TxExternalOutput {
                payload: bitbox_api::btc::Payload {
                    data: vec![1; 32],
                    output_type: pb::BtcOutputType::P2wsh,
                },
                value: 20000000,
            }),
        ],
        locktime: 0,
    };
    let sigs = paired_bitbox
        .btc_sign(
            pb::BtcCoin::Btc,
            &transaction,
            pb::btc_sign_init_request::FormatUnit::Default,
        )
        .await
        .unwrap();
    println!("Sigs:");
    for (i, sig) in sigs.iter().enumerate() {
        println!("Input {}: {}", i, hex::encode(sig));
    }
}

#[tokio::main(flavor = "current_thread")]
async fn main() {
    signtx::<bitbox_api::runtime::TokioRuntime>().await
}