We covered what a wallet in general looks like in the Accessing Wallets section and then what a wallet connector looks like in the Interacting With Wallets section. However, the wallet connector for Bitcoin wallets is a bit different from the EVM wallets, so we will cover that seperately here.

This is because Bitcoin wallets have different capabilities and requirements. For example, Bitcoin wallets can have multiple addresses associated with them, like payment and ordinal addresses.

FieldDescription
getBalance(): Promise<string | undefined>A method to fetch the balance for the connected address
getConnectedAccounts(): Promise<string[]>A method to retrieve the current connected address
getAdditionalAddresses(mainAddress: string): Promise<WalletAdditionalAddress[]>A method to return the payment and ordinals address (if applicable) as an array of objects
name: stringThe wallet name
signMessage(messageToSign: string): Promise<string | undefined>A method to sign a message
sendRawTransaction(rawTransactionHex: string): Promise<string | undefined>This method submits a raw transaction to the bitcoin blockchain and returns the transaction ID as the response
sendBitcoin(BitcoinTransaction): Promise<string | undefined>A method to send an amount of satoshis to a recipient bitcoin address
signPsbt(request: BitcoinSignPsbtRequest):A method to get the smart wallet provider for more advanced usage
isLedgerAddress(address: string): booleanA method for determining if the connected address is a ledger wallet

Type Definitions

type BitcoinSignPsbtRequest = {
  allowedSighash: number[];
  unsignedPsbtBase64: string;
  signature?: {
    address: string;
    signingIndexes: number[] | undefined;
    disableAddressValidation?: boolean; // helpful for multi-sig
  }[];
};

type BitcoinTransaction = {
  amount: bigint;
  recipientAddress: string;
}

type WalletAdditionalAddress {
  address: string;
  publicKey?: string;
  type: 'payment' | 'ordinal';
}

type BitcoinSignPsbtResponse = {
  signedPsbt: Psbt; // see reference below for what a PSBT is
};

What is a satoshi?

This smallest unit allows for transactions involving very small amounts of bitcoin, facilitating microtransactions and improving the granularity of payments in the Bitcoin network.

1 Bitcoin = 100,000,000 Satoshis

What is a PSBT?

A partially signed bitcoin transaction (PSBT) is a standard for transactions that have not fully signed. This allows different participants with different keys/signers to sign a transaction without revealing their private keys to others. Multi-sig wallets utilize these. This allows for a multi-step transaction process which is both safer and more efficient.

Send Bitcoin

In this example, we are going to send bitcoin using the wallet connector.

import { useDynamicContext } from '@dynamic-labs/sdk-react-core';
import { isBitcoinConnector } from '@dynamic-labs/wallet-connector-core';

const SendBitcoinButton = () => {
  const { primaryWallet } = useDynamicContext();

  const sendBitcoin = async () => {
    if (!primaryWallet) return;

    if (!isBitcoinConnector(primaryWallet.connector)) {
      return;
    }

    // The first argument is the address you are sending to, the second argument is the amount of BTC in satoshis
    const transactionId = await primaryWallet.connector.sendBitcoin('<bitcoin payment address>', 1);

    console.log('transactionId', transactionId);
  };

  return <button onClick={sendBitcoin}>Send Bitcoin</button>;
};

Sign a message

In this example, we are going to sign a message using the wallet connector.

import { useDynamicContext } from '@dynamic-labs/sdk-react-core';
import { isBitcoinConnector } from '@dynamic-labs/wallet-connector-core';

const SignMessageButton = () => {
  const { primaryWallet } = useDynamicContext();

  const signMessage = async () => {
    if (!primaryWallet) return;

    if (!isBitcoinConnector(primaryWallet.connector)) {
      return;
    }

    const signature = await primaryWallet.connector.signMessage('example');

    console.log('signature', signature);
  };

  return <button onClick={signMessage}>Sign message</button>;
};

Send a raw transaction to the bitcoin network

In this example, we are going to send a raw transaction as a hex value to the bitcoin network. For information on how to construct the transactionHexString, please refer to this example.

import { useDynamicContext } from '@dynamic-labs/sdk-react-core';
import { isBitcoinConnector } from '@dynamic-labs/wallet-connector-core';

const SendRawTransaction = () => {
  const { primaryWallet } = useDynamicContext();

  const signMessage = async () => {
    if (!primaryWallet) return;

    if (!isBitcoinConnector(primaryWallet.connector)) {
      return;
    }

    const transactionId = await primaryWallet.connector.sendRawTransaction('transactionHexString');

    console.log('transactionId', transactionId);
  };

  return <button onClick={SendRawTransaction}>Send Raw Transaction</button>;
};