Skip to main content

Overview

The BitcoinModule provides native Bitcoin operations including message signing, PSBT signing, sending Bitcoin, and balance queries. Access it via DynamicSDK.instance.bitcoin.

Prerequisites

Get Balance

Query the Bitcoin balance (in satoshis) for a wallet.
final sdk = DynamicSDK.instance;
final wallet = sdk.wallets.userWallets.first;

final balance = await sdk.bitcoin.getBalance(
  walletId: wallet.id,
);
print('Balance: $balance satoshis');

Sign a Message

Sign a message using the connected Bitcoin wallet. Supports optional protocol and addressType parameters.
final signature = await sdk.bitcoin.signMessage(
  walletId: wallet.id,
  message: 'Hello, Bitcoin!',
);
print('Signature: $signature');

With Protocol and Address Type

// Using BIP-322 simple protocol with payment address
final signature = await sdk.bitcoin.signMessage(
  walletId: wallet.id,
  message: 'Hello, Bitcoin!',
  protocol: 'bip322-simple', // or 'ecdsa'
  addressType: 'payment',     // or 'ordinals'
);
ParameterTypeDescription
walletIdStringThe wallet ID to sign with
messageStringThe message to sign
protocolString?Signing protocol: ecdsa or bip322-simple
addressTypeString?Address type: payment or ordinals

Send Bitcoin

Send Bitcoin to a recipient address. The amount is specified in satoshis.
final txId = await sdk.bitcoin.sendBitcoin(
  walletId: wallet.id,
  recipientAddress: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',
  amount: '10000', // in satoshis
  feePriority: 'medium', // optional: 'high', 'medium', or 'low'
);
print('Transaction ID: $txId');
ParameterTypeDescription
walletIdStringThe wallet ID to send from
recipientAddressStringThe recipient Bitcoin address
amountStringAmount in satoshis
feePriorityString?Fee priority: high, medium, or low

Build a PSBT

Build an unsigned Partially Signed Bitcoin Transaction (PSBT) without broadcasting it.
final unsignedPsbt = await sdk.bitcoin.buildPsbt(
  walletId: wallet.id,
  recipientAddress: 'bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh',
  amount: '10000',
  feePriority: 'medium',
);
print('Unsigned PSBT (base64): $unsignedPsbt');

Sign a PSBT

Sign a PSBT using the connected wallet.
final signedPsbt = await sdk.bitcoin.signPsbt(
  walletId: wallet.id,
  request: {
    'unsignedPsbtBase64': unsignedPsbt,
  },
);
print('Signed PSBT: $signedPsbt');

Sign Multiple PSBTs

Batch-sign multiple PSBTs in a single call.
final signedPsbts = await sdk.bitcoin.signPsbts(
  walletId: wallet.id,
  requests: [
    {'unsignedPsbtBase64': psbt1},
    {'unsignedPsbtBase64': psbt2},
  ],
);
print('Signed ${signedPsbts.length} PSBTs');

Send Raw Transaction

Broadcast a raw transaction hex to the Bitcoin network.
final txId = await sdk.bitcoin.sendRawTransaction(
  walletId: wallet.id,
  rawTransaction: '0200000001...', // raw tx hex
);
print('Transaction ID: $txId');

Complete Example

import 'package:dynamic_sdk/dynamic_sdk.dart';

Future<void> bitcoinExample() async {
  final sdk = DynamicSDK.instance;
  final wallet = sdk.wallets.userWallets.first;

  // Check balance
  final balance = await sdk.bitcoin.getBalance(walletId: wallet.id);
  print('Balance: $balance satoshis');

  // Sign a message
  final signature = await sdk.bitcoin.signMessage(
    walletId: wallet.id,
    message: 'Verify wallet ownership',
  );
  print('Signature: $signature');

  // Build and sign a PSBT
  final unsignedPsbt = await sdk.bitcoin.buildPsbt(
    walletId: wallet.id,
    recipientAddress: 'bc1q...',
    amount: '5000',
  );

  final signedPsbt = await sdk.bitcoin.signPsbt(
    walletId: wallet.id,
    request: {'unsignedPsbtBase64': unsignedPsbt},
  );
  print('Signed PSBT: $signedPsbt');

  // Or send directly
  final txId = await sdk.bitcoin.sendBitcoin(
    walletId: wallet.id,
    recipientAddress: 'bc1q...',
    amount: '5000',
    feePriority: 'medium',
  );
  print('Sent! TX: $txId');
}

API Reference

MethodReturnsDescription
getBalanceFuture<String>Get wallet balance in satoshis
signMessageFuture<String>Sign a message
sendBitcoinFuture<String>Send BTC, returns transaction ID
buildPsbtFuture<String>Build unsigned PSBT (base64)
signPsbtFuture<String>Sign a single PSBT
signPsbtsFuture<List<String>>Sign multiple PSBTs
sendRawTransactionFuture<String>Broadcast raw transaction hex

Next Steps