From 0899443981f862d230fd9d52d8dc39b9761ab2d4 Mon Sep 17 00:00:00 2001 From: BitcoinZavior Date: Mon, 29 May 2023 20:28:20 -0400 Subject: [PATCH] Minor updates --- docs/tutorials/exploring_bdk_flutter.md | 44 ++++++++---------- .../exploring_bdk_flutter/assets_section.png | Bin 0 -> 21951 bytes 2 files changed, 20 insertions(+), 24 deletions(-) create mode 100644 docs/tutorials/exploring_bdk_flutter/assets_section.png diff --git a/docs/tutorials/exploring_bdk_flutter.md b/docs/tutorials/exploring_bdk_flutter.md index 71919af9c4..bc307152ff 100644 --- a/docs/tutorials/exploring_bdk_flutter.md +++ b/docs/tutorials/exploring_bdk_flutter.md @@ -28,7 +28,7 @@ This tutorial will explore `bdk-flutter` usage and the API it provides. This gui The tutorial will focus on bitcoin concepts and `bdk-flutter` API. So it will gloss over Flutter and Dart. If you are interested in learning more about Flutter and Dart please refer to the Flutter [learning portal](https://flutter.dev/learn). The code for this tutorial is available on the [LtbLightning GitHub](https://github.com/LtbLightning/bdk-flutter-quickstart) - + ### Prerequisites @@ -76,6 +76,9 @@ Paste the following code in your `pubspec.yaml` file, assets section. - assets/ +Please make sure your assets section looks like the screenshot below. +BDK Flutter Quick Start + Once done let's run a `get` command from the pub tool commands, this will get all the required dependencies for our project. ```shell @@ -88,7 +91,7 @@ Under `screens` create a `home.dart` file, this will be where most of the code w Once done the file structure should look like this: - +
Locate `main.dart` in the project root, this will have the default code added by `flutter create`, let's delete all contents of `main.dart` and replace it with the following code to use `home.dart` as our main screen. This will probably crash the app but that's fine, it will be up and running once we add code to `home.dart` in the next few steps @@ -131,7 +134,7 @@ This will add a line like this to your package's `pubspec.yaml` and this will al ```shell dependencies: - bdk_flutter: ^0.3.0 + bdk_flutter: ^0.28.0 ``` ## Configuring @@ -367,7 +370,7 @@ and finally, let's add the component to display the output under ` /* Result */` We should now have a working "Generate Mnemonic" button that displays the new mnemonic - + A quick recap, we added a button to call a click handler (`generateMnemonicHandler`) which calls `generateMnemonic` API of `bdk-flutter`. The click handler also sets the state for the app and also updates the `displayText` variable to display the output of the call in the display section. We will follow this pattern for the remaining calls to `bdk-flutter`. @@ -391,17 +394,9 @@ Just below `/* Balance */` and above `/* Result */` add the following UI compone ```dart /* Balance */ - StyledContainer( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("Balance: ", - style: Theme.of(context).textTheme.headline2), - Text(" ${balance ?? "0"} Sats", - style: Theme.of(context).textTheme.bodyText1), - ], - ) - ), + BalanceContainer( + text: "${balance ?? "0"} Sats", + ), /* Result */ ``` @@ -411,7 +406,7 @@ Just below `/* Balance */` and above `/* Result */` add the following UI compone Let's add some code to create a simple `wpkh` descriptor object by using the `BIP84` template. This template will create a descriptor in the format `wpkh(key/84'/{0,1}'/0'/{0,1}/*)` -This descriptor will create receive (`KeychainKind.External`) and change descriptor (` KeycChainKind.Internal`) for a specified mnemonic. +This descriptor will create receive (`KeyChainKind.External`) and change descriptor (` KeyChainKind.Internal`) for a specified mnemonic. ```dart Future> getDescriptors(String mnemonic) async { @@ -490,7 +485,7 @@ The response returned by `create()` is a `Wallet` object. The App should now be creating a wallet when we click **Create Mnemonic** followed by **Create Wallet**. - + Before going forward, we need to create a `Blockchain` object as well. The Blockchain object will encapsulate the bitcoin node configuration which the wallet will use for syncing blocks and broadcasting transactions. @@ -574,7 +569,7 @@ Let's add two internal functions for syncing UTXOs and compute balance. We should now be able to create a wallet, sync UTXOs, and get the balance - + We can use a public testnet faucet to send testnet coins to the wallet and check that the UTXO sync and balance fetch are working correctly. Before we do that add one more method to generate a new address we can then use this address to get testnet coins from a faucet. @@ -603,7 +598,7 @@ And a **Get Address** button below the existing **Get Balance** button: We should now have the following, and **Get Address** will be able to display a new address. - + Now that we are able to generate a receive address we can get some testnet bitcoin from one of the public [testnet faucets](https://coinfaucet.eu/en/btc-testnet/) @@ -617,7 +612,7 @@ This text field below the `Generate Mnemonic` button will also display the mnemo We can now use our mnemonic and use it to restore a wallet. This will come in handy if we have a wallet with testnet bitcoin as these are hard to come by. - + ## Sending bitcoin @@ -669,12 +664,13 @@ Let's make an internal function to send a bitcoin transaction, using `Wallet`, ` final txBuilder = TxBuilder(); final address = await Address.create(address: addressStr); final script = await address.scriptPubKey(); - final psbt = await txBuilder + final txBuilderResult = await txBuilder .addRecipient(script, amount) .feeRate(1.0) .finish(wallet); - final sbt = await wallet.sign(psbt); - await blockchain.broadcast(sbt); + final sbt = await wallet.sign(psbt: txBuilderResult.psbt); + final tx = await sbt.extractTx(); + await blockchain.broadcast(tx); setState(() { displayText = "Successfully broadcast $amount Sats to $addressStr"; }); @@ -754,7 +750,7 @@ Let's add the send transaction section and UI components below `/* Send Transact We should now be able to send a transaction as long as there is sufficient balance. - + ## Conclusion diff --git a/docs/tutorials/exploring_bdk_flutter/assets_section.png b/docs/tutorials/exploring_bdk_flutter/assets_section.png new file mode 100644 index 0000000000000000000000000000000000000000..1795f43021492af886709a31448eb415a5406ec4 GIT binary patch literal 21951 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 literal 0 HcmV?d00001 -- 2.49.0