> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Bitcoin

> Sign messages, send Bitcoin, and work with PSBTs using the Dynamic Kotlin SDK.

## Overview

`BitcoinModule` provides native Bitcoin operations: message signing, PSBT signing, sending Bitcoin, building PSBTs, broadcasting raw transactions, and balance queries. Access it via `DynamicSDK.getInstance().bitcoin`.

## Prerequisites

* Dynamic SDK initialized (see [Quickstart](https://docs.dynamic.xyz/docs/kotlin/quickstart.md))
* User authenticated (see [Authentication](https://docs.dynamic.xyz/docs/kotlin/authentication.md))
* Bitcoin enabled in the [Dynamic Console](https://console.dynamic.xyz/dashboard/chains-and-networks#bitcoin)

## Get a Bitcoin Wallet

There are two paths to a Bitcoin wallet: filter the user's existing wallets, or create a new one explicitly.

### Filter existing wallets

If Bitcoin is enabled and the user has a Bitcoin wallet (created automatically at signup), find it via `userWallets`:

```kotlin theme={"system"}
val sdk = DynamicSDK.getInstance()

val btcWallet = sdk.wallets.userWallets.firstOrNull { it.chain == "BTC" }
  ?: error("No Bitcoin wallet found")

println("Bitcoin address: ${btcWallet.address}")
```

### Create a new Bitcoin wallet

Call `createWallet` with `EmbeddedWalletChain.BTC`:

```kotlin theme={"system"}
val wallet = sdk.wallets.embedded.createWallet(chain = EmbeddedWalletChain.BTC)
println("Created: ${wallet.address}")
```

> [!NOTE]
>
> Bitcoin wallets are derived as **Native SegWit** (`bc1q…`) by default. Mainnet is the only network supported today.

## What is a satoshi?

A satoshi is the smallest unit of Bitcoin — `1 BTC = 100,000,000 satoshis`. All amount fields in the Bitcoin module (`sendBitcoin`, `buildPsbt`, `getBalance`) are expressed in satoshis, not BTC.

## What is a PSBT?

A Partially Signed Bitcoin Transaction (PSBT) is a standard for transactions that have not yet been fully signed. It lets different participants with different keys sign a transaction without sharing private keys, enabling safer multi-step or multi-sig flows.

## Get Balance

Query the Bitcoin balance (in satoshis) for a wallet:

```kotlin theme={"system"}
val sdk = DynamicSDK.getInstance()
val wallet = sdk.wallets.userWallets.first { it.chain == "BTC" }

val balance = sdk.bitcoin.getBalance(walletId = wallet.id)
println("Balance: $balance satoshis")
```

## Sign a Message

Sign a message using ECDSA (default) or BIP-322:

```kotlin theme={"system"}
val signature = sdk.bitcoin.signMessage(
  walletId = wallet.id,
  message = "Hello, Bitcoin!"
)
println("Signature: $signature")
```

For BIP-322 signing, pass the `protocol` and optional `addressType`:

```kotlin theme={"system"}
val signature = sdk.bitcoin.signMessage(
  walletId = wallet.id,
  message = "Hello, Bitcoin!",
  protocol = "bip322-simple",
  addressType = "payment"
)
```

## Send Bitcoin

Send BTC to a recipient. Returns the transaction ID.

```kotlin theme={"system"}
val txId = sdk.bitcoin.sendBitcoin(
  walletId = wallet.id,
  recipientAddress = "bc1q...",
  amount = "10000",       // satoshis
  feePriority = "medium"  // optional: "high" | "medium" | "low"
)
println("TX ID: $txId")
```

## Build a PSBT

Build an unsigned PSBT (base64-encoded) you can sign later or hand off to another signer:

```kotlin theme={"system"}
val psbtBase64 = sdk.bitcoin.buildPsbt(
  walletId = wallet.id,
  recipientAddress = "bc1q...",
  amount = "10000",
  feePriority = "medium" // optional
)
```

## Sign PSBTs

Sign a single PSBT, or batch-sign multiple PSBTs:

```kotlin theme={"system"}
// Single
val signed = sdk.bitcoin.signPsbt(
  walletId = wallet.id,
  unsignedPsbtBase64 = psbtBase64
)

// Batch
val signedList = sdk.bitcoin.signPsbts(
  walletId = wallet.id,
  requests = listOf(
    buildJsonObject { put("unsignedPsbtBase64", psbtBase64) }
  )
)
```

## Send a Raw Transaction

Broadcast a pre-signed transaction in hex form:

```kotlin theme={"system"}
val txId = sdk.bitcoin.sendRawTransaction(
  walletId = wallet.id,
  rawTransactionHex = "0200000001..."
)
```

## API Reference

| Method | Returns | Description |
| - | - | - |
| `getBalance` | `String` | Get wallet balance in satoshis |
| `signMessage` | `String` | Sign a message (ECDSA or BIP-322) |
| `sendBitcoin` | `String` | Send BTC, returns transaction ID |
| `buildPsbt` | `String` | Build unsigned PSBT (base64) |
| `signPsbt` | `String` | Sign a single PSBT |
| `signPsbts` | `List<String>` | Sign multiple PSBTs |
| `sendRawTransaction` | `String` | Broadcast a raw transaction hex |

## Next Steps

* [TON Operations](https://docs.dynamic.xyz/docs/kotlin/wallets/ton/overview.md) — TON blockchain operations
* [SUI Operations](https://docs.dynamic.xyz/docs/kotlin/wallets/sui/overview.md) — SUI blockchain operations
* [Token Balances](https://docs.dynamic.xyz/docs/kotlin/wallets/general/token-balances.md) — Multi-chain balance queries


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.