Bdk Flutter
A Flutter library for the Bitcoin Development Kit .
The bdk library aims to be the core building block for Bitcoin Applications of any kind.
Requirements
Flutter : 3.0 or higher
Android minSdkVersion. : API 23 or higher.
Deployment target : iOS 12.0 or greater.
How to Use
To use the bdk_flutter package in your project, add it as a dependency in your project's pubspec.yaml:
dependencies:
bdk_flutter: ^0.31 .3
Examples
Create a Wallet & sync the balance of a descriptor
import 'package:bdk_flutter/bdk_flutter.dart' ;
final mnemonic = await Mnemonic .create (WordCount .words12);
final descriptorSecretKey = await DescriptorSecretKey .create ( network: Network .testnet,
mnemonic: mnemonic );
final externalDescriptor = await Descriptor .newBip44 ( secretKey: descriptorSecretKey,
network: Network .testnet,
keychain: KeychainKind .externalChain );
final internalDescriptor = await Descriptor .newBip44 ( secretKey: descriptorSecretKey,
network: Network .testnet,
keychain: KeyChainKind .internalChain );
final blockchain = await Blockchain .create ( config: BlockchainConfig .electrum (
config: ElectrumConfig (
stopGap: 10 ,
timeout: 5 ,
retry: 5 ,
url: "ssl://electrum.blockstream.info:60002" )));
final wallet = await Wallet .create ( descriptor: externalDescriptor,
changeDescriptor: internalDescriptor,
network: Network .testnet,
databaseConfig: const DatabaseConfig .memory () );
final _ = await wallet.sync ( blockchain );
Create a public wallet descriptor
import 'package:bdk_flutter/bdk_flutter.dart' ;
final mnemonic = await Mnemonic .create (WordCount .words12);
final descriptorSecretKey = await DescriptorSecretKey .create ( network: Network .testnet,
mnemonic: mnemonic );
final externalDescriptor = await Descriptor .newBip44 ( secretKey: descriptorSecretKey,
network: Network .testnet,
keychain: KeychainKind .externalChain );
final externalPublicDescriptor = await Descriptor .create ( descriptor: externalDescriptor.toString (),
network: Network .testnet);
Get the transaction details
import 'package:bdk_flutter/bdk_flutter.dart' ;
final bdkWallet = .....
final txBuilder = TxBuilder ();
final address = await Address .fromString (s: "mv4rnyY3Su5gjcDNzbMLKBQkBicCtHUtFB" , network: Network .testnet);
final script = address.scriptPubkey ();
final feeRate = await blockchain.estimateFee (target: 25 );
final (psbt, transactionDetails) = await txBuilder.feeRate ( feeRate.satPerVb )
.addRecipient ( script, 2000 )
.finish ( bdkWallet );
final serializedPsbt = psbt.jsonSerialize ();
final jsonObject = json.decode (serializedPsbt);
final outputs = jsonObject['unsigned_tx' ]['output' ] as List ;
final inputs = jsonObject['inputs' ][0 ]['non_witness_utxo' ]['output' ] as List ;
debugPrint ("=========Inputs=====" );
for (var e in inputs) {
debugPrint ("amount: ${e['value' ]} " );
debugPrint ("script_pubkey: ${e['script_pubkey' ]} " );
}
debugPrint ("=========Outputs=====" );
for (var e in outputs) {
debugPrint ("amount: ${e['value' ]} " );
debugPrint ("script_pubkey: ${e['script_pubkey' ]} " );
}
Create an internal and extarnal wallet descriptors from derivation path.
import 'package:bdk_flutter/bdk_flutter.dart' ;
final mnemonic = await Mnemonic .create (WordCount .words12);
final descriptorSecretKey = await DescriptorSecretKey .create (
network: Network .testnet, mnemonic: mnemonic);
final derivationPath = await DerivationPath .create (path: "m/44h/1h/0h/0" );
final descriptorPrivateKey =
descriptorSecretKey.derive (derivationPath);
final Descriptor descriptorPrivate = await Descriptor .create (
descriptor: "pkh(${descriptorPrivateKey.toString()} )" ,
network: Network .testnet,
);
final derivationPathInt =
await DerivationPath .create (path: "m/44h/1h/0h/1" );
final descriptorPrivateKeyInt =
descriptorSecretKey.derive (derivationPathInt);
final Descriptor descriptorPrivateInt = await Descriptor .create (
descriptor: "pkh(${descriptorPrivateKeyInt.toString()} )" ,
network: Network .testnet,
);
final bdkWallet = await Wallet .create (
descriptor: descriptorPrivate,
changeDescriptor: descriptorPrivateInt,
network: Network .testnet,
databaseConfig: const DatabaseConfig .memory (),
);
final address =
bdkWallet.getAddress (addressIndex: const AddressIndex .increase ());
final internalAddress =
bdkWallet.getInternalAddress (addressIndex: const AddressIndex .increase ());
API Documentation
The latest API documentation is available here
Example Projects
*BDK Flutter Demo App: The BDK Flutter Demo App
is a simple bitcoin app built in flutter to serve as a reference app to demonstrate bdk-flutter api usage.
References:
Setting up a local Esplora instance for testing:
https://bitcoin.stackexchange.com/questions/116937/how-do-i-setup-an-esplora-instance-for-local-testing/116938#116938
Thanks for taking a look!